侯体宗的博客
  • 首页
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python实现12306登录并保存cookie的方法示例

Python  /  管理员 发布于 7年前   390

经过倒腾12306的登录,还是实现了,请求头很重要...各位感兴趣的可以继续写下去.....

import sysimport timeimport requestsfrom PIL import Imageimport jsonimport osimport Headersimport SessionUtilimport UrlUtils class Ticket(object):  def __init__(self):    self.answer = {      "1": "40,40",      "2": "110,40",      "3": "180,40",      "4": "260,40",      "5": "40,120",      "6": "110,120",      "7": "180,120",      "8": "260,120",    }    self.answer_code=''    self.tk = ''   def getDEVICEID(self):    r = requests.get(UrlUtils.DEVICE_url, headers=Headers.BaseHead).text    try:      dic = json.loads(r[18:-2].replace(" ", ""))    except Exception:      return ""    return dic   # 初始化 获取设备id 设置为cookie 必须  def initialize(self):    dic = self.getDEVICEID()    if dic == "":      print("网络获取指纹失败!使用默认id")      RAIL_EXPIRATION = "1576651914389"      RAIL_DEVICEID = "lBJStCNl0YGo_HVkGtwOo2LWziXcwzpIk5gc2vAILNYdRfaeZ04nJtZ1JZwgQIssMDksn10rAz6Hz-bekeufhAusaKJId8f2BCg05ocgrzc8-chv8h4IB-lQ9H04XjLXr2fbnHw-SLZga3PewEfgPz2s-mhp7NAz"    else:      print("网络获取指纹成功!")      RAIL_EXPIRATION = dic["exp"]      RAIL_DEVICEID = dic['dfp']    SessionUtil.setCookie("RAIL_EXPIRATION", RAIL_EXPIRATION)    SessionUtil.setCookie("RAIL_DEVICEID", RAIL_DEVICEID)   def conf(self):    res = SessionUtil.session.post(url=UrlUtils.Conf_url, data=None, headers=Headers.ConFHeader)   def uamtkstatic(self):    data = {      'appid': 'otn'    }    SessionUtil.session.post(url=UrlUtils.UamtkStatic_url, data=data, headers=Headers.UamtkStaticHead)   def get_img_code(self):    try:      img = SessionUtil.session.get(url=UrlUtils.Down_mg_url, headers=Headers.BaseHead).content      with open('code.jpg', 'wb') as f:        f.write(img)    except Exception:      print("下载图片错误! 等待重试~~")      time.sleep(1)      self.get_img_code()   def check_img(self):    try:      Image.open('code.jpg').show()    except Exception:      time.sleep(2)      Image.open('code.jpg').show()    print("+---1-------+----------+----------+----------+")    print("|  1   |  2   |  3   |  4   |")    print("|----------|----------|----------|----------|")    print("|  5   |  6   |  7   |  8   |")    print("+----------+----------+----------+----------+")    input_code = input("请在1―8中选择输入验证图片编号,以半角','隔开。(例如:1,3,5):")    answer_code = ''    try:      for i in input_code.split(','):        answer_code += ',' + self.answer[i] if (i is not input_code[0]) else self.answer[i]    except Exception as e:      print('输入错误请重新输入!')      self.check_img()    data = {      'answer': answer_code,      'rand': 'sjrand',      'login_site': 'E',    }    response = SessionUtil.session.get(url=UrlUtils.Check_img_url, params=data, headers=Headers.BaseHead, )    check_result = json.loads(response.text)    print(check_result)    try:      if check_result['result_code'] == '4':        print('*' * 20 + '验证码正确' + '*' * 20)        self.answer_code=answer_code      else:        self.get_img_code()        self.check_img()    except Exception:      self.get_img_code()      self.check_img()   # 校验密码正确  def login(self, answer_code):    user = ''    password = ''    try:      with open("user.conf", "r", encoding="utf-8") as f:        user = f.readline().strip().replace("[", '').replace("]", '').replace("name=", '')        password = f.readline().strip().replace("[", '').replace("]", '').replace("pwd=", '')        if user == "" or password == "":          raise Exception    except Exception:      user = input("账号____:")      password = input("密码____:")     formdata = {      'username': user,      'password': password,      'appid': 'otn',      'answer': answer_code    }    login_result = SessionUtil.session.post(url=UrlUtils.Login_url, data=formdata, headers=Headers.BaseHead)    login_result.encoding = 'utf-8'    login_result = login_result.json()    print(login_result)    if login_result["result_code"] != 0: #{'result_message': '登录名不存在。', 'result_code': 1}      sys.exit(0)   # 二次校验  def userLogin(self):    # 获取一系列的cookie值才能真正的登录成功    response = SessionUtil.session.get(url=UrlUtils.UserLogin_url, headers=Headers.UserLoginHead)    # 更新JSESSIONID route    response = SessionUtil.session.get(url=UrlUtils.Redirect_UserLogin_Url, headers=Headers.RedirectHead)   def uamtk(self):    # 获取 tk 下一个请求需要提交 tk 值    data = {'appid': 'otn'}    uamtk_page = SessionUtil.session.post(url=UrlUtils.Uamtk_url, data=data, headers=Headers.UamtkHeader)    uamtk_page.encoding = 'utf-8'    try:      result = uamtk_page.json()      print(result)      if result['result_code'] != 0:        raise Exception(result['result_message'])      tk = result['newapptk']      self.tk = tk    except Exception:      print("获取tk失败!")      print("重试")      self.run()   def Uamauthclient(self):    data = {'tk': self.tk}    response = SessionUtil.session.post(url=UrlUtils.Uamauthclient_url, data=data,          headers=Headers.UamauthclientHeader)    res = response.text    try:      dic = json.loads(res)      print(dic)      print(dic["username"] + ",欢迎登录!")    except:      print("登录失败!")      self.run()    # '{"result_code":0,"result_message":"验证通过","username":"XXX","apptk":"36yslXHez3_68-LtHvhI61mZkranjdw6kT9j4UMwEqrw1w0"}'   def saveCookie(self):    SessionUtil.save_cookies("12306cookies.txt")   def getInfo(self):     try:      re = SessionUtil.session.post("https://kyfw.12306.cn/otn/modifyUser/initQueryUserInfoApi",         headers=Headers.UserInfoHead)      print(re.text)    except:      print("获取失败")   def run(self):    self.initialize()    self.conf()    self.uamtkstatic()    self.get_img_code()    self.check_img()    self.login(self.answer_code)    self.userLogin()    self.uamtk()    self.Uamauthclient()    self.saveCookie()    self.conf()    self.getInfo()  if __name__ == '__main__':  t = Ticket()  result = "":  try:     with open("12306cookies.txt", "r", encoding="utf-8") as fr:      result = fr.read()   except Exception:     pass  if result != "":    SessionUtil.load_cookies("12306cookies.txt")    t.initialize()    t.conf()    t.uamtkstatic()    t.userLogin()    t.uamtk()    t.Uamauthclient()    t.getInfo()  else:    t.run()

