2014新版12306接口分析
2014-01-08 22:44
295 查看
文章只做技术研究 如果通过此技术违反国家法律,一切后果自负,作者不承担任何责任。
好吧,先来唠叨,唠叨。这几天大家都沉浸在抢票中,当然我也不例外。
最后总结一句,有抢票软件不一定能抢到票,没抢票软件一定是抢不到票,网页一点就死了。
往年,还能弄个小工具抢抢,今年12306换了件新衣服,更加跑不动了,最后独留下孤单在心里。
好吧 ,进入正题:玩转新版12306抢票
订火车票无非是如下几个流程:
登录 - 查询 - 点预定按钮 - 提交订票用户 - 确认订单 或者是 自动所谓的自动刷票 登录 - 查询 - 输入验证码提交
下面一起分析分析这两套流程:
首先准备抓包工具
登录拆分为:
https://kyfw.12306.cn/otn/ 抓cookie
![](http://img.blog.csdn.net/20140107094747125?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand 获取验证码
![](http://img.blog.csdn.net/20140107094753750?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20140107094757421?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn 预验证验证码
![](http://img.blog.csdn.net/20140107094818015?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
https://kyfw.12306.cn/otn/login/loginAysnSuggest 登录
![](http://img.blog.csdn.net/20140107094827437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](http://img.blog.csdn.net/20140107095128984?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
https://kyfw.12306.cn/otn/login/userLogin 正式登录(没有这个请求是无法登录的)
![](http://img.blog.csdn.net/20140107094832437?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
订票流程
查票 https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2014-01-04&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=BHQ&purpose_codes=ADULT![](http://img.blog.csdn.net/20140107100642359?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意这个请求的cookie 这个cookie会伴随抢票流程的始终。有时候有些人会返回-10等等一些奇怪的错误,我这里想说 get请求参数是可以验证先后顺序的,注意顺序就好了。
点击预定按钮
https://kyfw.12306.cn/otn/confirmPassenger/initDc 这个请求主要是获取订单提交时候的2个令牌值(REPEAT_SUBMIT_TOKEN,key_check_isChange)
获取提交订单验证码
https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp&0.4528230968713445
预验证验证码
https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn
检查订单
https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
![](http://img.blog.csdn.net/20140107103133328?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
有人会想问 oldPassengerStr和passengerTicketStr是什么,这里给一段代码把
[java] view
plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
![](https://code.csdn.net/assets/ico_fork.svg)
/**
* 获取OldPassengerStr
*
* @param userInfo
* @return
*/
public static String getOldPassengerStr(List<UserInfo> userInfo) {
String oldStrs = "";
for (int i = 0; i < userInfo.size(); i++) {
String oldStr = userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + "," + userInfo.get(i).getType();
oldStrs += oldStr + "_";
}
return oldStrs;
}
/**
* 获取PassengerTicketStr
*
* @param userInfo
* @return
*/
public static String getPassengerTicketStr(List<UserInfo> userInfo) {
String oldStrs = "";
for (int i = 0; i < userInfo.size(); i++) {
String oldStr = "";
if ("WZ" == userInfo.get(i).getSeatType()) {
} else {
oldStr = userInfo.get(i).getSeatType();
}
String bR = oldStr + ",0," + userInfo.get(i).getTickType() + "," + userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + ","
+ (userInfo.get(i).getPhone() == null ? "" : userInfo.get(i).getPhone()) + ",N";
oldStrs += bR + "_";
}
return oldStrs.substring(0, oldStrs.length() - 1);
}
其实把 这两个参数怎么拼接的 可以在js里面找到答案。
获取时时余票
https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
确认订单
https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
![](http://img.blog.csdn.net/20140107103633203?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaG5jZHlq/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
其实 说到这个应该也就快完了 剩下的刷票流程短一点,大家可以自己抓包分析。曾经这里出现过无须验证码提交订票信息的漏洞,最近这两天好像修复好了。
其实吧,技术只是一方面,重要的是理解流程。
转载请注明出处:/article/8430942.html
源码分享:http://www.zuidaima.com/share/1642189453937664.htm
好吧,先来唠叨,唠叨。这几天大家都沉浸在抢票中,当然我也不例外。
最后总结一句,有抢票软件不一定能抢到票,没抢票软件一定是抢不到票,网页一点就死了。
往年,还能弄个小工具抢抢,今年12306换了件新衣服,更加跑不动了,最后独留下孤单在心里。
好吧 ,进入正题:玩转新版12306抢票
订火车票无非是如下几个流程:
登录 - 查询 - 点预定按钮 - 提交订票用户 - 确认订单 或者是 自动所谓的自动刷票 登录 - 查询 - 输入验证码提交
下面一起分析分析这两套流程:
首先准备抓包工具
登录拆分为:
https://kyfw.12306.cn/otn/ 抓cookie
https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand 获取验证码
https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn 预验证验证码
https://kyfw.12306.cn/otn/login/loginAysnSuggest 登录
https://kyfw.12306.cn/otn/login/userLogin 正式登录(没有这个请求是无法登录的)
订票流程
查票 https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2014-01-04&leftTicketDTO.from_station=SZQ&leftTicketDTO.to_station=BHQ&purpose_codes=ADULT
注意这个请求的cookie 这个cookie会伴随抢票流程的始终。有时候有些人会返回-10等等一些奇怪的错误,我这里想说 get请求参数是可以验证先后顺序的,注意顺序就好了。
点击预定按钮
https://kyfw.12306.cn/otn/confirmPassenger/initDc 这个请求主要是获取订单提交时候的2个令牌值(REPEAT_SUBMIT_TOKEN,key_check_isChange)
获取提交订单验证码
https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew.do?module=passenger&rand=randp&0.4528230968713445
预验证验证码
https://kyfw.12306.cn/otn/passcodeNew/checkRandCodeAnsyn
检查订单
https://kyfw.12306.cn/otn/confirmPassenger/checkOrderInfo
有人会想问 oldPassengerStr和passengerTicketStr是什么,这里给一段代码把
[java] view
plaincopy
![](https://code.csdn.net/assets/CODE_ico.png)
/**
* 获取OldPassengerStr
*
* @param userInfo
* @return
*/
public static String getOldPassengerStr(List<UserInfo> userInfo) {
String oldStrs = "";
for (int i = 0; i < userInfo.size(); i++) {
String oldStr = userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + "," + userInfo.get(i).getType();
oldStrs += oldStr + "_";
}
return oldStrs;
}
/**
* 获取PassengerTicketStr
*
* @param userInfo
* @return
*/
public static String getPassengerTicketStr(List<UserInfo> userInfo) {
String oldStrs = "";
for (int i = 0; i < userInfo.size(); i++) {
String oldStr = "";
if ("WZ" == userInfo.get(i).getSeatType()) {
} else {
oldStr = userInfo.get(i).getSeatType();
}
String bR = oldStr + ",0," + userInfo.get(i).getTickType() + "," + userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + ","
+ (userInfo.get(i).getPhone() == null ? "" : userInfo.get(i).getPhone()) + ",N";
oldStrs += bR + "_";
}
return oldStrs.substring(0, oldStrs.length() - 1);
}
其实把 这两个参数怎么拼接的 可以在js里面找到答案。
获取时时余票
https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount
确认订单
https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue
其实 说到这个应该也就快完了 剩下的刷票流程短一点,大家可以自己抓包分析。曾经这里出现过无须验证码提交订票信息的漏洞,最近这两天好像修复好了。
其实吧,技术只是一方面,重要的是理解流程。
转载请注明出处:/article/8430942.html
源码分享:http://www.zuidaima.com/share/1642189453937664.htm
相关文章推荐
- jvm的内部体系结构浅析
- 用Spring实现非端到端验收测试
- win7电脑安装wamp出现httpd.exe无法找到组件MSVCR100.dll的解决办法
- Hover.css:一组超实用的 CSS3 悬停效果和动画
- oracle之控制文件恢复
- make and build package, copy files to dest dir
- Java的反射(二)
- 小甲鱼——编程初学者的救赎
- 2014技术目标
- lftp与ftp的数据传输模式
- 线段树
- [转]XCache 3.0.0 发布,PHP 性能提升方案
- 提取新闻正文
- Linux下添加新硬盘,分区及挂载
- PHP 文件与目录操作函数总结
- spring学习笔记(三)
- Face++ 制作样本
- 菜鸟读jQuery 2.0.3 源码分析系列(1)
- hdu 4021 24 Puzzle
- (PAT)1005. Spell It Right (20)