本屌丝家在异乡,逢年过节免不了与12306你侬我侬一番。每次都有种力不从心的赶脚,之前因为时间关系,没有深究12306如此神奇的原因,最近仔细研究了网上两位高人关于新版12306抢票工具的代码,在学习的同时,谈谈自己的感想先。话不多说,记录如下:
第一位的原贴地址是:http://www.cnblogs.com/leefan/p/3521629.html,这位仁兄的想法很是独到,他将一些在前端的判定省略,从而很巧妙的借助已有jquery函数巧妙绕过了验证码的输入,达到自动提交不用输验证码的效果,并且修改一个参数,就可以将自动刷票的间隔时间随意更改。本屌是js的初学者,在对原作者无限崇拜的同时,发现由于作者是顺着12306的思路,所以用了两次ajax通信,第一次是验证码验证,第二次是提交购票信息,第一次还将ajax设置为同步,所以有些耗时。那么既然是欺骗后台,为什么不直接删掉第一次验证码的ajax通信呢,岂不是可以节省更多时间,带来更多机会?于是本屌抱着试一试的态度,将第一次通信省略,发现可行。当我有点小激动的想去把第二次通信删除时,返回如下页面,(这不是传说中的维护画面吗?),本屌后来想通了,因为你这个账号是没有在服务器端有任何的订购记录,所以不会给你订票的,有可能每晚23点以后就把这第二个ajax的调用给关闭,使我们没有办法继续购票,如果这样的话,那么23点之前订购成功的票,是可以在23点45分之前付款就行了(待验证)。有点跑偏了,回到正题,所以本屌最后在原作者基础上改过代码如下,至于如何运行,本屌就不多说了,毕竟原作者非本人,但是如果要在firefox上运行,我遇到的问题是需要把$统统改为jQuery,否者FF会报不识别函数的错误。
autoSearchTime=600; $("#randCode2").unbind('keyup'); function bO() {if ($("#sf2").is(":checked")) {return "0X00"} else {return "ADULT"}}; $("#randCode2").on("click", function(bS) { $("#back_edit").trigger("click"); $.ajax({ url: ctx + "confirmPassenger/confirmSingle", type: "post", data: { passengerTicketStr: getpassengerTicketsForAutoSubmit(), oldPassengerStr: getOldPassengersForAutoSubmit(), tour_flag: "dc", randCode: $("#randCode").val(), purpose_codes: bO(), key_check_isChange: md5Str, train_location: location_code }, dataType: "json", async: true, success: function(bR) { otsRedirect("post", ctx + "payOrder/init?random=" + new Date().getTime(), {}) }, error: function(bR, bT, bS) { return } }) $("#randCode2").removeClass("inptxt w100 error").addClass("inptxt w100"); $("#i-ok2").css("display", "block"); $("#c_error2").html(""); $("#c_error2").removeClass("error"); return }); setInterval(function(){ if($("#autosubmitcheckticketinfo").css("display")!="none"){ $("#randCode2").trigger('click'); } },400);
第二位大神的思路同样很赞,原贴地址是:http://www.cnblogs.com/guozili/p/3512490.html,他实现了CDN的自动切换,事实和理论证明,这样是管用的,我们不知道哪个CDN的缓存最先更新,或者简单理解:余票信息在主服务器上是一定的,那么这些信息更新到各地的CDN时间不一,有的几秒钟 ,有的几分钟,相信大家都有这样的刷票经历:和朋友第一时间一起开始刷票,可是人家那都买完了,自己还是没有显示一张票,不是网络慢,不是电脑差,更不是你人品不行,而是你被路由到一个更新慢的CDN了(好像也是和人品有点关系)。原作者切换hosts ip的动作我是通过在VS上搭建一个ASP web 应用程序实现的,大家记得把port设置成1111就行了,或者改js里的port寻址。我没有改什么东西,只是觉得把host 更换频率可以放快点(原来代码是5秒),另外建议大家把两位大神的方法一起用,那效果是刚刚的(既自动换CDN,又不用输验证码)。
其实想想12306也很不容易,哪个网站这样糟蹋也消受不起,我能理解将一些判定放在前端是为了后端减压,可是咱毕竟拿了那么多钱在整网站,把钱用来加强一下后端处理能力,也不至于网络黄牛漫天飞吧,最后希望每个人都能买到满意的火车票,过个胡吃海喝的大年!
此贴为学习贴,仅此而已。发帖的时机有些晚,还是希望能帮到大家。