2014新版12306接口分析

文章只做技术研究  如果通过此技术违反国家法律,一切后果自负,作者不承担任何责任。

好吧,先来唠叨,唠叨。这几天大家都沉浸在抢票中,当然我也不例外。

最后总结一句,有抢票软件不一定能抢到票,没抢票软件一定是抢不到票,网页一点就死了。

往年,还能弄个小工具抢抢,今年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 plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.      * 获取OldPassengerStr 
  3.      *  
  4.      * @param userInfo 
  5.      * @return 
  6.      */  
  7.     public static String getOldPassengerStr(List<UserInfo> userInfo) {  
  8.         String oldStrs = "";  
  9.         for (int i = 0; i < userInfo.size(); i++) {  
  10.             String oldStr = userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + "," + userInfo.get(i).getType();  
  11.             oldStrs += oldStr + "_";  
  12.         }  
  13.         return oldStrs;  
  14.     }  
  15.   
  16.     /** 
  17.      * 获取PassengerTicketStr 
  18.      *  
  19.      * @param userInfo 
  20.      * @return 
  21.      */  
  22.     public static String getPassengerTicketStr(List<UserInfo> userInfo) {  
  23.         String oldStrs = "";  
  24.         for (int i = 0; i < userInfo.size(); i++) {  
  25.             String oldStr = "";  
  26.             if ("WZ" == userInfo.get(i).getSeatType()) {  
  27.             } else {  
  28.                 oldStr = userInfo.get(i).getSeatType();  
  29.             }  
  30.             String bR = oldStr + ",0," + userInfo.get(i).getTickType() + "," + userInfo.get(i).getName() + "," + userInfo.get(i).getCardType() + "," + userInfo.get(i).getCardID() + ","  
  31.                     + (userInfo.get(i).getPhone() == null ? "" : userInfo.get(i).getPhone()) + ",N";  
  32.             oldStrs += bR + "_";  
  33.         }  
  34.         return oldStrs.substring(0, oldStrs.length() - 1);  
  35.     }  

其实把  这两个参数怎么拼接的  可以在js里面找到答案。


获取时时余票

https://kyfw.12306.cn/otn/confirmPassenger/getQueueCount


确认订单

https://kyfw.12306.cn/otn/confirmPassenger/confirmSingleForQueue



其实  说到这个应该也就快完了  剩下的刷票流程短一点,大家可以自己抓包分析。曾经这里出现过无须验证码提交订票信息的漏洞,最近这两天好像修复好了。

其实吧,技术只是一方面,重要的是理解流程。


转载请注明出处:http://blog.csdn.net/hncdyj/article/details/17952815

源码分享:http://www.zuidaima.com/share/1642189453937664.htm

持续更新程序下载地址:https://code.google.com/p/mygod-go-home/downloads/list

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值