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中mechanize库的简单使用示例
Jan 10 Python
Python回调函数用法实例详解
Jul 02 Python
Python实现进程同步和通信的方法
Jan 02 Python
Python单向链表和双向链表原理与用法实例详解
Aug 31 Python
python去除拼音声调字母,替换为字母的方法
Nov 28 Python
postman传递当前时间戳实例详解
Sep 14 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
Python Websocket服务端通信的使用示例
Feb 25 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
Selenium+BeautifulSoup+json获取Script标签内的json数据
Dec 07 Python
Pyhton爬虫知识之正则表达式详解
Apr 01 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五种设计模式小结
2011/03/23 PHP
使用PHP获取当前url路径的函数以及服务器变量
2013/06/29 PHP
Zend Framework页面缓存实例
2014/06/25 PHP
[全兼容哦]--实用、简洁、炫酷的页面转入效果loing
2007/05/07 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
js读取注册表的键值示例
2013/09/25 Javascript
jquery实现标签支持图文排列带上下箭头按钮的选项卡
2015/03/14 Javascript
Css3制作变形与动画效果
2015/07/24 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
JS本地刷新返回上一页代码
2016/07/25 Javascript
使用JS读取XML文件的方法
2016/11/25 Javascript
vue之数据交互实例代码
2017/06/20 Javascript
vue2中filter()的实现代码
2017/07/09 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
JavaScript设计模式之单例模式简单实例教程
2018/07/02 Javascript
自己动手封装一个React Native多级联动
2018/09/19 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
javascript实现贪吃蛇经典游戏
2020/04/10 Javascript
vue实现列表滚动的过渡动画
2020/06/29 Javascript
python3.3实现乘法表示例
2014/02/07 Python
使用Python编写Linux系统守护进程实例
2015/02/03 Python
python3 中时间戳、时间、日期的转换和加减操作
2020/07/14 Python
越南综合购物网站:Lazada越南
2019/06/10 全球购物
Mountain Warehouse德国官网:英国户外零售商
2019/08/11 全球购物
学校社会实践活动总结
2014/07/03 职场文书
水利水电建筑施工应届生求职信
2014/07/04 职场文书
感恩祖国演讲稿
2014/09/09 职场文书
雷锋之歌观后感
2015/06/10 职场文书
2016年七夕爱情寄语
2015/12/04 职场文书
2016年社会主义核心价值观心得体会
2016/01/21 职场文书
利用html+css实现菜单栏缓慢下拉效果的示例代码
2021/03/30 HTML / CSS
解决Maven项目中 Invalid bound statement 无效的绑定问题
2021/06/15 Java/Android
配置nginx负载均衡
2022/05/06 Servers
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript