V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
kukuwhu
V2EX  ›  Python

大神们帮我看看 Python requests 模拟登陆 taobao 的问题

  •  1
     
  •   kukuwhu · 2016-04-16 11:40:37 +08:00 · 4659 次点击
    这是一个创建于 2947 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我想通过 Python requests 库实现登录 taobao 功能,我想到的办法是通过手机扫描二维码来实现登陆,通过浏览器实验步骤如下:
    1. 通过浏览器访问 https://qrlogin.taobao.com/qrcodelogin/generateQRCode4Login.do 获取二维码的 url 及 lgToken ,会返回格式如下的 json :
    {"success":true,"message":"null","url":"//img.alicdn.com/tfscom/TB19qseMpXXXXbpXpXXwu0bFXXX.png","lgToken":"975c53795adb7a246ee2469dcb026006","adToken":"85573711dd80cde2d1c5ef98cb36c494"}
    2. 在浏览器打开二维码的 url ,用手机淘宝扫描点击登陆,动作不要太慢,如果显示过期需要重新执行第 1 步。
    3. 将以下链接的 lgToken 替换成第 1 步骤的 lgToken,访问后得到一个 json 文件
    https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do?lgToken=975c53795adb7a246ee2469dcb026006&defaulturl=https%3A%2F%2Fwww.taobao.com%2F&_ksTS=1460659151617_231
    4. 访问第 3 步 json 文件里的 url ,即可完成登录认证并进入主页。
    第 3 步正确返回的 json 内容形式如下:
    {"code":"10006","success":true,"url":"https://login.taobao.com/member/loginByIm.do?uid=cntaobaoTest_kuku_id&token=826ebe55a3f0f6af7d635ae87afd16bb&time=1460736674705&asker=qrcodelogin&ask_version=1.0.0&defaulturl=https%3A%2F%2Fwww.taobao.com%2F&webpas=2d741eb256deaa2b9f5dbdd7645758ae1435179353"}
    上述步骤在 chrome 下清除 cookies 后,手动依次执行可顺利完成认证,但我通过 Python 代码却最终无法完成登录。

    代码如下:
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    import requests
    import time
    import sys
    import json
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36'}

    sess = requests.session()
    sess.headers = headers
    #对应第 1 步
    rsp = sess.get("https://qrlogin.taobao.com/qrcodelogin/generateQRCode4Login.do")
    b = json.loads(rsp.text)
    #对应第 2 步,将以下打印的二维码 url 贴到浏览器,用手机淘宝扫描
    print(b['url'])
    print(b['lgToken'])
    time.sleep(30)
    #对应第 3 步
    url = "https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do?lgToken=" + b['lgToken']
    url += "&defaulturl=https%3A%2F%2Fwww.taobao.com%2F&_ksTS=1460659151617_231"
    rsp = sess.get(url)
    b = json.loads(rsp.text)
    print(b['url'])
    #对应第 4 步
    rsp = sess.get(b['url'])
    #日志文件里可看出没登录成功,仍是一个登录页面
    fle = open("log.html", 'w')
    fle.write(rsp.text)
    fle.close()
    casparchen
        1
    casparchen  
       2016-04-16 14:24:56 +08:00 via iPhone
    改一下 UA 试试呢
    casparchen
        2
    casparchen  
       2016-04-16 14:25:29 +08:00 via iPhone
    @casparchen 不好意思没看到
    matthewgao
        3
    matthewgao  
       2016-04-16 14:35:28 +08:00
    有检查 response header 里面有没有 session 或者 cookie 相关的信息?对比下有其他缺失的不
    caspartse
        4
    caspartse  
       2016-04-16 16:01:44 +08:00
    实际上已经登录成功了。

    print(sess.cookies.get_dict().get('lgc'))
    print(sess.cookies.get_dict().get('_nk_'))

    微信的扫码登录原理和这个类似。
    kukuwhu
        5
    kukuwhu  
    OP
       2016-04-16 16:08:01 +08:00
    @caspartse 那为何我在 log.html 里看不到我的个人信息,比如昵称之类的?
    caspartse
        6
    caspartse  
       2016-04-16 16:12:04 +08:00
    @kukuwhu 个人信息显示是通过 js 实现的,不在结果返回结果里。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2891 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 13:48 · PVG 21:48 · LAX 06:48 · JFK 09:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.