12306---抢票分析

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

研究过程:

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

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")
        },
        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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章