12306自动刷票下单-登录篇(一)

article/2025/8/19 20:30:13

12306网站推出图片验证码以后,对于抢票软件就提出了更高的要求,本篇并不涉及自动识别验证码登录(主要是博主能力所限),提供一个途径-打码平台,这个几乎是可以破解所有验证码了,本篇主要是分享一下12306网站登录的流程的学习,勿吐槽,有问题请指正,博主也是刚开始接触爬虫,大家共勉共勉。

废话不多说了,直接干吧

 这里写图片描述

首先打开12306登录页面https://kyfw.12306.cn/otn/login/init

 这里写图片描述

输入账号密码直接登录,会转入到下面的页面https://kyfw.12306.cn/otn/index/initMy12306

 这里写图片描述

红线划掉的就是用户名,那么我们最终就是要访问这个网页查找到我们的用户名,简单吧

 这里写图片描述

好了,不闹了,看一下我们整个登录过程中的请求吧

 这里写图片描述

这里缺少了打开登录页面的请求,如果你没有发现,那我刚说了你就应该发现,这个登录页面是必须的,这里说一下我的理解,登录过程中我们是要发送验证码的,验证码作为独立的请求发送,那么服务器是要知道这个验证码是由张三发过来的还是由李四发过来的,所以当我们打开登录页面的时候,服务器会记录session或者cookie,我们之后的请求都通过携带cookie让服务器知道是我张三发送的请求,而不是李四。大概就是这么回事,可能说的不太对,我也就理解了这么点,见谅见谅。

这里我们使用requests库,不要太方便

import requests# 一个提供UserAgent的库,不用自己再去搞那么多了,方便
from fake_useragent import UserAgent# 禁用安全请求警告 from urllib3 import disable_warnings from urllib3.exceptions import InsecureRequestWarning disable_warnings(InsecureRequestWarning) session = requests.session() # 设置不验证SSL,你应该看到了HTTPS session.verify = False ua = UserAgent(verify_ssl=False) # 请求头,最最基础的反爬伪装 headers = { "User-Agent": ua.random, "Host":"kyfw.12306.cn", "Referer":"https://kyfw.12306.cn/otn/passport?redirect=/otn/" } # 打开登录页面 url = "https://kyfw.12306.cn/otn/login/init" session.get(url, headers=headers) 

requests库的session会为我们保存cookie信息,只要我们继续使用session请求即可。

这里要先解释一下,我使用的是Chrome浏览器,但是很多请求里面确看不到response数据,真的很操蛋,我写的时候每一个请求都用代码打印出来,很痛苦,

因为想写篇博客,要给大家截图,所有装了个虚拟机Windows xp,安装了Fiddler才看到一些信息,我还是习惯用Chrome,我尽量按照Chrome的方式去说明。 这里写图片描述

在所有的请求里面,我们主要关注Type等于document和xhr的请求,按照从上到下的方式就是整个流程中请求的先后顺序。我们可以看到init后面uamtk和captcha_js.js?_=1510993251087, 这里写图片描述

很明显这个是我们打开登录页面时发送的请求,服务端告诉我们:你还没登录呢,废话我只是打开登录界面,当然没登录了。不过我们大概知道了,发送https://kyfw.12306.cn/passport/web/auth/uamtk这个请求,服务器会给我们反馈一些登录信息。后面那个请求很明显是js,我们暂时不用管。

下面是这个xhr请求:https://kyfw.12306.cn/passport/captcha/captcha-check 这里写图片描述

这个是发送验证码的请求,12306的验证码属于坐标型验证码,所有我们看到发送的是一段坐标,在这个请求上面我们看到https://kyfw.12306.cn/passport/captcha/captcha-image?login_site=E&module=login&rand=sjrand&0.9919795512111436 这里写图片描述

哦,这个是请求验证码的,要发送验证码请求,自然要先获取验证码喽,多请求几次发现表单里除了最后一个随机数以外,其他的数据没有变化。接下来就是验证码的坐标了

 这里写图片描述 

