最近在弄一个 Python 爬虫,碰到了二维码相关的问题。 爬取的网站可以用 QQ 扫码登录。一开始的想法是通过 selenium 获取屏幕截图然后用 zliblight 扫码解读出 URL, 然后再用这个 URL 通过 pyqrcode 生成一个二维码打印到终端上(主要是想只用终端来操作不用打开浏览器,所以采取的这个方案)。但是,扫描终端里的二维码却无法成功登录(手机 QQ 上显示登录成功但是网页端没有反应)。并且,在终端里打印出来的二维码与截图获取的二维码并不一样,虽然扫描之后得到 URL 是一样的,但是扫描截图里面的二维码就能够成功登录。有人了解这其中的原因嘛?或者,要如何生成和截图里完全一样的二维码打印到终端里?
获取二维码截图并打印终端版二维码的函数:
def print_qr(driver):
# Get QR code
path = os.path.join(BASE_DIR, "qrcode.png")
get_qr_screen_shot(driver, path)
# Load it to Pillow
with open(path, 'rb') as image_file:
image = Image.open(image_file)
image.load()
# decode it
codes = zbarlight.scan_codes('qrcode', image)
print(codes)
url = codes[0].decode('utf-8')
print(url)
# encode it in text and print it to terminal
qr = pyqrcode.create(url)
print(qr.terminal(quiet_zone=1))
1
loading 2016-08-06 16:00:07 +08:00 via Android
直接裁剪截图
|
2
skydiver 2016-08-06 16:00:45 +08:00 via iPad
二维码里有隐藏信息呗。不一定是标准的 URL
|
3
ladrift OP 的确裁减了截图,最后的`qrcode.png`里面只有二维码的部分。主要问题是,这样生成的二维码和原二维码不完全相同。生成二维码还有哪些其他的决定因素嘛?
|
5
wzxjohn 2016-08-06 16:06:20 +08:00 via iPhone
都截屏了为啥要解读再生成一次?不懂。直接把原图贴出来不就好了?
二维码应该是没有隐藏信息一说的,感觉是你的二维码在扫描的时候失效了? |
6
ladrift OP @wzxjohn
在本机上的确可以打开图片扫描,但是如果爬虫跑在服务器上就只能通过终端来打印二维码了。 至于失效的问题,扫描终端里的二维码没有反应,再扫描截图里的二维码就能登录了,应该没有失效的问题。并且从肉眼观测来看截图里的二维码和终端里面的的确不一样。 |
7
ladrift OP 其实要是想完成这个扫描二维码登陆的需求的确还有别的解决方案,我现在疑惑的是,为什么两个二维码会不同,而且扫描后的效果的确不同(一个能登录,一个不能),但是两个二维码解读出来的 URL 确是一样的。不知有没有人了解其中原委。
|
10
skydiver 2016-08-06 17:13:27 +08:00
二维码是冗余编码,想在里面加入一些信息还是很容易的。
|
11
livelazily 2016-08-06 17:33:52 +08:00
@skydiver 不直接用 qq 扫,下载第三方的二维码扫描, 然后跳转到 qq 看看登录效果,能登录就是没有加隐藏信息
|
12
ladrift OP @livelazily 第三方的就会读取出一个 URL ,跳转到浏览器里后就会重定向成 im.qq.com 。(我用的手机相机自带的二维码识别)所以 @skydiver 说的还是很有可能的,看来不能转一遍再生成了,会遗漏信息。
|
13
fcicq 2016-08-06 20:58:52 +08:00
QR 有四种等级的 EC 码, 和这个有关吗?
|