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获得文件创建时间和修改时间的方法
Jun 30 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
如何将python中的List转化成dictionary
Aug 15 Python
python3中bytes和string之间的互相转换
Feb 09 Python
python数据结构之链表的实例讲解
Jul 25 Python
python二维列表一维列表的互相转换实例
Jul 02 Python
Python matplotlib的使用并自定义colormap的方法
Dec 13 Python
如何用Python来搭建一个简单的推荐系统
Aug 07 Python
解决Djang2.0.1中的reverse导入失败的问题
Aug 16 Python
python实现图片横向和纵向拼接
Mar 05 Python
详解用Pytest+Allure生成漂亮的HTML图形化测试报告
Mar 31 Python
关于python中导入文件到list的问题
Oct 31 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
Win9x/ME下Apache+PHP安装配置
2006/10/09 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
关于php unset对json_encode的影响详解
2018/11/14 PHP
JQuery文本框高亮显示插件代码
2011/04/02 Javascript
js bind 函数 使用闭包保存执行上下文
2011/12/26 Javascript
jquery ui对话框实例代码
2013/05/10 Javascript
js常用自定义公共函数汇总
2014/01/15 Javascript
通过onmouseover选项卡实现img图片的变化
2014/02/12 Javascript
用jquery写的菜单从左往右滑动出现
2014/04/11 Javascript
使用jQuery设置disabled属性与移除disabled属性
2014/08/21 Javascript
使用angular写一个hello world
2015/01/23 Javascript
jquery使用经验小结
2015/05/20 Javascript
Jquery easyui开启行编辑模式增删改操作
2016/01/14 Javascript
Vuex提升学习篇
2018/01/11 Javascript
详解微信小程序canvas圆角矩形的绘制的方法
2018/08/22 Javascript
Jquery和CSS实现选择框重置按钮功能
2018/11/08 jQuery
微信小程序使用for循环动态渲染页面操作示例
2018/12/25 Javascript
JS实现鼠标拖拽盒子移动及右键点击盒子消失效果示例
2019/01/29 Javascript
详解如何在Vue项目中导出Excel
2019/04/19 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
[43:58]DOTA2-DPC中国联赛定级赛 LBZS vs SAG BO3第一场 1月8日
2021/03/11 DOTA
关于Pytorch MaxUnpool2d中size操作方式
2020/01/03 Python
python 安装教程之Pycharm安装及配置字体主题,换行,自动更新
2020/03/13 Python
动态设置django的model field的默认值操作步骤
2020/03/30 Python
python中操作文件的模块的方法总结
2021/02/04 Python
Html5应用程序缓存(Cache manifest)
2018/06/04 HTML / CSS
高性能钓鱼服装:Huk Gear
2019/02/20 全球购物
梅西百货官网:Macy’s
2020/08/04 全球购物
创业大赛策划书
2014/03/01 职场文书
摄影专业毕业生求职信
2014/03/13 职场文书
活动总结格式范文
2014/04/26 职场文书
学校工作推荐信范文
2014/07/11 职场文书
初中生庆国庆演讲稿范文2014
2014/09/25 职场文书
五年级上册复习计划
2015/01/19 职场文书
python实现过滤敏感词
2021/05/08 Python