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

经过倒腾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]

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值