動的に(URLのパラメータ指定で)QRコード®を生成するWebサービスを作りました。
すでにそういうサービスはいくつかあると思いますが、コラボさいたま2009の当社展示での使用のため、よそ様のサービスを使わないですむように自前でつくりました。
おかげさまで無事、展示(およびフォローサイトの運用)も終わったので、サービスの開放およびソースコードの公開をします。
他のサービスでは、QRコードをjpgで出したりswfで出したりするのですが、私が作ったものはbitmapです。
(単純な白黒画像ならbitmapで十分かな、というだけの理由です。深く考えたわけではないです。)
ご利用いただく際は、そのまま当社のサイトにアクセスするようにしていただいてもよいですし、下記の手順でお手持ちのサイトに導入してもいただいても構いません。
当社サイトでの使用方法は次のサイトをご覧ください。
QR-BMP QRコードBitmap生成サービス
2010/4/6 生成されるイメージが読み取りにくい場合があったので、余白をつけられるようにしました。詳しくは上記サイトを御覧下さい。最新のソースコードもそちらにあります。
自前でサービスを立ち上げる際には、以下のソースコードと導入手順も参考にしてください。
下記のソースコードは改変、再配布自由です。
必要な外部パッケージ
ソースコード
pybmp.py
(python 2.4で動作確認)
#!/usr/bin/python
# -*- coding: utf-8 -*-
import cgi
import cgitb; cgitb.enable()
import time
def error():
print "Content-type: text/html; charset=UTF-8"
print "Pragma: no-cache"
print "Cache-Control: no-cache"
print
print '''
No Strings for QR!
'''
qrstr=""
scale=5
import os
import sys
form = cgi.FieldStorage()
if form.has_key('str'):
qrstr = form.getfirst('str','')
else:
qrstr = os.environ.get('HTTP_REFERER','')
if qrstr == '':
error()
sys.exit()
if form.has_key('scale'):
scalestr = form.getfirst('scale','')
scale = int(scalestr)
sys.path.append('ext')
import pyqrcode
import tempfile
stdout_bk = sys.stdout
sys.stdout = tempfile.TemporaryFile()
import bmp
sys.stdout.close()
sys.stdout = stdout_bk
a = pyqrcode.Qrcode()
a.path = 'ext/qrcode_data'
s = a.make_qrcode(qrstr)
x = 0
y = 0
y_max = len(s.split())
x_max = 0
if y_max > 0:
x_max = len(s.split()[0])
bitmap = bmp.BitMap(x_max*scale,y_max*scale)
y = (y_max - 1) * scale
for line in s.split():
for ch in line:
if ch == '1':
for sc_x in range(0,scale):
for sc_y in range(0,scale):
bitmap.plotPoint(x+sc_x,y+sc_y)
x = x + scale
x = 0
y = y - scale
(fdno,filepath) = tempfile.mkstemp()
f = os.fdopen(fdno,"r")
f.close()
if sys.platform == "win32":
import msvcrt
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
bitmap.saveFile(filepath)
print "Content-type: image/bmp"
print "Accept-Ranges: bytes"
print "Content-Length: "+str(os.stat(filepath)[6])
print
f = open(filepath,"rb")
_bufferSize=1000
while True:
buffer = f.read(_bufferSize)
sys.stdout.write(buffer)
if len(buffer) < _bufferSize:
break
f.close()
os.remove(filepath)
[/python]
導入手順
上記ソースコード(pybmp.py)をpython CGIが実行可能なディレクトリに配置して、さらにそこにextディレクトリを作成して必要な外部パッケージをインストールしてください。
実行権等については、通常のpython CGIと同じです。
配置イメージ
(base directory) | ||
+ | pybmp.py | |
+ | ext | |
+ | bmp.py | |
+ | pyqrcode.py | |
+ | qrcode_data (*) |
ちなみに、bmp.pyは置くだけで使えますが、pyqrcode.pyはリンク先に書いてあるとおり、pythonスクリプト以外にデータファイル(上記*ディレクトリの内容物)が必要になります。詳しくはこちらをご覧ください。
※QRコード®は、株式会社デンソーウェーブの登録商標です。
※bmp.pyのアップデート版がこちらにあるようです。そちらを使えば、一時ファイルを作らずにレスポンスを返せそうです。
※当社サイトで運用中のものは、必ずしも上記ソースそのままではありません。