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遍历C盘dll文件的方法
May 06 Python
python+Django+apache的配置方法详解
Jun 01 Python
python安装numpy&amp;安装matplotlib&amp; scipy的教程
Nov 02 Python
在PyCharm导航区中打开多个Project的关闭方法
Jan 17 Python
Python并发:多线程与多进程的详解
Jan 24 Python
Python控制键盘鼠标pynput的详细用法
Jan 28 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
python单例模式原理与创建方法实例分析
Oct 26 Python
Python如何使用字符打印照片
Jan 03 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
Python telnet登陆功能实现代码
Apr 16 Python
浅谈Keras的Sequential与PyTorch的Sequential的区别
Jun 17 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
DOTA2 玩家自创拉野攻略 特色英雄快速成长篇
2020/04/20 DOTA
新手配置 PHP 调试环境(IIS+PHP+MYSQL)
2007/01/10 PHP
xss防御之php利用httponly防xss攻击
2014/03/21 PHP
ThinkPHP控制器间实现相互调用的方法
2014/10/31 PHP
typecho插件编写教程(二):写一个新插件
2015/05/28 PHP
使用PHP开发留言板功能
2019/11/19 PHP
javascript获取xml节点的最大值(实现代码)
2013/12/11 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
iframe里面的元素触发父窗口元素事件的jquery代码
2014/10/19 Javascript
js中取得变量绝对值的方法
2015/01/03 Javascript
JavaScript实现简单图片翻转的方法
2015/04/17 Javascript
jQuery实现自动滚动到页面顶端的方法
2015/05/22 Javascript
微信企业号开发之微信考勤百度地图定位
2015/09/11 Javascript
Bootstrap实现默认导航栏效果
2020/09/21 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
Node.js+ES6+dropload.js实现移动端下拉加载实例
2017/06/01 Javascript
vue-cli启动本地服务局域网不能访问的原因分析
2018/01/22 Javascript
Node.js 使用request模块下载文件的实例
2018/09/05 Javascript
Egg.js 中 AJax 上传文件获取参数的方法
2018/10/10 Javascript
详解vantUI框架在vue项目中的应用踩坑
2018/12/06 Javascript
python访问sqlserver示例
2014/02/10 Python
python 网络爬虫初级实现代码
2016/02/27 Python
python 产生token及token验证的方法
2018/12/26 Python
Python发送邮件的实例代码讲解
2019/10/16 Python
Python + Requests + Unittest接口自动化测试实例分析
2019/12/12 Python
详解anaconda离线安装pytorchGPU版
2020/09/08 Python
CSS3 新增选择器的实例
2019/11/13 HTML / CSS
详解基于canvas的视频遮罩插件
2018/01/04 HTML / CSS
Ryderwear美国官网:澳大利亚高端健身训练装备品牌
2018/04/24 全球购物
酷瑞网络科技面试题
2012/03/30 面试题
农村产权制度改革实施方案
2014/03/21 职场文书
父亲节寄语大全
2015/02/27 职场文书
同学联谊会邀请函
2019/06/24 职场文书
浅谈Redis位图(Bitmap)及Redis二进制中的问题
2021/07/15 Redis
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python