更易抢到票!搜狗12306专版抢票功能技术解析

JavaScript技术    2013-01-23 12:02  

  近日,春运12306网站抢票软件成为全民关注的焦点,对于有传闻称铁道部找工信部要求各大浏览器厂商停止开发12306刷票工具一事,搜狗浏览器官方表示,截止目前,搜狗公司从未接到来自任何有关部门的“叫停”通知,也未被“约谈”,搜狗12306专版浏览器和搜狗浏览器12306抢票插件一直正常服务,未受影响。请网友们放心下载使用(下载地址:http://ie.sogou.com)。

  搜狗12306专版浏览器具有独创的“定时抢票”功能,能在放票的那一瞬间,也就是放票量最大的时候大幅提高用户订票的成功率,而且可以让12306服务器“减负”,安全可靠。为啥这样说,接下来请看详尽的搜狗12306专版浏览器“定时抢票”功能技术解析报告。

  搜狗12306专版浏览器“定时抢票”功能技术解析

  在看一般人都看不懂的代码分析之前,我们先来简单了解一下搜狗12306专版浏览器定时抢票功能的3大优势。了解有啥优势,我们才知道代码的意义。

  优势1:对于用户来说,“定时抢票”功能可以在放票的一瞬间开始抢票,此时是票量最大的时候,相对于“自动刷票”功能,可以大幅提升订票的成功率;

  优势2:对于12306网站,“定时抢票”功能可以减轻12306网站的负载,这是以礼相待之道。

  优势3:对于其他抢票浏览器来说,“定时抢票”功能是目前他们并不具备的功能,搜狗是在充分考虑到“如何大幅提升用户的订票成功率”以及“减轻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专版浏览器的技术维护,为更多归心似箭的网友带来福音。

在线留言

我要留言