
最近在弄一个 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 码, 和这个有关吗? |