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基础教程之实现石头剪刀布游戏示例
Feb 11 Python
Python元组知识点总结
Feb 18 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
对Pytorch中nn.ModuleList 和 nn.Sequential详解
Aug 18 Python
python+rsync精确同步指定格式文件
Aug 29 Python
感知器基础原理及python实现过程详解
Sep 30 Python
python实现高斯判别分析算法的例子
Dec 09 Python
python3操作注册表的方法(Url protocol)
Feb 05 Python
Pycharm 使用 Pipenv 新建的虚拟环境(图文详解)
Apr 16 Python
tensorflow使用L2 regularization正则化修正overfitting过拟合方式
May 22 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
Python中基础数据类型 set集合知识点总结
Aug 02 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
Netflix将与CLAMP、乙一以及冲方丁等6名知名制作人合伙展开原创动画计划!
2020/03/06 日漫
特详细的PHPMYADMIN简明安装教程
2008/08/01 PHP
js和php邮箱地址验证的实现方法
2014/01/09 PHP
ThinkPHP 3.2.2实现事务操作的方法
2017/05/05 PHP
轻轻松松学习JavaScript
2007/02/25 Javascript
JQuery autocomplete 使用手册
2010/04/01 Javascript
jQuery中调用WebService方法小结
2011/03/28 Javascript
JavaScript Array Flatten 与递归使用介绍
2011/10/30 Javascript
js确定对象类型方法
2012/03/30 Javascript
JavaScript基础知识之数据类型
2012/08/06 Javascript
JS数组的赋值介绍
2014/03/10 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
前端框架Vue.js中Directive知识详解
2016/09/12 Javascript
AngularJS入门教程二:在路由中传递参数的方法分析
2017/05/27 Javascript
Nuxt配合Node在实际生产中的应用详解
2018/08/07 Javascript
如何用Node写页面爬虫的工具集
2018/10/26 Javascript
uni-app之APP和小程序微信授权方法
2019/05/09 Javascript
解决Vue+Electron下Vuex的Dispatch没有效果问题
2019/05/20 Javascript
js实现整体缩放页面适配移动端
2020/03/31 Javascript
JQuery获得内容和属性方法解析
2020/05/30 jQuery
超详细小程序定位地图模块全系列开发教学
2020/11/24 Javascript
Python标准库之循环器(itertools)介绍
2014/11/25 Python
Python中的左斜杠、右斜杠(正斜杠和反斜杠)
2016/08/30 Python
python射线法判断一个点在图形区域内外
2019/06/28 Python
Matplotlib中rcParams使用方法
2021/01/05 Python
Python的Tqdm模块实现进度条配置
2021/02/24 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
Willer台湾:日本高速巴士/夜行巴士预约
2017/07/09 全球购物
优秀毕业生事迹材料
2014/02/12 职场文书
后勤主管岗位职责
2014/03/01 职场文书
法学院毕业生求职信
2014/06/25 职场文书
乡村教师党员四风问题对照检查材料思想汇报
2014/10/08 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
z-index不起作用
2021/03/31 HTML / CSS
Python Pycharm虚拟下百度飞浆PaddleX安装报错问题及处理方法(亲测100%有效)
2021/05/24 Python
Python使用Kubernetes API访问集群
2021/05/30 Python