首先是找原点坐标,这个跟正常登录发送的坐标对比一下,大概就能确定,然后是确定坐标的拼接,x1,y1还是y1,x1,这个也是和正常登录发送的坐标大概对比一下就能确定了,我这里只说大概原理,具体情况自己去尝试一下。下面上代码

验证码函数

def captcha():# 请求数据是不变的,随机数可以使用random.random()data = {"login_site": "E", "module": "login", "rand": "sjrand", "0.17231872703389062":"" } # 获取验证码 param = parse.urlencode(data) url = "https://kyfw.12306.cn/passport/captcha/captcha-image?{}".format(param) response = session.get(url, headers=headers) if response.status_code == 200: # 获取验证码并打开,然后...手动找一下坐标吧,我开始就说了不涉及自动识别验证码的 file = BytesIO(response.content) img = Image.open(file) img.show() positions = input("请输入验证码: ") # 发送验证码 data = { "answer": positions, "login_site": "E", "rand": "sjrand" } url = "https://kyfw.12306.cn/passport/captcha/captcha-check" response = session.post(url, headers=headers, data=data) if response.status_code == 200: result = json.loads(response.text) print(result.get("result_message")) # 请求成功以后返回的code是4,这个看请求信息就知道了 return True if result.get("result_code") == "4" else False return False 

验证码通过以后,就要发送账号登录了,继续看下面的请求https://kyfw.12306.cn/passport/web/login 这里写图片描述

账号密码登录成功,看到没?好了

 这里写图片描述 

还没完呢,为啥捏?还没看到initMy12306这个请求呢 继续往下撸吧,https://kyfw.12306.cn/passport/web/auth/uamtk,这个请求熟悉不?不熟悉的去翻前面 这里写图片描述

对比一下,前后不一样吧,验证通过,开心吧,哈哈! 咦!好像还多了点东西哦,newapptk什么鬼呢?不明白,继续看下面

敲黑板!!!是看后面的请求,你在看哪个下面,睡着了吗?https://kyfw.12306.cn/otn/uamauthclient 这里写图片描述

验证通过,不过重点我都圈起来了,还看不见吗?tk,你再看看上面newapptk,明白了吗?上面的请求服务器返回了newapptk数据,我们通过下面的请求把这个值赋给tk,再发送给服务器,然后服务器告诉我们验证通过,

apptk和前面的tk一样,有什么用呢?不知道,那就往下看,哎呀,到站了 https://kyfw.12306.cn/otn/index/initMy12306 这里写图片描述

已经成功了,有我们的账号名了,就是红点的地方,我当然不会给你看我的账号名了,到这里就真的完了,apptk没用到?没用就没用呗,终于结束了 这里写图片描述

我还要贴一下代码,差点忘了

完整的代码

# -*- coding: utf-8 -*-
import json
from urllib import parse
from io import BytesIO from config import * import requests from PIL import Image from fake_useragent import UserAgent # 禁用安全请求警告 from urllib3 import disable_warnings from urllib3.exceptions import InsecureRequestWarning disable_warnings(InsecureRequestWarning) session = requests.session() session.verify = False ua = UserAgent(verify_ssl=False) headers = { "User-Agent": ua.random, "Host":"kyfw.12306.cn", "Referer":"https://kyfw.12306.cn/otn/passport?redirect=/otn/" } def login(): # 打开登录页面 url = "https://kyfw.12306.cn/otn/login/init" session.get(url, headers=headers) # 发送验证码 if not captcha(): return False # 发送登录信息 data = { "username":USER_NAME, "password":PASSWORD, "appid":"otn" } url = "https://kyfw.12306.cn/passport/web/login" response = session.post(url, headers=headers, data=data) if response.status_code == 200: result = json.loads(response.text) print(result.get("result_message"), result.get("result_code")) if result.get("result_code") != 0: return False data = { "appid":"otn" } url = "https://kyfw.12306.cn/passport/web/auth/uamtk" response = session.post(url, headers=headers, data=data) if response.status_code == 200: result = json.loads(response.text) print(result.get("result_message")) newapptk = result.get("newapptk") data = { "tk":newapptk } url = "https://kyfw.12306.cn/otn/uamauthclient" response = session.post(url, headers=headers, data=data) if response.status_code == 200: print(response.text) url = "https://kyfw.12306.cn/otn/index/initMy12306" response = session.get(url, headers=headers) if response.status_code == 200 and response.text.find("用户名") != -1: return True return False def captcha(): data = { "login_site": "E", "module": "login", "rand": "sjrand", "0.17231872703389062":"" } # 获取验证码 param = parse.urlencode(data) url = "https://kyfw.12306.cn/passport/captcha/captcha-image?{}".format(param) response = session.get(url, headers=headers) if response.status_code == 200: file = BytesIO(response.content) img = Image.open(file) img.show() positions = input("请输入验证码: ") # 发送验证码 data = { "answer": positions, "login_site": "E", "rand": "sjrand" } url = "https://kyfw.12306.cn/passport/captcha/captcha-check" response = session.post(url, headers=headers, data=data) if response.status_code == 200: result = json.loads(response.text) print(result.get("result_message")) return True if result.get("result_code") == "4" else False return False if __name__ == "__main__": if login(): print("Success") else: print("Failed") 