Headers:

BaseHead = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  "Host": "kyfw.12306.cn",  "Referer": "https://kyfw.12306.cn/otn/resources/login.html"} UserLoginHead = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  'Content-Type': 'application/x-www-form-urlencoded',  'Referer': 'https://kyfw.12306.cn/otn/resources/login.html',  'Upgrade-Insecure-Requests': '1',  'Accept-Encoding': 'gzip, deflate, br',  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',}RedirectHead = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  'Referer': 'https://kyfw.12306.cn/otn/resources/login.html',  'Upgrade-Insecure-Requests': '1',  'Accept-Encoding': 'gzip, deflate, br',  'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8', } UamtkHeader = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',  'Referer': 'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin',  'Accept-Encoding': 'gzip, deflate, br',  'Accept': r'application/json, text/javascript, */*; q=0.01',  'Origin': 'https://kyfw.12306.cn'} UamauthclientHeader = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  "Host": "kyfw.12306.cn",  'Referer': r'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin',}ConFHeader = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  "Host": "kyfw.12306.cn",  "Referer": "https://kyfw.12306.cn/otn/resources/login.html"} UamtkStaticHead = {  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 Edge/16.16299",  'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',  'Referer': 'https://kyfw.12306.cn/otn/resources/login.html',} UserInfoHead = {  "Accept": "*/*",  "Accept-Encoding": "gzip, deflate, br",  "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8",  "Cache-Control": "no-cache",  "Connection": "keep-alive",  "Content-Length": "0",  "Host": "kyfw.12306.cn",  "Origin": "https://kyfw.12306.cn",  "Pragma": "no-cache",  "Referer": "https://kyfw.12306.cn/otn/view/information.html",  "Sec-Fetch-Mode": "cors",  "Sec-Fetch-Site": "same-origin",  "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36",  "X-Requested-With": "XMLHttpRequest",}

