12306抢票神器,项目地址: https://github.com/yaosine/12306

2014年1月8日,央视报道了黄牛党如何利用抢票神器刷票,这说明什么?说明这就是刚需!没错,每到逢年过节,12306都要面临巨大考验,尤其是春运。因为我也是其中一份,看到自己和身边的朋友总因为抢票发愁,于是找个时间来研究研究,写出了一个简单实用的抢票工具,适合放票时秒抢,因为不用填写验证码,可大大提高下单时间,已成功造福身边的非技术同事,代码如下:

BUG解析

其实这个BUG很简单,12306的自动刷新功能本身就有自动刷票功能,只是时间限制在5秒一次,查看源代码发现引用了jQuery,那就好办了,咱们先把时间给改了,重新定义window.setTimeout,当时间为咱们设定时间时立即执行:

//循环刷新
window.setTimeout2 = window.setTimeout;
window.setTimeout = function(f, t){
    if(t == sj) window.setTimeout2(f, sj);
    else window.setTimeout2(f, t);
}

这里的st就是咱们设定的时间,这样,咱们就可以设置1秒刷N次了。
接下来看如何绕过验证码,在源代码里查询到获取验证码有一个js函数refreshImg,三个参数,这好办了,咱们也重新定义一下:

var refreshImg2 = refreshImg;
refreshImg = function(a,b,c){ return true }//验证码过滤

这样,获取验证码时调用的是一个空的函数,当然就不会获取新的验证码了。

获取验证码,在新页面打开URL即可拿到:

https://kyfw.12306.cn/otn/passcodeNew/getPassCodeNew?module=login&rand=sjrand

当满足条件时立即填入验证码:

$('#randCode, #randCode2').val(yzm).keyup();//填入验证码

填入后会自动检测是否正确,只要正确就立马提交,这时,你已经下单成功!

BUG就在这里!下单前只是在前端获取新验证码,咱们能容易能把这一步控制,所以解决办法是,当满足下单条件时,一定要在服务端程序里更新或清除验证码,然后前端再在获取新验证码。