执行结果添一下,好累,我要去吃饭了

 这里写图片描述

我讨厌写文章,真的,这是我的第一篇爬虫文章了,写代码过程用了两个小时,写文档用了整整一个下午,是的,一个下午。哎,我果然还是不擅长写文章,之前想要写python微信公众号二次开发,结果写了好几次都是开头就删掉了,文才真的很烂,而且通篇逻辑混乱,我自己都看不下去。大家凑合看吧,希望多提意见,我一定虚心接受,慢慢改正。


http://chatgpt.dhexx.cn/article/u4prE9Oa.shtml

相关文章

12306刷票脚本

我也在刷票,不过发现12306还是发生了一些变化,在使用过程中,发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下: 防自动退出 添加刷到票后发起桌面通知 勾选某些类型的车 选择发站站点 …

c#模拟网页实现12306登陆、自动刷票、自动抢票完全篇

这一篇文章,我将从头到尾教大家使用c#模拟网页面登陆12306网站,自动刷票,选择订票人,到最后一步提交订单。研究过HTTP协议的童鞋们都知道,我们在访问网站时,是有两种方式的,POST和GET方式&#…

你距离家只差一个刷票脚本而已——12306刷票脚本升级版

马上就要回家了,票还没有。你是否用到了我去年发布的刷票脚本呢。传送门~ 我也在刷票,不过发现12306还是发生了一些变化,在使用过程中,发现会自动退出登录。所以对脚本做了一些改动。顺便加了一些新的功能。具体如下:…

搞技术的要不要学习财务知识

越是大型的集团或者企业,公司里面设立的部门就越多,也越细化,各部门之间既相互独立管理,又是相互的辅助支持,所以在工作中经常遇到这样的一个问题,就是做技术的要不要学习财务知识。这个问题其实就是把技术…

财务管理的一般常识

2019独角兽企业重金招聘Python工程师标准>>> 财务总监助理在协助财务总监做好企业理财规划与管理的时候需要首先了解以下的有关知识: —、财务和企业财务管理的概念 所谓“财务”,通俗地讲就是有关“钱财”的事务。从事一切事业都离不开钱财&…

财政系统基本知识

文章目录 一、基础数据1、单位管理修改2、部门信息 二、资产账1、卡片登记(新增资产)2、新增资产入账,也可批量入账3、卡片变动1)普通信息变动 >>>普通信息确认2)资产价值变动3)资产大类变动4&…

身为企业管理者,必须了解的财务知识

财务管理工作是企业管理工作中的核心内容,也是企业管理工作中的难点内容,对于集团企业来讲更是任务艰巨而又问题频出。然而,信息时代的来临为解决和完善企业财务管理问题提供了新思路,就集团企业而言,财务管理信息化基…

业务:财务会计业务知识

一、引言 会计是以货币为主要计量单位,对企业、事业、机关、团体及其他经济组织的经济活动进行记录、计算、控制、分析、报告,以提供财务和管理信息的工作。会计的职能主要是反映和控制经济活动过程,保证会计信息的合法、真实、准确和完整&a…

