使用组合技来解析二维码

有朋友提出这个需求。
希望区分用户上传的二维码是群二维码,还是个人二维码或者说是公共帐号。

这里会涉及到二维码的解读。
本来flash中有类库,可以生成及解析二维码。
如果是pc网站的话,直接在flash上传组件中做手脚。上传同时读取到内存中进行二维码解读。
但是这个朋友是一个手机站点。
无法使用flash组件。
只好另想他法。

php中也有二维码相关的操作类库。libqrencode ,PHP QR Code等等。也有大谷歌提供的二维码api(可惜墙掉了,慎用)。
这些貌似比较难操作。多数都是如何生成,但是如何读取参考文章少之又少。
主要有一点,用户上传的二维码鱼龙混杂,并非是单纯规范的二维码。所以对读取和解析要求能力极高。

经过一番考虑。决定采用如下模式:

1、编写python脚本来解析二维码。
2、使用php做中介。

首先在服务器上检查python以及组件支持情况
1、需要安装python-qrcode #yum install python-qrcode*
2、需要安装zbar #yum install zbar-dev* zbar-pygt*
3、需要安装cStringIO #yum install cStringIO
4、上述三个组件分别是用来生成读取二维码的qrcode、解析图片的zbar、把远程文件读取道内存中的cStringIO。

完成上述工作后就开搞吧!

编写python脚本
#vi rc.py

#!/usr/bin/python
from sys import argv
import zbar
import Image
import cStringIO
import urllib2
#上边是加载模块
if len(argv) < 2: exit(1) #创建图片读取器 scanner = zbar.ImageScanner() # configure the reader scanner.parse_config('enable') #远程读取图片到内存中 url = argv[1] file = urllib2.urlopen(url) tmpIm = cStringIO.StringIO(file.read()) #这个是读取本地文件 #pil = Image.open(argv[1]).convert('L') #读取文件 pil = Image.open(tmpIm).convert('L') width, height = pil.size raw = pil.tostring() # wrap image data image = zbar.Image(width, height, 'Y800', raw) # scan the image for barcodes #扫描图片 scanner.scan(image) # extract results for symbol in image: # 返回数据,包含二维码编码格式以及数据 print 'decoded', symbol.type, 'symbol', '"%s"' % symbol.data # clean up #清理内存 del(image)

编写php调用python
#vi index.php

ok了,打完收工。做几个测试。

很快发现规律。
http://weixin.qq.com/q/ 开头的都为公共号
http://weixin.qq.com/r/ 开头的都为个人号
http://weixin.qq.com/g/ 开头的都为微信群

http://www.woria.cn/qc/index.php?k=pic

这是我的演示地址。请替换pic为你想解析的二维码。(链接后期可能会失效)

发表回复