環境
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に確認しました。
エラー: python@3.12: ボトルには Apple コマンドラインツールがインストールされている必要があります。
必要に応じて、次のコマンドでインストールできます:
xcode-select --install
3, Chat-GPTの指示通り% xcode-select --install をインストールしました。
% xcode-select --install
これが出たら迷わずインストール。インストールにかかる時間は気持ち的には1時間、実際は5分くらいでした。放っておいたら終わってた。
4, 次に% brew install zbarのインストール
% brew install zbar
なんとまたまたエラーが出ました。早速Chat-GPTに確認しました。
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
でも本当に削除して大丈夫かと思ったのでChat-GPTに内緒でFinderを開き(隠しファイルが見える状態( ショートカット:Command + Shift + .(ドット))にしてbinディレクトリをデスクトップに保存しておきました。(最終的には必要なかったです。)
5,その後も% brew link python@3.12のインストールをする都度、同じError: Could not symlink・・・が出ましたが、同じように対処しました。
・Error: Could not symlink bin/pydoc3
・Error: Could not symlink bin/python3
・Error: Could not symlink bin/python3-config
など
6, そして、ついにzbarをbrewにインストール出来ましたが、Warningが出ました。
しかしChat-GPT曰く
「この警告メッセージは、zbarが既にインストールされており、最新バージョンであることを示しています。そのため、brew reinstall zbarを実行する必要はありません。」とのことでしたので放っておきました。