软件测试分类

一、软件测试的分类 1、按开发阶段:单元测试、集成测试、系统测试、验收测试 2、按测试实施组织:α、β、第三方 3、按测试执行方式:静态测试、动态测试 4、按是否查看代码:黑盒测试、白盒测试、灰盒测试 5、按是否手工执行划分&a…

【软件工程】软件测试报告——软件测试说明书

【备注】本说明书由华中农业大学2018级计算机科学与技术专业的刘畅、刘铠铭、张清望、卢家伟四位同学共同完成。 文章目录 1 引言1.1 编写目的1.2 背景1.3 术语和缩略词1.4 参考资料 2 测试用例设计3 测试结果及分析3.1 测试环境3.2 测试用例执行3.3 结论及建议 1 引言 1.1 编…

软件测试模型有哪些?

目录 1、瀑布模型 2、V模型 3、W模型 4、H模型 5、X模型 6、前置测试模型 1、瀑布模型 瀑布模型(Waterfall Model)是一个软件生命周期模型,开发过程是通过设计一系列阶段顺序展开的,从系统需求分析开始直到产品发布和维护&…

1.软件测试-----软件测试的基本概念

目录 一、软件测试的基本概念 1.什么是软件测试? 2.软件测试和软件开发的区别? 3.什么是需求? 4.什么是BUG? 5.如何描述一个BUG? 6.BUG的级别? 7.BUG的生命周期? 8.软件测试的生命周期&#xff1…

软件测试菜鸟入门

更新版:https://weltest.blog.csdn.net/article/details/110529745 视频课程:https://edu.csdn.net/course/detail/23459 目录 前言... 3 软件测试流程... 3 提取测试点... 4 设计测试用例与用例评审... 4 测试类型选择... 5 测试执行与缺陷管理.…

什么是软件测试?

什么是软件测试? 软件测试的定义:在一定条件下对软件进行操作,发现软件的问题,提高软件的质量。 软件测试在开发中的有着重要地位。软件测试在各阶段的完成相应的任务,需求测试,架构测试,详细测…

2022最新软件测试八股文,能不能拿心仪Offer就看你背得怎样了

前言 鉴于目前测试就业越来越严峻,内卷也成了测试领域的代名词了。我的一个HR朋友告诉我,由于门槛较低,现在普通测试岗(偏功能)的投递比已经将近100,也就是一个岗位差不多有百分简历投进来。 所以现在还想…

想自学软件测试?一般人我还是劝你算了吧。。。

本人7年测试经验,在学测试之前对电脑的认知也就只限于上个网,玩个办公软件。这里不能跑题,我为啥说:自学软件测试,一般人我还是劝你算了吧?因为我就是那个一般人! 软件测试基础真的很简单&…

【云服务器】免费云服务器推荐

你还在因为阿里云、腾讯云等的云服务器价格昂贵而放弃自己建站、建服务器的梦想吗?还在因为阿里云、腾讯云推出的免费产品不能永久使用而烦恼吗? 优豆云就能帮你解决。重点是,它提供的云服务器是免费的!!!…

如何操作申请免费云服务器?

2核4G、4核8G服务器申请操作: 第一步: 注册天翼云账号通过以下链接 注册账号https://www.ctyun.cn/agent/#/invitation/20753574或者扫二维码注册 第二步: 注册号账号进行实名认证 个人用户可通过“身份证认证”(扫码认证&…

云服务服务器免费使用

写作目的 最近买了个2核4G的云服务器,自己平时就是写个demo。感觉服务器资源浪费了,所以搭建了一些测试环境方便小伙伴使用。 云服务器免费使用 注意:仅限普通用户 ip:114.115.208.175 用户名:marenlvdou 密码:lvd…

2021各厂免费云服务器申请攻略(阿里云/腾讯云/华为云)

阿里云腾讯云华为云一直都有免费云服务器提供,企业用户个人用户可以申请的免费云服务器配置及免费时长都不同,云服务器吧来详细说下阿里云免费云服务器、腾讯云免费云服务器和华为云免费服务器申请地址、申请条件及申请攻略: 阿里云免费云服…