python实现二维码扫码自动登录淘宝


Posted in Python onDecember 27, 2016

一个小项目自动登录淘宝联盟抓取数据,由于之前在Github上看过类似用Python写的代码因此选择用Python来写,第一次用Python正式写程序还是被其“简单”所震撼,当然用的时候还是对其(2.7版)编码、迁移环境等问题所困扰,还好后来都解决了。

言归正传,抓取淘宝联盟的数据首先要解决的就是登录的问题,之前一般会碰到验证码的困扰,现在支持二维码扫码登录反而简单了,以下是登录的Python代码,主要是获取二维码打印,然后不断的检查扫码状态,如果过期了重新请求二维码(主要看逻辑,由于有些通用方法做了封装所以不保证能直接执行)

def getQRCode(enableCmdQR):
  payload = {'_ksTS': str(time.time()), 'from': 'alimama'}
  qrCodeObj = utils.fetchAPI('https://qrlogin.taobao.com/qrcodelogin/generateQRCode4Login.do', payload,
                "json", None, True, True)
 
  print(qrCodeObj)
  utils.printQRCode('http:' + qrCodeObj['url'], enableCmdQR)
  lgToken = qrCodeObj['lgToken']
  return lgToken
 
 
def login(enableCmdQR=False):
  lgToken = getQRCode(enableCmdQR)
  code = 0
  successLoginURL = ""
  while code != 10006:
    payload = {'lgToken': lgToken,
          'defaulturl': 'http%3A%2F%2Flogin.taobao.com%2Fmember%2Ftaobaoke%2Flogin.htm%3Fis_login%3D1&_ksTS=' + str(
            time.time())}
 
    rObj = utils.fetchAPI('https://qrlogin.taobao.com/qrcodelogin/qrcodeLoginCheck.do', payload, "json", True,
               False)
    code = int(rObj['code'])
    if 10000 == code:
      # print("请扫描二维码登录")
      continue
    elif 10001 == code:
      print("已扫描二维码,请在确认登录")
    elif 10004 == code:
      print("已过期请重新扫描")
      login()
    elif 10006 == code:
      successLoginURL = rObj["url"]
      print("登录成功,正在跳转")
    else:
      print("未知错误,退出执行")
      sys.exit(0)
 
    time.sleep(5)
 
  print "登录成功跳转:" + successLoginURL
  r = utils.fetchAPI(successLoginURL, None, "raw", True, False, True)
  utils.fetchAPI(r.headers['Location'], None, "raw", True, True, False)

解决登录问题接下去就要解决保存状态的问题,Python的Requests库非常强大,如果简单的话可以直接使用request.session来进行会话操作,但由于项目中的很多操作是异步的因此需要解决cookie的存储和读取,使用pickel进行对像的序列化和反序列化。其中保存cookie默认用增量的方式进行更新

def save_cookies(cookies, overWrite=False):
  try:
    currentCookie = requests.utils.dict_from_cookiejar(cookies)
    if len(currentCookie) < 1:
      return
    oldCookie = requests.utils.dict_from_cookiejar(load_cookies())
    with open(config.COOKIE_FILE, 'w') as f:
      if not overWrite:
        cookieDict = dict(oldCookie, **currentCookie)
      else:
        cookieDict = requests.utils.dict_from_cookiejar(cookies)
      pickle.dump(cookieDict, f)
      print 'Saved cookie'
      print cookieDict
      f.close()
  except:
    print 'Save cookies failed', sys.exc_info()[0]
    sys.exit(99)


def load_cookies():
  try:
    with open(config.COOKIE_FILE, 'r') as f:
      cookies = requests.utils.cookiejar_from_dict(pickle.load(f))
      f.close()
  except:
    cookies = []
  return cookies

封装好之后,在requests.Session请求时加载cookie并保存cookie

s = requests.Session()
# 统一请求API
def fetchAPI(url, params=None, resultFormat="text", isNeedCookie=True, allowRedirects=True, saveCookie=False,
       method='GET'):
  try:
    cookies = load_cookies()
    if 'POST' == method:
      response = s.post(url, data=params, headers=config.Headers, cookies=cookies)
    else:
      response = s.get(url, params=params, headers=config.Headers, cookies=cookies,
               allow_redirects=allowRedirects)

    if "json" == resultFormat:
      result = response.json()
    elif "raw" == resultFormat:
      result = response
    else:
      result = response.text

    # if saveCookie:
    # print 'save cookie:' + str(response.cookies)
    save_cookies(response.cookies)

    return result

  except Exception, e:
    print e
    return False

