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


Posted in Python onDecember 17, 2019

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

import sys
import time
import requests
from PIL import Image
import json
import os
import Headers
import SessionUtil
import 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 requests
import urllib3
from http import cookiejar
urllib3.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 time
DEVICE_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关键 url
Uamtk_url = 'https://kyfw.12306.cn/passport/web/auth/uamtk'
 
# 使用tk 校验
Uamauthclient_url = 'https://kyfw.12306.cn/otn/uamauthclient'
 
#使用cookie直接 请求这个就可以访问 api
Conf_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 相关文章推荐
python实现搜索指定目录下文件及文件内搜索指定关键词的方法
Jun 28 Python
Python 实现淘宝秒杀的示例代码
Jan 02 Python
Python实现文件信息进行合并实例代码
Jan 17 Python
Python基于pycrypto实现的AES加密和解密算法示例
Apr 10 Python
使用Eclipse如何开发python脚本
Apr 11 Python
Python获取指定字符前面的所有字符方法
May 02 Python
python3.5绘制随机漫步图
Aug 27 Python
Django使用Channels实现WebSocket的方法
Jul 28 Python
基于Python编写一个计算器程序,实现简单的加减乘除和取余二元运算
Aug 05 Python
Python特殊属性property原理及使用方法解析
Oct 09 Python
Python jieba结巴分词原理及用法解析
Nov 05 Python
Python采集壁纸并实现炫轮播
Apr 30 Python
Django多进程滚动日志问题解决方案
Dec 17 #Python
python django中8000端口被占用的解决
Dec 17 #Python
python飞机大战pygame游戏之敌机出场实现方法详解
Dec 17 #Python
解决pycharm上的jupyter notebook端口被占用问题
Dec 17 #Python
解决python web项目意外关闭,但占用端口的问题
Dec 17 #Python
selenium+Chrome滑动验证码破解二(某某网站)
Dec 17 #Python
python飞机大战 pygame游戏创建快速入门详解
Dec 17 #Python
You might like
php中文验证码实现示例分享
2014/01/12 PHP
PHP的邮件群发系统phplist配置方法详细总结
2016/03/30 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
php连接MSsql server的五种方法总结
2018/03/04 PHP
javascript css float属性的特殊写法
2008/11/13 Javascript
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
写出更好的JavaScript程序之undefined篇(中)
2009/11/23 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
wap手机图片滑动切换特效无css3元素js脚本编写
2014/07/28 Javascript
jQuery禁用键盘后退屏蔽F5刷新及禁用右键单击
2016/01/22 Javascript
Jquery修改image的src属性,图片不加载问题的解决方法
2016/05/17 Javascript
AngularJS中使用three.js的实例详解
2017/07/21 Javascript
addeventlistener监听scroll跟touch(实例讲解)
2017/08/04 Javascript
五步轻松实现JavaScript HTML时钟效果
2020/03/25 Javascript
解读ES6中class关键字
2017/11/20 Javascript
vue 实现剪裁图片并上传服务器功能
2018/03/01 Javascript
对angularJs中$sce服务安全显示html文本的实例
2018/09/30 Javascript
JavaScript设计模式之代理模式实例分析
2019/01/16 Javascript
JavaScript中import用法总结
2019/01/20 Javascript
JavaScript实现的开关灯泡点击切换特效示例
2019/07/08 Javascript
详解vue-flickity的fullScreen功能实现
2020/04/07 Javascript
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
python实现外卖信息管理系统
2018/01/11 Python
Python切片工具pillow用法示例
2018/03/30 Python
python爬取网页转换为PDF文件
2018/06/07 Python
python解释器spython使用及原理解析
2019/08/24 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
HTML5 Web Database 数据库的SQL语句的使用方法
2012/12/09 HTML / CSS
中英双版中文教师求职信
2013/10/27 职场文书
中专毕业生自我鉴定
2013/11/21 职场文书
入党积极分子学习两会心得体会范文
2014/03/17 职场文书
销售员试用期自我评价
2014/09/15 职场文书
1000字打架检讨书
2014/11/03 职场文书
Node实现搜索框进行模糊查询
2021/06/28 Javascript