pyzbarはQRコードを読み取るPythonのライブラリです.
画像に含まれる全てのQRコードについて,URLとQRコードが置かれている座標を調べることができます.

目次

  1. インストール
  2. 読み取り
  3. ブラウザでのアクセス履歴を取得する
  4. 書き出し
    1. qrcode
    2. pyqrcode
  5. おまけ:通常のバーコード生成

pyzbarのおかげで,QRコードのリンク先をチェックするという問題は次の2つに分解されます.

  • QRコードの印刷された紙・インクからスマートフォンのカメラへの物理的なレイヤーの問題
  • URLのチェック

したがって,前者が担保されているなら,QRコードのリンク先チェックはURLのチェックというタスクに帰着します.

QRコードは黒1色で印刷するところ,多色重なって黒に見えていたケースや,解像度の問題でスキャンできないケースがあります.
物理的なレイヤーのチェックも別途必要です.

インストール

次の環境での記録です.

  • macOS 11系
  • Python 3.9.4
  • pyzbar 0.1.8
  • Pillow 8.2.0
  • pandas 1.2.4

インストールのため,

pip3 install pyzbar
pip3 install Pillow
pip3 install pandas

とします.

macOSではpyzbarをインストールする際,公式ページに従ってbrew install zbarもしました.

読み取り

QRコードを取得するためのpyzbarの他,画像を扱うPILとデータフレームを扱うpandasもインポートします.

from pyzbar.pyzbar import decode
from PIL import Image
from pandas import DataFrame

このとき,

d = DataFrame(decode(Image.open('QRコードを1つ以上含む画像ファイル名')))

というコードにより,pyzbarは画像タイプがQRコードのものを絞り込み,dにはQRコード等の情報が格納されます.

格納された情報はdata[i]polygon[i]です.
QRコードの数だけ保持されます.

取得した最初のQRコードのURLは,

d.data[0].decode('utf-8')

で取得できます.

座標は

d.polygon[0]

で取得できます.

ブラウザでのアクセス履歴を取得する

QRコードの示すURLを取得しても,リンク先の目視チェックで抜けを出してはいけません.
Seleniumのようなツールで全リンクのスクリーンショットを撮影しておくか,あるいは,実際のアクセスデータと突き合わせてチェック漏れを防止するとよいでしょう.
ブラウザでのアクセス履歴が欲しい場合は,macOS 11のSafariの場合だと,~/Library/Safari/History.dbにデータがあります.
SQLite3からデータベースを開くことにより,訪問時刻やURL等のアクセス履歴を抽出できます.

書き出し

このページの目的ではありませんが,テストで使うためにQRコードの書き出しを行うライブラリを以下に記します.

qrcode

pip3 install qrcodeしておき,bash上で

qr "テキスト" > 画像名.png

とします.

pyqrcode

pip3 install pyqrcodeしておき,

import pyqrcode
qr = pyqrcode.create(content="https://example.com", error='H')
qr.eps(file='test.eps', scale=6)

とします.

おまけ:通常のバーコード生成

pip install python-barcode

しておいて,

import barcode
from barcode.writer import ImageWriter

jan = barcode.get('jan', 'JANコードの数字を表す文字列', writer=ImageWriter())
jan.save('ファイル名',options={
'module_height':20,
'module_width':0.4,
'font_size':12,
'text_distance':5,
})