这两步做好之后基本后续的请求就直接使用统一的API请求方法即可,效果也非常不错,运行效果截图:

python实现二维码扫码自动登录淘宝

当然还有一个问题未解决:如何在session过期之后如何自动重新申请(不确定淘定是否支持),由于淘宝是用统一登录而且是独立的服务因此通过浏览器自动刷新或者请求过程中不断去更新cookie都没有获得服务器方更新的票据,不知道这一块大家有没有可以提供的思路。

Python 相关文章推荐
python获取文件扩展名的方法
Jul 06 Python
wxpython中自定义事件的实现与使用方法分析
Jul 21 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
浅谈Django REST Framework限速
Dec 12 Python
用TensorFlow实现戴明回归算法的示例
May 02 Python
python执行精确的小数计算方法
Jan 21 Python
python实现转圈打印矩阵
Mar 02 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
Python实现生成密码字典的方法示例
Sep 02 Python
Python numpy多维数组实现原理详解
Mar 10 Python
Python xmltodict模块安装及代码实例
Oct 05 Python
python UDF 实现对csv批量md5加密操作
Jan 01 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 #Python
Python中如何获取类属性的列表
Dec 26 #Python
Python中强大的命令行库click入门教程
Dec 26 #Python
Python快速从注释生成文档的方法
Dec 26 #Python
浅谈Python类的__getitem__和__setitem__特殊方法
Dec 25 #Python
解决pyqt中ui编译成窗体.py中文乱码的问题
Dec 23 #Python
详解python进行mp3格式判断
Dec 23 #Python
You might like
php实现的短网址算法分享
2014/06/20 PHP
PHP中的gzcompress、gzdeflate、gzencode函数详解
2014/07/29 PHP
超详细的php用户注册页面填写信息完整实例(附源码)
2015/11/17 PHP
Yii2实现ActiveForm ajax提交
2017/05/26 PHP
PHP数据对象映射模式实例分析
2019/03/29 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
仅IE6/7/8中innerHTML返回值忽略英文空格的问题
2011/04/07 Javascript
jQuery+CSS 半开折叠效果原理及代码(自写)
2013/03/04 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
jQuery实现的导航动画效果(附demo源码)
2016/04/01 Javascript
JS for循环中i++ 和 ++i的区别介绍
2016/07/20 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
微信小程序 加载 app-service.js 错误解决方法
2016/10/12 Javascript
一个极为简单的requirejs实现方法
2016/10/20 Javascript
使用JavaScriptCore实现OC和JS交互详解
2017/03/28 Javascript
解决OneThink中无法异步提交kindeditor文本框中修改后的内容方法
2017/05/05 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
2017/05/22 Javascript
JavaScript实现三级联动菜单效果
2017/08/16 Javascript
AngularJS 的$timeout服务示例代码
2017/09/21 Javascript
详解vue项目首页加载速度优化
2017/10/18 Javascript
JavaScript数组、json对象、eval()函数用法实例分析
2019/02/21 Javascript
vue实现页面滚动到底部刷新
2019/08/16 Javascript
[18:16]sakonoko 2017年卡尔集锦
2018/02/06 DOTA
python使用PIL给图片添加文字生成海报示例
2018/08/17 Python
使用Python opencv实现视频与图片的相互转换
2019/07/08 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
浅谈图像处理中掩膜(mask)的意义
2020/02/19 Python
python实现扫雷游戏的示例
2020/10/20 Python
python 实现学生信息管理系统的示例
2020/11/28 Python
html5 input元素新特性_动力节点Java学院整理
2017/07/06 HTML / CSS
amazeui时间组件的实现示例
2020/08/18 HTML / CSS
服装公司总经理岗位职责
2013/11/30 职场文书
物流毕业生个人的自我评价
2014/02/13 职场文书
党员志愿者活动方案
2014/08/28 职场文书
社区重阳节活动总结
2015/03/24 职场文书
Mysql忘记密码解决方法
2022/02/12 MySQL