Macのデスクトップに保存したQRコードを、カメラ機能を使わずにPython3で直接読み取る

# 環境
>macOS     ventura 13.2
Python    3.10.4
selenium  4.19.0(pip)
pyzbar    0.1.9(pip)
zbar      0.23.93(HomeBrew)

# これを作った理由
>iPhonで読むには文字が小さすぎるので、パソコンで読みたい（もう70才なので小さい文字はどうも・・・）。
でもQRコードを読み込むのはどうすればいい？
iphonでqrコードを読み取ってメールで送る？
iPhonみたいにカメラで写真も撮れないし・・・。
それでは、Macのディレクトリやデスクトップに保存したQRコードを、カメラ機能を使わずにPython3で直接読み取ることは出来ない？
ということでChat-GPTに相談したところ、
Pillowライブラリを使用して画像を読み込み、qrcodeライブラリを使用してQRコードをデコードする方法がある
という事なので相談しながら作ってみました。

# 必要なライブラリの確認
>1, Homebrewに”zbar”が入ってますか？
　入ってなければ：brew install zbar
2, Pythonライブラリの”pyzbar”が入ってますか？
　入ってなければ：python3 -m pip install pillow pyzbar
基本的にはこれだけです。
私の場合上記のインストールをする際に、他にも色々Errorが出ましたが、対応は文末に後述します。

# 完成品はこれです。
>サイトからQRコードのスクリーンショットを撮って、Desktopに貼り付けて実行するだけです。
テキストは「decoded_text.txt」でdesktopに表示されます。
URLはそのサイトが開きます。

```python
from PIL import Image
from pyzbar.pyzbar import decode
import os
import webbrowser
import subprocess

def read_qr_code(image_path):
    # 画像を開く
    img = Image.open(image_path)
    
    # QRコードをデコードする
    decoded_objects = decode(img)
    
    # QRコードが見つからなかった場合の処理
    if not decoded_objects:
        #print(f"No QR code found in {image_path}")
        print(f"これはQRコードではありません。")
        print('-'*50)
        return
    
    # デコードされた情報を抽出する
    for obj in decoded_objects:
        data = obj.data.decode("utf-8")
        print("このQRコードの内容を表示します。")
        print("Type:", obj.type)
        print("Data:", data)
        print("Bounding box:", obj.rect)
        print('-'*50)
        
        # デコードされたデータがURLかどうかを確認する
        if data.startswith("http://") or data.startswith("https://"):
            print(f"Opening URL: {data}")
            webbrowser.open(data)
        else:
            print("Data is not a URL. Displaying in TextEdit.")
            print("データは URL ではありません。TextEdit で表示しています。")
            print('-'*50)
            # デスクトップ上にテキストファイルとしてデータを書き込む
            desktop_path = os.path.expanduser("~/Desktop")
            file_name = "decoded_text.txt"
            file_path = os.path.join(desktop_path, file_name)
            
            with open(file_path, 'a') as file:
                file.write(data + "\n")
            
            # TextEditでテキストファイルを開く
            subprocess.call(["open", "-a", "TextEdit", file_path])
            
if __name__ == "__main__":
    print("QRコードはDesktopに保存されてますか？")
    ans = int(input("Yes : 1, No : 9 \n : "))
    
    if ans == 1:
        # ディレクトリ内のファイルをリストする
        directory = "/Users/yourname/Desktop"  # ここを自分のデスクトップパスに変更してください
        for filename in os.listdir(directory):
            if filename.endswith(".png") or filename.endswith(".jpg"):
                file_path = os.path.join(directory, filename)
                print(f"Reading QR code from {file_path}")
                read_qr_code(file_path)
                
    elif ans == 9:
        print("先にQRコードをDesktopに保存してください。")
        exit()
    else:
        print("1もしくは９を入力してください。")
        exit()

```

# 後述
>1, brewとpipに必要なライブラリがインストールされているか確認しました。　
2, Homebrewに”zbar”が入ってない。当然pipにも”pyzbar”が入ってないので、インストールを始めました。
```python
% brew install zbar
```
なんとエラーが出ました。早速Chat-GPTに確認しました。
![スクリーンショット 2024-06-28 8.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/0e916ec0-9c01-22b0-42eb-f4f8a6bf8f3d.png)
<font color='brown'>エラー: python@3.12: ボトルには Apple コマンドラインツールがインストールされている必要があります。
必要に応じて、次のコマンドでインストールできます:
xcode-select --install</font>

3, Chat-GPTの指示通り% xcode-select --install をインストールしました。
```python
% xcode-select --install
```
![スクリーンショット 2024-06-24 8.54.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/0244c213-f465-1ec2-ce6c-532432d99922.png)
これが出たら迷わずインストール。インストールにかかる時間は気持ち的には1時間、実際は５分くらいでした。放っておいたら終わってた。

4, 次に% brew install zbarのインストール
```python
% brew install zbar
```
<font color='red'>なんとまたまたエラーが出ました。早速Chat-GPTに確認しました。</font>

![スクリーンショット 2024-06-28 9.10.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/aa0e30bd-7dec-4a02-658c-0af093cec613.png)

Chat-GPT:<font color='gray'>「このエラーは、brewがzbarのインストール中にPythonのシンボリックリンクを作成しようとした際、既存のファイルが衝突したために発生しています。この問題を解決するためには、既存のファイルを削除するか、強制的にリンクを上書きすることができます。
＜既存のファイルを削除する方法＞
ターミナルを開き、以下のコマンドを実行して既存のファイルを削除します。
% rm '/usr/local/bin/2to3'
% brew link python@3.12 <・・・追記：ここではErrorが出るたびに繰り返しました
% brew install zbar」</font>とのこと。

これも言われた通りにrm '/usr/local/bin/2to3'を実行。
remove /usr/local/bin/2to3? と表示されたらyをinput
![スクリーンショット 2024-06-28 9.30.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/c238e69e-382e-987a-4364-f18573c35c58.png)
<font color='gray'>でも本当に削除して大丈夫かと思ったのでChat-GPTに内緒でFinderを開き（隠しファイルが見える状態（ ショートカット：Command + Shift + .(ドット)）にしてbinディレクトリをデスクトップに保存しておきました。（最終的には必要なかったです。）</font>

5,その後も% brew link python@3.12のインストールをする都度、同じError: Could not symlink・・・が出ましたが、同じように対処しました。
![スクリーンショット 2024-06-28 9.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/eb0a9901-d57e-a4c4-338e-2e2fe05c8879.png)
・Error: Could not symlink bin/pydoc3
・Error: Could not symlink bin/python3
・Error: Could not symlink bin/python3-config
など

6, そして、ついにzbarをbrewにインストール出来ましたが、Warningが出ました。
![スクリーンショット 2024-06-28 9.41.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/dedd3760-af2d-366d-ec59-86b8637c429e.png)

しかしChat-GPT曰く<font color='gray'>
「この警告メッセージは、zbarが既にインストールされており、最新バージョンであることを示しています。そのため、brew reinstall zbarを実行する必要はありません。」</font>とのことでしたので放っておきました。

7, pipに”pyzbar”をインストールして完了です。
![スクリーンショット 2024-06-28 9.43.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634708/e9a3023b-329a-1bc2-d417-f56f6fb6872f.png)