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将IP地址在整型和字符串之间轻松转换
Mar 22 Python
Python 记录日志的灵活性和可配置性介绍
Feb 27 Python
python list删除元素时要注意的坑点分享
Apr 18 Python
解决python中使用PYQT时中文乱码问题
Jun 17 Python
Python利用pandas处理Excel数据的应用详解
Jun 18 Python
python3.7 sys模块的具体使用
Jul 22 Python
对python 中re.sub,replace(),strip()的区别详解
Jul 22 Python
python脚本实现音频m4a格式转成MP3格式的实例代码
Oct 09 Python
Spring @Enable模块驱动原理及使用实例
Jun 23 Python
Flask搭建一个API服务器的步骤
May 28 Python
浅谈Python数学建模之线性规划
Jun 23 Python
Python各协议下socket黏包问题原理
Apr 12 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 3行代码的分页算法(求起始页和结束页)
2009/10/21 PHP
PHP 网络开发详解之远程文件包含漏洞
2010/04/25 PHP
php全局变量和类配合使用深刻理解
2013/06/05 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
php图片添加水印例子
2016/07/20 PHP
详解PHP防止直接访问.php 文件的实现方法
2017/07/28 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
PHP7数组的底层实现示例
2019/08/25 PHP
window resize和scroll事件的基本优化思路
2014/04/29 Javascript
javascript中BOM基础知识总结
2017/02/14 Javascript
深究AngularJS——ng-checked(回写:带真实案例代码)
2017/06/13 Javascript
JS 设置Cookie 有效期 检测cookie
2017/06/15 Javascript
AugularJS从入门到实践(必看篇)
2017/07/10 Javascript
jQuery实现参数自定义的文字跑马灯效果
2018/08/15 jQuery
深入理解Vue 组件之间传值
2018/08/16 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
2018/08/25 Javascript
Vue-CLI 项目在pycharm中配置方法
2019/08/30 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
Vue切换组件实现返回后不重置数据,保留历史设置操作
2020/07/21 Javascript
Python实现中一次读取多个值的方法
2018/04/22 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python 实现任务管理清单案例
2020/04/25 Python
css3打造一款漂亮的卡哇伊按钮
2013/03/20 HTML / CSS
韩国江南富人区高端时尚百货商场:Galleria(格乐丽雅)
2018/03/27 全球购物
历史学专业毕业生求职信
2013/09/27 职场文书
兼职学生的自我评价
2013/11/24 职场文书
高分子材料与工程专业个人求职信
2013/12/15 职场文书
数控专业毕业生自荐信范文
2014/03/04 职场文书
岗位说明书标准范本
2014/07/30 职场文书
演讲比赛的活动方案
2014/08/28 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
开学第一天的感想
2015/08/10 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
如何撰写出一份完美的商业计划书?
2019/07/12 职场文书
浅谈Python数学建模之整数规划
2021/06/23 Python
nginx共享内存的机制详解
2022/03/21 Servers