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判断windows隐藏文件的方法
Mar 21 Python
Python运用于数据分析的简单教程
Mar 27 Python
Python实现的HTTP并发测试完整示例
Apr 23 Python
pycharm安装图文教程
May 02 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
分析Python中解析构建数据知识
Jan 20 Python
python得到电脑的开机时间方法
Oct 15 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
parser.add_argument中的action使用
Apr 20 Python
python3.8.1+selenium实现登录滑块验证功能
May 22 Python
Python数据分析入门之数据读取与存储
May 13 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作的文本留言本的例子(六)
2006/10/09 PHP
在字符串中把网址改成超级链接
2006/10/09 PHP
火车头采集器3.0采集图文教程
2007/03/17 PHP
解析php中的escape函数
2013/06/29 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
jquery实现的超出屏幕时把固定层变为定位层的代码
2010/02/23 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
javascript实现给定半径求出圆的面积
2015/06/26 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
Javascript 动态改变imput type属性
2016/11/01 Javascript
js仿微信公众平台打标签功能
2017/04/08 Javascript
AngularJS之自定义服务详解(factory、service、provider)
2017/04/14 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
angular多语言配置详解
2019/05/16 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
在vue中实现嵌套页面(iframe)
2020/07/30 Javascript
谈谈Python进行验证码识别的一些想法
2016/01/25 Python
Python返回数组/List长度的实例
2018/06/23 Python
Python字典中的键映射多个值的方法(列表或者集合)
2018/10/17 Python
python传到前端的数据,双引号被转义的问题
2020/04/03 Python
TensorFlow Autodiff自动微分详解
2020/07/06 Python
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
zooplus德国:便宜地订购动物用品、动物饲料、动物食品
2020/05/06 全球购物
最新大学毕业求职简历的自我评价
2013/10/18 职场文书
员工廉洁自律承诺书
2014/05/26 职场文书
2014民事授权委托书范本
2014/09/29 职场文书
师德师风自查总结
2014/10/14 职场文书
2014年技术员工作总结
2014/11/18 职场文书
2014年物业公司工作总结
2014/11/22 职场文书
2015年干部教育培训工作总结
2015/05/15 职场文书
总结Python常用的魔法方法
2021/05/25 Python
vue 实现上传组件
2021/05/31 Vue.js
MySQL 主从复制数据不一致的解决方法
2022/03/18 MySQL
超越Nginx的Web服务器caddy优雅用法
2022/06/21 Servers