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函数中定义参数的四种方式
Nov 30 Python
Django Admin 实现外键过滤的方法
Sep 29 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
使用python编写简单的小程序编译成exe跑在win10上
Jan 15 Python
Python实现PS滤镜碎片特效功能示例
Jan 24 Python
Flask框架Flask-Login用法分析
Jul 23 Python
python opencv实现切变换 不裁减图片
Jul 26 Python
解决python3 pika之连接断开的问题
Dec 18 Python
Python3.6中Twisted模块安装的问题与解决
Apr 15 Python
python创建与遍历List二维列表的方法
Aug 16 Python
对pytorch中x = x.view(x.size(0), -1) 的理解说明
Mar 03 Python
pytorch中[..., 0]的用法说明
May 20 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 木马攻击防御技巧
2009/06/13 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
解析php如何将日志写进syslog
2013/06/28 PHP
Laravel5.4简单实现app接口Api Token认证方法
2019/08/29 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
PHP7 windows支持
2021/03/09 PHP
XML的代替者----JSON
2007/07/21 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
2013/12/08 Javascript
JS对象转换为Jquery对象实现代码
2013/12/29 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
Bootstrap每天必学之导航组件
2016/04/25 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
C#微信小程序服务端获取用户解密信息实例代码
2017/03/10 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
JS中Promise函数then的奥秘探究
2018/07/30 Javascript
JS二级菜单不同实现方法分析【4种方法】
2018/12/21 Javascript
three.js实现圆柱体
2018/12/30 Javascript
浅析python 内置字符串处理函数的使用方法
2014/06/11 Python
详解Python当中的字符串和编码
2015/04/25 Python
基于Python Shell获取hostname和fqdn释疑
2016/01/25 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Python中栈、队列与优先级队列的实现方法
2019/06/30 Python
Python 的AES加密与解密实现
2019/07/09 Python
python basemap 画出经纬度并标定的实例
2019/07/09 Python
python并发编程多进程 互斥锁原理解析
2019/08/20 Python
Python3和pyqt5实现控件数据动态显示方式
2019/12/13 Python
基于Python共轭梯度法与最速下降法之间的对比
2020/04/02 Python
Python3爬虫中Ajax的用法
2020/07/10 Python
Python安装第三方库攻略(pip和Anaconda)
2020/10/15 Python
同学会邀请书大全
2014/01/12 职场文书
十佳青年事迹材料
2014/08/21 职场文书
教师学习三严三实心得体会
2014/10/13 职场文书
送给自己的励志语句:要安静的优秀,悄无声息的坚强
2019/11/26 职场文书
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS