12306抢票客户端(1)账户登录Post表单

每次回家坐火车都需要使用软件来抢票,而前段时间爆出了“12306网站密码大规模泄露”的事件。泄露的罪魁祸首就是那些第三方抢票软件!因此,自己写一个抢票软件来抢票,无毒无害,效率更高。

1. 破解登录表单

12306在登录账户时,使用了验证码、加载动态js、查找抢票软件关键词、加密表单内容的反抢票软件措施,因此需要搞清登录表单的每一个值是如何得到的。

登录时,需要向 https://kyfw.12306.cn/otn/login/loginAysnSuggest 这个url发送一个POST,内容如下:

oginUserDTO.user_name 和 userDTO.password 为自己账户的用户名和密码。

randCode为验证码图片中的字符。

randCode_validate 和 myversion 始终为一个定值。

第五行的表单值为动态生成的,每次都不固定。

因此,目前还得不到的就是验证码和动态生成的表单值。

1.1 验证码

验证码比较简单,经过抓包分析,获取验证码的图片的 url 为 https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.7544988989830017 最后的这一串数字,随机生成就好。

验证码验证 url 为 https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn ,POST内容为 :

randCode 为验证码,rand 和 randCode_validate 始终为定值。

需要注意的是,经过试验,验证码的验证请求需要重复发送两次

1.2 动态表单值

这个表单值是成功的关键,需要生成正确的值,不然提交表单后会被视为抢票软件。同时,在之后的订单提交的表单中会多次用到这个方法来生成一个动态值。

经过对html的分析和抓包分析,刚才那个动态的表单值是在https://kyfw.12306.cn/otn/dynamicJs/lusnqex 这个 js 脚本中产生的,而这个脚本的
url 每次不固定,需要在登录界面的html 中提取:

分析这个 js 脚本,我们可以看到这个动态值是在这个位置产生的:

表单的 key 为 keyValues[0] , value 为
encode32(bin216(Base32.encrypt(keyVlues[1], keyVlues[0]))) 
这个语句的结果,其中 encode32、bin216这些函数为这个 js 脚本内的几个加密函数。

分析来看这几个加密函数并不是采用标准的加密算法,而是对标准的加密算法经过了一些修改。

keyValues 是由gc()函数产生:

这个函数是分析当前html是否含有 js 抢票插件所产生的一些 html 元素,看来12306 在防范抢票插件里也下了不少功夫。经过试验,如果没有抢票插件这个函数将返回“NzU5MTI2:1111” 这个字符串,其中 NzU5MTI2 是gc函数中的 key 变量,每次都不同,是动态生成的。

得到了gc函数的值,下面就是得到那几个加密函数的算法。由于这段 js 是经过变量混淆过的代码,纯看代码来还原加密算法所需要的时间将会很多。于是,我采取了一个曲线救国的方式,将这个几个加密函数原封不动的放到 Java 程序里,然后使用 Java 内的 Javascript 引擎去运行它,最后得到加密后的值。(其它语言类似,需要用一个 Javascript 引擎来运行这段 js 代码)

到这里,我们就将登陆所需要的表单数据都得到了。但是此时向登录 url 发送请求,依然无法正常登录。经过与浏览器生成的请求进行一步步比对,发现我缺少一个 html 头—— “Referer” ,即浏览器的引用url,将这个值设为登录界面的url ——https://kyfw.12306.cn/otn/login/init
即可。

总结来讲就是以下几步:

1、发送 https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand&0.7544988989830017 请求获取验证码

2、发送 https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn 请求验证输入的验证码是否正确,发送两次

3、在 登录 html 中得到 https://kyfw.12306.cn/otn/dynamicJs/lusnqex  这个动态js的url,在这个 js 中得到key变量的值,然后使用 Java 的 js 引擎调用加密函数对 key:1111进行加密。

4、向 https://kyfw.12306.cn/otn/login/loginAysnSuggest  发送登录 POST请求,注意Http 头 信息的正确。

下一节,将介绍如何获得常用乘车人和余票信息

时间: 2024-08-08 05:34:57

12306抢票客户端(1)账户登录Post表单的相关文章

从零实现一款12306抢票软件(一)

https://zhuanlan.zhihu.com/p/37101955 从零实现一款12306抢票软件(一) 张小方 公众号:easyserverdev.资深开发工程师,擅长客户端与高性能服务器的设计与架构. ?关注他 28 人赞了该文章 写在前面的话 每年逢年过节,一票难求读者肯定不陌生.这篇文章,我们带领读者从零实现一款12306刷票软件,其核心原理还是通过发送http请求模拟登录12306网站的购票的过程,最后买到票. 关于http请求的格式和如何组装http数据包给服务器发送请求,我

PythonGUI+爬虫-从零打造12306抢票软件

课程介绍:此项目为GUI+爬虫+反反爬虫+网络多线程+自动打码+缓存机制+数据清洗等多项技术综合一体的项目;开发中更能体验抓包思路, MVC, 分层, 封装重构等思想 课程目录:001.12306抢票软件项目-项目展示002.12306抢票项目开篇-2019新年快乐!003.抢票软件项目-项目需求和原型图004.网络基础-网络-IP-域名概念005.网络基础-客户端和服务器概念006.网络基础-客户端和服务器角色007.网络基础-HTTP协议-上008.网络基础-HTTP协议-中009.网络基础

四、基于HTTPS协议的12306抢票软件设计与实现--水平DNS并发查询分享

一.基于HTTPS协议的12306抢票软件设计与实现--实现效果 二.基于HTTPS协议的12306抢票软件设计与实现--相关接口以及数据格式 三.基于HTTPS协议的12306抢票软件设计与实现--垂直查询效果分享 哎,又过春节了,同志们又要抢票回家了,这票卖的可真快啊,瞬间的功夫就没有票了,一票难求啊! 这两天闲着没事,刚好又要抢春节的票了.就把原来写的抢票软件给打开试了一下,发现居然不能查票了.于是就又改了一下. 事实上是改了两下,一是:让原来的程序能够用起来(适应新接口),而是加上了水平

微博热搜、天猫秒杀、12306抢票,都是高并发,难点相同吗?

又是一年春运抢票时,12306 又挂了.同为高并发,微博热搜.天猫秒杀.12306 抢票有什么不同呢? 本文完全基于个人的有限的经验和了解,如果文中有什么问题还请大家一起讨论和指正. 微博热搜 「微博热搜」是一个典型的读多写少场景.读今日的热点新闻,写自己的微博评论. 作为一个后端开发,看到"读多写少",第一反应就应该想到要加缓存. 可是,为什么微博总是宕机,抵挡不住 xxx 明星出轨新闻流量? 对微博来说,难点在于热点无法预测,在面对突发流量时,如何快速扩容. 电商秒杀 电商秒杀的大

自制 12306 抢票工具 5秒内完成订票

五一假期到了,身边朋友订票又难订了,抽空做了个订票的小工具,试试了一下,几秒内就可以完成订票过程,效果还不错:(订的快慢取决于验证码的输入速度) 目前验证码自动识别功能还没有加,如果有哪位朋友对验证码识别这块有比较好的建议的,可以告诉我qq:909 888 791,先谢了! 自制 12306 抢票工具 5秒内完成订票,码迷,mamicode.com

基于HTML5手机登录注册表单代码

分享一款基于HTML5手机登录注册表单代码.这是一款鼠标点击注册登录按钮弹出表单,适合移动端使用.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div class="demo"> <nav class="main_nav"> <ul> <li><a class="cd-signin" href="#0">登录</a></li&

bootstrap学习笔记一 登录水平表单

先上效果图: 样式定义: <form class="form-horizontal"> <div class="control-group"> <label class="control-label" for="UserName">用户名</label> <div class="controls"> <input type="tex

如何用python写一个简单的12306抢票软件

所谓抢票实际上是在开始放票的一瞬间第一个发出请求并点击预订.作为程序员的我们,完全可以让程序来做这件事.我花了几个小时写了一个demo.用到的工具集有:Python3.6, Selenium, chromdriver. 程序本身就是流程性的东西,没有什么可介绍的.代码如下 #coding=utf-8 from selenium import webdriver from time import sleep import traceback TICKET_URI = 'https://kyfw.1

分享12306抢票心得-最终篇

针对最近12306服务端封插件(切DNS,切站)的杀手锏,有了比较好的应对方案.此文是最后的分享,借此对几年来的研究心得做个总结. 12306终极杀手锏 12306在上周做了一些重大改变,在服务端实施了插件封杀 一定时间内:切不同站,切不同DNS,弹出“查询失败”,自动被踢出 不用插件,手动稍微换下站查询也会被踢 基本上封杀了现有的所有插件 解决方案及原理 (Chrome)用IFrame或AJAX在后台不停检查登录状态,非登录就自动OCR登录 Fishlee的方案:启用6次匿名查询,再来一次正式