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+django实现简单的文件上传
Aug 17 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
May 29 Python
Python 互换字典的键值对实例
Feb 12 Python
python的内存管理和垃圾回收机制详解
May 18 Python
django基于存储在前端的token用户认证解析
Aug 06 Python
python多线程并发及测试框架案例
Oct 15 Python
原生python实现knn分类算法
Oct 24 Python
最简单的matplotlib安装教程(小白)
Jul 28 Python
python实现自动清理重复文件
Aug 24 Python
python 实现的车牌识别项目
Jan 25 Python
pytorch 预训练模型读取修改相关参数的填坑问题
Jun 05 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/14 PHP
约瑟夫环问题的PHP实现 使用PHP数组内部指针操作函数
2010/10/12 PHP
php操作mysqli(示例代码)
2013/10/28 PHP
thinkPHP使用post方式查询时分页失效的解决方法
2015/12/09 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
jquery复选框CHECKBOX全选、反选
2008/08/30 Javascript
JS获取月的最后一天与JS得到一个月份最大天数的实例代码
2013/12/16 Javascript
JavaScript生成随机数的4种自定义函数分享
2015/02/28 Javascript
60行js代码实现俄罗斯方块
2015/03/31 Javascript
通过隐藏iframe实现无刷新上传文件操作
2016/03/16 Javascript
jQuery基于json与cookie实现购物车的方法
2016/04/15 Javascript
jquery.flot.js简单绘制折线图用法示例
2017/03/13 Javascript
JS中Safari浏览器中的Date
2017/07/17 Javascript
在一般处理程序(ashx)中弹出js提示语
2017/08/16 Javascript
javascript回调函数详解
2018/02/06 Javascript
vue.js 实现图片本地预览 裁剪 压缩 上传功能
2018/03/01 Javascript
JS实现图片旋转动画效果封装与使用示例
2018/07/09 Javascript
深入浅析var,let,const的异同点
2018/08/07 Javascript
jQuery实现简单飞机大战
2020/07/05 jQuery
Python中的startswith和endswith函数使用实例
2014/08/25 Python
利用selenium 3.7和python3添加cookie模拟登陆的实现
2017/11/20 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
numpy中以文本的方式存储以及读取数据方法
2018/06/04 Python
Python文件如何引入?详解引入Python文件步骤
2018/12/10 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
centos7中安装python3.6.4的教程
2019/12/11 Python
Python3.7黑帽编程之病毒篇(基础篇)
2020/02/04 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
Sandro Paris美国官网:典雅别致的法国时尚服饰品牌
2017/12/26 全球购物
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
普通党员群众路线教育实践活动心得体会
2014/11/04 职场文书
2015年护理工作总结范文
2015/04/03 职场文书
事业单位工作人员岗前培训心得体会
2016/01/08 职场文书
mysql使用 not int 子查询隐含陷阱
2022/04/12 MySQL