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