0
0

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

Last updated at Posted at 2024-06-28

環境

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はそのサイトが開きます。

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もしくは9を入力してください。")
        exit()

後述

1, brewとpipに必要なライブラリがインストールされているか確認しました。 
2, Homebrewに”zbar”が入ってない。当然pipにも”pyzbar”が入ってないので、インストールを始めました。

% brew install zbar

なんとエラーが出ました。早速Chat-GPTに確認しました。
スクリーンショット 2024-06-28 8.59.37.png
エラー: python@3.12: ボトルには Apple コマンドラインツールがインストールされている必要があります。
必要に応じて、次のコマンドでインストールできます:
xcode-select --install

3, Chat-GPTの指示通り% xcode-select --install をインストールしました。

% xcode-select --install

スクリーンショット 2024-06-24 8.54.51.png
これが出たら迷わずインストール。インストールにかかる時間は気持ち的には1時間、実際は5分くらいでした。放っておいたら終わってた。

4, 次に% brew install zbarのインストール

% brew install zbar

なんとまたまたエラーが出ました。早速Chat-GPTに確認しました。

スクリーンショット 2024-06-28 9.10.14.png

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

これも言われた通りにrm '/usr/local/bin/2to3'を実行。
remove /usr/local/bin/2to3? と表示されたらyをinput
スクリーンショット 2024-06-28 9.30.30.png
でも本当に削除して大丈夫かと思ったのでChat-GPTに内緒でFinderを開き(隠しファイルが見える状態( ショートカット:Command + Shift + .(ドット))にしてbinディレクトリをデスクトップに保存しておきました。(最終的には必要なかったです。)

5,その後も% brew link python@3.12のインストールをする都度、同じError: Could not symlink・・・が出ましたが、同じように対処しました。
スクリーンショット 2024-06-28 9.40.19.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

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

7, pipに”pyzbar”をインストールして完了です。
スクリーンショット 2024-06-28 9.43.39.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0