用python登录12306 并保存cookie
一篇拿来记录的文章,是看其他博主写的,想在这记一下
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"
}郑州做人流手术要多少钱 http://www.sptdnk.com/
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]
免责声明:仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
用python登录12306 并保存cookie的更多相关文章
- FormsAuthentication 登录兼容 IE11 保存cookie
现象:使用FormsAuthentication进行登录验证,在IE11客户端无法保存cookie 解决方法:在web.config中的forms中增加cookieless="UseCook ...
- Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网)
Python爬虫教程-14-爬虫使用filecookiejar保存cookie文件(人人网) 上一篇介绍了利用CookieJar访问人人网,本篇将使用filecookiejar将cookie以文件形式 ...
- python+pytest接口自动化(9)-cookie绕过登录(保持登录状态)
在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理:再者,每次请求接口 ...
- Android WebView保存Cookie登录
因项目需要,需要在App中嵌入网页,使用Nativie方式登录,然后将cookie保存到WebView中,实现免登录功能.同步Cookie到WebView的方法网上有大量的参考资料,也可以参考下面的代 ...
- python爬虫 - Urllib库及cookie的使用
http://blog.csdn.net/pipisorry/article/details/47905781 lz提示一点,python3中urllib包括了py2中的urllib+urllib2. ...
- 使用 Python 登录网站(转)
对于大部分论坛,我们想要抓取其中的帖子分析,首先需要登录,否则无法查看. 这是因为 HTTP 协议是一个无状态(Stateless)的协议,服务器如何知道当前请求连接的用户是否已经登录了呢?有两种方式 ...
- [转]关于NTLM认证的.NET,php,python登录
本文转自:http://www.cnblogs.com/myx/archive/2013/03/25/php-ntlm-python-net.html 早期SMB协议在网络上传输明文口令.后来出现 L ...
- 4 使用Selenium模拟登录csdn,取出cookie信息,再用requests.session访问个人中心(保持登录状态)
代码: # -*- coding: utf-8 -*- """ Created on Fri Jul 13 16:13:52 2018 @author: a " ...
- Python爬虫入门六之Cookie的使用
大家好哈,上一节我们研究了一下爬虫的异常处理问题,那么接下来我们一起来看一下Cookie的使用. 为什么要使用Cookie呢? Cookie,指某些网站为了辨别用户身份.进行session跟踪而储存在 ...
随机推荐
- swift(五)swift的函数
/** * 函数的定义和调用 */ func showIntegerArray(array:[Int]) { for a in array { println("\(a)") } ...
- xwiki 知识管理系统
搭建一个知识管理平台, 用于知识库管理/规范管理, 可以作wiki, 可以将word/excel等导入进去, 支持全文搜索, 可以记周报, 会议纪要. 现在有很多文档管理系统, 比如阿里的语雀.腾讯的 ...
- rust语法
目录 rust语法 前言 一.数据类型 1.1 标量scalar 1.2 复合compound 1.3 切片slice 1.4 引用(借用)reference 1.5 智能指针smart pointe ...
- 自定义vue的loading插件
在一般的vue项目中,都会用到Loading或者Alert之类的弹窗浮层,而他们是一种比较高频率出现的组件. 一般情况下,我们都会去直接import该组件,然后直接以标签的形式引用进去当前页面组件中, ...
- pycharm添加断点,分段运行,以及继续运行;
1.打断点,只需在代码的前面单机左键即可:2.运行,点击Debug...(如图,像贝壳一样的图标),只会运行第一个红点前的代码: 3.此时若想将第2个红点前的代码运行完毕:点击Resume Progr ...
- 小程序的flex布局
小程序建议使用flex布局进行排版 flex就是一个盒装弹性布局 flex是一个容器,所有子元素都是他的成员 小程序的flex布局 定义布局 display:flex flex容器的属性: flex- ...
- 面试必备的13道可以举一反三的Vue面试题
Vue框架部分我们会涉及一些高频且有一定探讨价值的面试题,我们不会涉及一些非常初级的在官方文档就能查看的纯记忆性质的面试题,比如: * vue常用的修饰符? * vue-cli 工程常用的 n ...
- day6_logging模块
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2019/7/11 9:12 # @Author : 大坏男孩 # @File : da ...
- UVA11374 Airport Express 正反两次最短路
问题描述 洛谷(有翻译) 吐槽 一道坑题. 如何对待商务票 因为商务票只有一张,所以在\(k\)条边中只有一条边会被选中,很显然,最后这条边会被枚举. 如何选择使用商务票的边 假设我们正在枚举这条边, ...
- 其它 用VB6创建ActiveX.dll
1.打开VB6 2.选择 ActiveX DLL,点击打开 3.在窗口输入测试代码 Public Function addstr(str As String) As String addstr = & ...