V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
ladrift
V2EX  ›  问与答

如何生成完全一样的二维码( QR code)?

  •  
  •   ladrift · 2016-08-06 15:56:50 +08:00 · 6131 次点击
    这是一个创建于 3029 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在弄一个 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))
    
    15 条回复    2016-08-09 21:17:05 +08:00
    loading
        1
    loading  
       2016-08-06 16:00:07 +08:00 via Android
    直接裁剪截图
    skydiver
        2
    skydiver  
       2016-08-06 16:00:45 +08:00 via iPad
    二维码里有隐藏信息呗。不一定是标准的 URL
    ladrift
        3
    ladrift  
    OP
       2016-08-06 16:02:46 +08:00
    的确裁减了截图,最后的`qrcode.png`里面只有二维码的部分。主要问题是,这样生成的二维码和原二维码不完全相同。生成二维码还有哪些其他的决定因素嘛?
    ladrift
        4
    ladrift  
    OP
       2016-08-06 16:05:03 +08:00
    @skydiver 二维码里还能包含什么信息呢?
    wzxjohn
        5
    wzxjohn  
       2016-08-06 16:06:20 +08:00 via iPhone
    都截屏了为啥要解读再生成一次?不懂。直接把原图贴出来不就好了?
    二维码应该是没有隐藏信息一说的,感觉是你的二维码在扫描的时候失效了?
    ladrift
        6
    ladrift  
    OP
       2016-08-06 16:10:00 +08:00
    @wzxjohn
    在本机上的确可以打开图片扫描,但是如果爬虫跑在服务器上就只能通过终端来打印二维码了。

    至于失效的问题,扫描终端里的二维码没有反应,再扫描截图里的二维码就能登录了,应该没有失效的问题。并且从肉眼观测来看截图里的二维码和终端里面的的确不一样。
    ladrift
        7
    ladrift  
    OP
       2016-08-06 16:13:02 +08:00
    其实要是想完成这个扫描二维码登陆的需求的确还有别的解决方案,我现在疑惑的是,为什么两个二维码会不同,而且扫描后的效果的确不同(一个能登录,一个不能),但是两个二维码解读出来的 URL 确是一样的。不知有没有人了解其中原委。
    skydiver
        8
    skydiver  
       2016-08-06 16:51:08 +08:00 via iPad
    @wzxjohn 如何证明腾讯没加入隐藏信息?
    skydiver
        9
    skydiver  
       2016-08-06 17:12:44 +08:00
    @ladrift 这得看腾讯的工程师是不是加入了什么自己的内容了
    skydiver
        10
    skydiver  
       2016-08-06 17:13:27 +08:00
    二维码是冗余编码,想在里面加入一些信息还是很容易的。
    livelazily
        11
    livelazily  
       2016-08-06 17:33:52 +08:00
    @skydiver 不直接用 qq 扫,下载第三方的二维码扫描, 然后跳转到 qq 看看登录效果,能登录就是没有加隐藏信息
    ladrift
        12
    ladrift  
    OP
       2016-08-06 17:38:31 +08:00
    @livelazily 第三方的就会读取出一个 URL ,跳转到浏览器里后就会重定向成 im.qq.com 。(我用的手机相机自带的二维码识别)所以 @skydiver 说的还是很有可能的,看来不能转一遍再生成了,会遗漏信息。
    fcicq
        13
    fcicq  
       2016-08-06 20:58:52 +08:00
    QR 有四种等级的 EC 码, 和这个有关吗?
    wzxjohn
        14
    wzxjohn  
       2016-08-09 21:14:21 +08:00
    @skydiver 我按照楼主的方法做成功了。。。算不算一种证明呢。。。
    wzxjohn
        15
    wzxjohn  
       2016-08-09 21:17:05 +08:00
    使用楼主的代码,测试了登陆 mp.qq.com 没有任何问题。我的代码和楼主代码唯一的不同就是原图是手动右键保存的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1158 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:04 · PVG 07:04 · LAX 15:04 · JFK 18:04
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.