12306---抢票分析

研究了12306官网每5秒自动查询是否有票的相关代码,是利用了 ajax技术对指定接口进行查询,若是返回值为有票,那就告知用户有票了并进入订票界面。官网用5秒一次的刷新速度,是保证了服务器在全国同时购票的几万人每5秒一次访问的状况下不崩溃而设定的较为理想的值,但不少抢票软件都是以更短的时间轮询以期在最快的时间内获取是否有票的信息。为保证尽量地刷到票,我就把这个时间设定为0.5秒,并将超时时间设定为0.45秒,在查询到有票的时候播放汽笛声、弹窗提示并自动提交订票表单,这样基本知足抢票要求了。到了订票界面就须要本身手快一点、验证码输快一点了,没办法还不会作验证码识别——实战的时候,从有票到提交订票请求,再到输入验证码确认订票用了不到2秒的时间。利用本身学习到的技术完成了一项不靠别人靠本身的事情,想一想还有点小激动呢,嘿嘿~

研究过程:ajax

chrome浏览器自带的开发者工具(F12打开)查看查询时调用过程,定位查询代码,分析主要代码并解析出来,本身改造后直接在开发者工具的console里运行便可。chrome

140119追踪查询调用路径、匿名函数.png

分析query发起过程浏览器


140119直接运行js代码.png

改造代码后直接在控制台运行服务器

最终代码:函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
flag = 0;
function X(){
     if ( flag==1 ) return ;
     // 请求参数
     var bR = {
         "leftTicketDTO.train_date" : "这里填乘车日期" ,
         "leftTicketDTO.from_station" : $( "#fromStation" ).val(),
         "leftTicketDTO.to_station" : $( "#toStation" ).val(),
         purpose_codes: "ADULT"
     };
     jQuery.ajax({
         type: "get" ,
         isTakeParam: false ,
         beforeSend: function (bT) {
             bT.setRequestHeader( "If-Modified-Since" , "0" );
             bT.setRequestHeader( "Cache-Control" , "no-cache" )
         },
         url: "https://kyfw.12306.cn/otn/leftTicket/query" ,
         data: bT,
         timeout: 450,
         success: function (bV) {
             if (bV.status) {
                 var d = bV.data[3];
                 if ( d.secretStr!= '' ){
                     // 播放声音
                     jQuery( '#tryPlayer' ).click();
                     flag = 1;
                     // 弹窗
                     alert( 'got it!' );
                     // 提交订单
                     submitOrderRequest(d.secretStr);
                 }
             }
         }
     });
}
   
setInterval( function (){X(bR);}, 500);