搶票季:吐槽12306 & 分享搶票經驗

又是一年一度的春運搶票季,無論你是北上、南下或者東進,在外漂泊了一年,有錢沒錢老是要回家過年的。css

image

【圖片來源於網絡】html

 

吐槽:12306搶票的悲傷

聽說12306改版了,新版本里面除了UI這些面兒上的改動,還加入了自動刷票、自動提交訂單等實用的功能,而且推出了手機購票軟件,當真是下了一番真功夫!這裏對12306訂票系統的工程師們表示感謝!jquery

可是,等你真的去訂票的時候,你遇到的錯誤多是這樣的:程序員

image

也多是這樣的:ajax

image

或者是這樣的:chrome

image

運氣好點的能見到購票失敗的提示:瀏覽器

image

這裏真心的恭喜那些搶票成功的同窗們!恭喜發財!紅包拿來!服務器

 

吐槽:奇葩的驗證碼校驗

先聽我講一下今天搶票的親身經歷:打開12306購票頁面,滿心歡喜的登錄(我對本身的網速仍是有信心的,迅雷下載2MB以上,日常看視頻都只看高清),結果今天在登錄的時候就出了岔子,先是驗證碼沒有顯示,等到驗證碼顯示出來之後我趕忙去輸入,輸完四個字符之後就卡死了,真的是卡死了……網絡

直覺告訴我,12306的驗證碼校驗確定是同步請求,因而打開開發者工具,想來一窺究竟。異步

image

真正的調用在這裏:

image

首先看一下common.js,點看之後發現是壓縮過的,從註釋上面能夠看到裏面包含了jquery 1.九、Sizzle CSS Selector Engine(這個沒有用過)、jqPagination、jQuery Form Plugin、jQuery Validation Plugin 1.11.1以及一些ajax的封裝,而真正執行請求的地方是在login.js裏面。

我把login.js下載了下來,而後格式化了輸出,找到了checkRandCode的定義:

checkRandCode: function() {
    var d;
    var c = $("#randCode").val();
    $.ajax({
        url: ctx + "passcodeNew/checkRandCodeAnsyn",
        type: "post",
        data: {
            randCode: c,
            rand: "sjrand"
        },
        async: false,
        success: function(e) {
            if (e.data == "N") {
                d = false;
                $("#i-ok").css("display", "none")
            } else {
                d = true;
                $("#i-ok").css("display", "block")
            }
        }
    });
    return d
}

看到了吧,async:false,果真是走的同步請求,在12306超負載的時候,這個請求會一直掛起,因而就出現了瀏覽器卡死、瀏覽器崩潰等問題,這個跟瀏覽器真不要緊。

怎麼破?一行代碼搞定:

jQuery.extend({ checkRandCode: function () { return true; } });

把這句代碼放在console裏面執行:

image

直接覆蓋12306的checkRandCode方法,不去服務器走一遭,立刻返回true。

 

若是你以爲同步請求還可以忍受,那麼看看下面的經歷:我一個不當心我輸錯了字母,驗證碼校驗告訴我錯誤了,我也知道看到了錯誤的地方,而後我去挪動光標,奇葩的事情再次發生,它竟然又執行了上面那個同步的驗證!!!感情12306監聽的是鍵盤事件啊(後來看代碼發現是keyup):

$("#randCode").on("keyup", function (c) {
    c = c || window.event;
    $("#error_msg").hide();
    if ($("#randCode").val() != "" && $("#randCode").val().length == 4) {
        if (!$.checkRandCode()) {
            $("#error_msg").html(login_messages.randCodeError).attr("class", "error").css("margin-left", "70px");
            $("#error_msg").show();
            return false
        } else {
            $("#i-ok").css("display", "block");
            if (c.keyCode == 13) {
                $("#loginSub").click()
            }
        }
    } else {
        $("#i-ok").css("display", "none")
    }
    b = $("#randCode").val()
})

看到了吧,人家是監聽的keyup,只要裏面夠四位,你放開鍵盤就去驗證,放開鍵盤就去驗證……網速好很差咱先不說,每次都去服務器同步走一遭就夠你受的……

這個怎麼破呢?其實只要把驗證的破了之後,這個天然就沒有什麼影響了。若是你執意要破,那我也給你一句代碼:

$("#randCode").unbind("keyup")

這句話稍微有點jquery功底的人就能看懂,直接移除keyup事件,不去監聽就一了百了了。

固然,移除了keyup事件之後,你再去按enter鍵是不可以登錄的,須要你去點擊登錄按鈕,這是一個反作用。

 

給12306的幾點建議

只是一個簡單的登錄頁面,就已經讓我忍不住開始吐槽了(這多是由於我今天沒有買到車票吧)。下面是給12306開發人員的幾個建議:

第一,不要去服務器校驗驗證碼,不論是異步仍是同步

第二,若是非要去校驗,請不要使用keyup事件去驗證,可使用onchange來代替

第三,若是非要去檢驗,請將用戶名和密碼一併傳給服務器,數據量不會大多少,可是請求數量最少可以減小一倍,還減去了點擊登錄按鈕的麻煩

 

使用12306搶票攻略

去年搶票的時候有一個搶票的插件,很方便咱們程序員購票,今年不同了,12306集成了,雖然依然很方便,可是不少細節卻不如去年。那麼怎樣才能保證買到回家的車票呢?

第一步,模擬購票流程。爲了今天的購票,我作了充足的準備:前一天下午走了一遍購票流程,一直到付款環節(拿着票源充足的臨客測試)。

第二步,提早登錄。最起碼要在搶票開始前十分鐘登錄的到系統,而後設置好本身要訂的車次、乘車人和席別。若是你信得過自動提交訂單功能,就讓系統一直刷着,有票了只須要輸入一個驗證碼就能夠了。

第三步,多開瀏覽器,使用不一樣的瀏覽器登錄搶票。個人機器上面自己已經裝了IE、chrome和firefox,買票前將三個都打開,分別登錄,即便你只有一個帳號也能夠同時在三個瀏覽器裏面登錄。

第四步,使用插件。雖然今年插件不像去年那樣火熱,可是想獵豹瀏覽器仍是除了搶票專版,今天下午我已經測試了一下,能夠買到票。不知道明天早上還可不能夠(12306有夜裏發佈系統的習慣)。

第五步,使用手機客戶端。12306官方有一個購票的客戶端,雖然已到搶票的時候就卡的要死,老提示網絡異常,但也算是一種途徑吧。

 

最後,祝全部朋友都能順利的買到回家的車票……

歡迎分享購票經驗……

搶到票的朋友快來分享大家的購票經驗吧,幫助更多的人買到回家的車票。

相關文章
相關標籤/搜索