搜狗12306專版瀏覽器“定時搶票”功能技術解析
近日,春運12306網站搶票軟件成為全民關注的焦點,對于有傳聞稱鐵道部找工信部要求各大瀏覽器廠商停止開發12306刷票工具一事,搜狗瀏覽器官方表示,截止目前,搜狗公司從未接到來自任何有關部門的“叫停”通知,也未被“約談”,搜狗12306專版瀏覽器和搜狗瀏覽器12306搶票插件一直正常服務,未受影響。請網友們放心下載使用。
搜狗12306專版瀏覽器具有獨創的“定時搶票”功能,能在放票的那一瞬間,也就是放票量最大的時候大幅提高用戶訂票的成功率,而且可以讓12306服務器“減負”,安全可靠。為啥這樣說,接下來請看詳盡的搜狗12306專版瀏覽器“定時搶票”功能技術解析報告。
搜狗12306專版瀏覽器“定時搶票”功能技術解析
在看一般人都看不懂的代碼分析之前,我們先來簡單了解一下搜狗12306專版瀏覽器定時搶票功能的3大優勢。了解有啥優勢,我們才知道代碼的意義。
- 對于用戶來說,“定時搶票”功能可以在放票的一瞬間開始搶票,此時是票量最大的時候,相對于“自動刷票”功能,可以大幅提升訂票的成功率;
- 對于12306網站,“定時搶票”功能可以減輕12306網站的負載,這是以禮相待之道。
- 對于其他搶票瀏覽器來說,“定時搶票”功能是目前他們并不具備的功能,搜狗是在充分考慮到“如何大幅提升用戶的訂票成功率”以及“減輕12306網站的負載”的情況下才推出這個功能。
代碼分析:
通過校準時間、防踢出、放票瞬間搶票三個步驟幫助用戶在每次放票的瞬間訂票,相對于刷新余票退票來說,放票時的票量最大,因此用戶訂票成功的幾率也最大。
1.校準時間:
用戶機器上的本地時間有可能不準確,因此每當用戶登錄進來的時候,都會請求服務器時間,以服務器時間做為標準。
(邏輯:當頁面載入的時候,向遠程服務器發送獲取標準服務器時間的請求,請求地址為:http://www.sogou.com/websearch/features/standardtimeadjust.jsp?t=' + Date.now(),地址的最后加上時間戳來保證請求不會因為瀏覽器的緩存策略而受到影響,從而每一次請求都是一個全新的請求,能夠獲取到最新的標準時間,當獲取到標準時間后就保存起來供后續校準時間使用。)
搜狗12306專版瀏覽器在每一次定時搶票之前都會校準時間
代碼:
- (function(w, d){
- var getRemoteTime = function(){ //獲取標準時間(通過jsonp的方式獲取)
- var script = d.createElement('script');
- script.src = 'http://www.sogou.com/websearch/features/standardtimeadjust.jsp?t=' + Date.now();
- d.body.appenDChild(script);
- };
- var standardtime = function(timestamp){ //當標準時間獲取到時,通知頁面,保存標準時間
- matchPort.postMessage({command: 'ready', remoteTime: timestamp});
- };
- w.standardtime = standardtime;
- var matchPort;
- sogouExplorer.extension.onConnect.addListener(function(port){ //當12306登錄頁面或者查詢頁面載入時,發起查詢標準時間的請求
- if(port.name === 'remoteTime'){
- matchPort = port;
- port.onMessage.addListener(function(msg){
- if(msg.command === 'get'){
- getRemoteTime();
- }
- });
- }
- });
- }(window, document));
- ……
- var now = new Date(Date.now() - utility.diffTime), //根據當前本地時間和時間差計算出來的當前服務器時間
- hour = now.getHours(),
- min = now.getMinutes(),
- sec = now.getSeconds();
- padding_time = diff(countdown_time, { //計算當前服務器時間和最終時間的差距,格式為*小時*分*秒
- hour: hour,
- min: min,
- sec: sec
- });
- };
2.防踢出
當用戶端瀏覽器因長時間未操作時,有可能被12306網站認為對話已結束,從而會將用戶踢出。這將嚴重耽誤用戶購票的時間,為了防止這種情況的發生,同時減輕12306網站的負擔,搜狗“12306專版瀏覽器”會定時對12306網站說:“Hi,我還在線,請不要將我踢出。”
(邏輯:定時發送空請求,請求地址為https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init&t=' + Date.now(),同樣加上了時間戳防止因瀏覽器緩存策略而不能將請求真正發送給12306服務器。)
代碼(位于12306-webkit.js中):
- var intervalRequest = function(){
- var requestUrl = 'https://dynamic.12306.cn/otsweb/order/querySingleAction.do?method=init&t=' + Date.now();
- var img = new Image;
- img.src = requestUrl; //發起一個空請求
- setTimeout(intervalRequest, interval);
- };
- intervalRequest();
3.放票瞬間搶票
當放票的一瞬間,開始搶票,因為與服務器時間已同步,因此搜狗會在第一時間發送請求,對于以秒計算的搶票過程來說,無疑擁有更高的幾率訂票成功。
“定時搶票”功能與其他瀏覽器的“自動刷票”功能相比,示例如下:
13:00:00秒開始放票,其他搶票瀏覽器如果已經在12:59:59秒刷新過頁面,那他們的下次刷新時間為13:00:05(遵守12306網站6秒/次的刷新頻率) ,但搜狗“定時搶票”功能卻可以在13:00:00準時開始搶票,寶貴的5秒鐘,可以顯著提升用戶訂票的成功率。
(邏輯:當倒計時終了的時候就會將之前保存起來的出發地、目的地的信息回填到輸入框中,隨后觸發左側“開始刷票”按鈕的功能,不斷嘗試,直至刷到有票為止。)
代碼:
- .addEndHandler(function(){ //倒計時時間達到,開始刷票
- first_ticket_btn_status = 'stopped';
- first_ticket_pingback = true;
- $('#first-ticket-btn').removeClass('running').adDClass('stopped');
- countdown = null;
- hideFirstTicketInfo();
- $tickettime_options.attr('disabled', false);
- $tickettime_options.val('').change();
- $toolbar_startdate.attr('disabled', false);
- //將之前保存的相關信息以程序的方式填入進去,準備刷票
- $('#fromStationText').val(fromStationText4FirstTicket);
- $('#fromStation').val(fromStation4FirstTicket);
- $('#toStationText').val(toStationText4FirstTicket);
- $('#toStation').val(toStation4FirstTicket);
- $('#startdatepicker').val(startdate4FirstTicket);
- if(auto_refresh_btn_status === 'stopped'){
- $('#auto-refresh-btn').click(); //觸發刷票功能
- }
- })
- .start();
總結
對于這個全球瞬間點擊量第一,而卻沒有淘寶樣強大承載能力的12306網站,單純靠原始的人工刷票方法,就算給你一天時間也不一定刷出票來。
搜狗對搶票技術做了大量優化,獨家推出“定時搶票”功能,保證用戶在放票的第一時間開始搶票,與一般搶票插件的“自動刷票”功能相比,其優勢是搶票成功率大大提升,并且對12306服務器的負載大大降低,做到了兩全其美。搜狗將持續做好12306專版瀏覽器的技術維護,為更多歸心似箭的網友帶來福音。