SessionUtil

import requestsimport urllib3from http import cookiejarurllib3.disable_warnings()session = requests.Session()session.verify = False # 取消验证 SSL def setCookie(key,value):  session.cookies.set(key,value)  def removeCookies(key=None):  session.cookies.set(key, None) if key else session.cookies.clear()  def load_cookies(cookie_path="12306cookies.txt"):  load_cookiejar = cookiejar.LWPCookieJar()  load_cookiejar.load(cookie_path, ignore_discard=True, ignore_expires=True)  load_cookies = requests.utils.dict_from_cookiejar(load_cookiejar)  session.cookies = requests.utils.cookiejar_from_dict(load_cookies) def save_cookies(cookie_path="12306cookies.txt"):  new_cookie_jar = cookiejar.LWPCookieJar(cookie_path)  requests.utils.cookiejar_from_dict({c.name: c.value for c in session.cookies}, new_cookie_jar)  new_cookie_jar.save(cookie_path, ignore_discard=True, ignore_expires=True)

UrlUtils

import timeDEVICE_url= 'https://kyfw.12306.cn/otn/HttpZF/logdevice?algID=cS6Aw4inWV&hashCode=lZGX9bmwQGHuZPviiiBCrtoNPyHZ4pBG3jvF2dybZ6o&FMQw=0&q4f3=zh-CN&VySQ=FGGxHVb3AzlSM-oikvoZfGsTbD48DQud&VPIf=1&custID=133&VEek=unknown&dzuS=32.0 r0&yD16=0&EOQP=38437f3289ca7a613bb292a3de0dba2b&jp76=df7f80581243b062f0c64efc90666cd0&hAqN=Win32&platform=WEB&ks0Q=7523081fcf2454464b148398defb390a&TeRS=864x1536&tOHY=24xx864x1536&Fvje=i1l1o1s1&q5aJ=-8&wNLf=99115dfb07133750ba677d055874de87&0aew=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36&E3gR=7a13398746be6f51fe069c8a25001f12×tamp=' + str(round(time.time() * 1000)) #验证码下载地址Down_mg_url = 'https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&{}'.format(int(time.time() * 1000)) #验证码 验证地址Check_img_url = 'https://kyfw.12306.cn/passport/captcha/captcha-check'#登录地址 校验账号密码Login_url = 'https://kyfw.12306.cn/passport/web/login' #二次校验UserLogin_url = 'https://kyfw.12306.cn/otn/login/userLogin' #重定向二次校验Redirect_UserLogin_Url = 'https://kyfw.12306.cn/otn/passport?redirect=/otn/login/userLogin' #获取 tk关键 urlUamtk_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk' # 使用tk 校验Uamauthclient_url = 'https://kyfw.12306.cn/otn/uamauthclient' #使用cookie直接 请求这个就可以访问 apiConf_url = 'https://kyfw.12306.cn/otn/login/conf'  UamtkStatic_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk-static' initMy12306Api_url="https://kyfw.12306.cn/otn/index/initMy12306Api"[/mw_shl_code]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    使用Python测试Ping主机IP和某端口是否开放的实例
    下一条:
    python django中8000端口被占用的解决
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go语言中实现字符串可逆性压缩及解压缩功能(0个评论)
    • 使用go + gin + jwt + qrcode实现网站生成登录二维码在app中扫码登录功能(0个评论)
    • 在windows10中升级go版本至1.24后LiteIDE的Ctrl+左击无法跳转问题解决方案(0个评论)
    • 智能合约Solidity学习CryptoZombie第四课:僵尸作战系统(0个评论)
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客