python实现二维码扫码自动登录淘宝

发布时间 - 2026-01-10 22:08:14    点击率:

一个小项目自动登录淘宝联盟抓取数据,由于之前在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请求方法即可,效果也非常不错,运行效果截图:

当然还有一个问题未解决:如何在session过期之后如何自动重新申请(不确定淘定是否支持),由于淘宝是用统一登录而且是独立的服务因此通过浏览器自动刷新或者请求过程中不断去更新cookie都没有获得服务器方更新的票据,不知道这一块大家有没有可以提供的思路。


# python  # 生成二维码  # 二维码识别  # 二维码  # Python自动登录  # Python模块 _winreg操作注册表  # python中扫描条形码和二维码的实现代码  # 通过python扫描二维码/条形码并打印数据  # python利用winreg生成桌面路径及实现扫描二维码图片返回相关信息  # 淘宝  # 跳转  # 这一  # 序列化  # 请在  # 对其  # 言归正传  # 还有一个  # 可以直接  # 不确定  # 验证码  # 两步  # 非常不错  # 装好  # 来写  # 过程中  # 接下去  # 主要是  # 并保存  # 自动登录 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  Laravel事件监听器怎么写_Laravel Event和Listener使用教程  CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】  Android仿QQ列表左滑删除操作  如何在阿里云购买域名并搭建网站?  DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解  Firefox Developer Edition开发者版本入口  Swift中swift中的switch 语句  Laravel如何自定义分页视图?(Pagination示例)  EditPlus中的正则表达式实战(6)  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  如何快速上传建站程序避免常见错误?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  想要更高端的建设网站,这些原则一定要坚持!  如何在宝塔面板创建新站点?  Laravel如何处理异常和错误?(Handler示例)  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  郑州企业网站制作公司,郑州招聘网站有哪些?  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何用美橙互联一键搭建多站合一网站?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  浅述节点的创建及常见功能的实现  Laravel如何使用Passport实现OAuth2?(完整配置步骤)  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  常州企业网站制作公司,全国继续教育网怎么登录?  微信小程序 HTTPS报错整理常见问题及解决方案  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  悟空浏览器如何设置小说背景色_悟空浏览器背景色设置【方法】  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何在七牛云存储上搭建网站并设置自定义域名?  微信公众帐号开发教程之图文消息全攻略  七夕网站制作视频,七夕大促活动怎么报名?  Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全  如何在阿里云虚拟服务器快速搭建网站?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】  Android滚轮选择时间控件使用详解  Laravel Eloquent访问器与修改器是什么_Laravel Accessors & Mutators数据处理技巧  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  JavaScript如何实现类型判断_typeof和instanceof有什么区别  阿里云网站搭建费用解析:服务器价格与建站成本优化指南