由于某种需要,在浪费了整整一天搜寻免费刷票软件无果后,毅然决定自己动手做一套。在度娘的大力支持下,经过一天的艰难探索,加之以牺牲一批脑细胞为代价,终于用“批处理+油猴脚本”实现了邪恶的刷票目标。
实验证明,这一解决方案适用于通过IP限制投票数量的投票系统。遗憾的是,由于无暇研究验证码识别机制,该套方案暂时应付不了有验证码机制的投票系统。下面,本人将详细介绍这种刷票应用的实现,有兴趣的小伙伴可以自己随我搭建一套爽爽。
众所周知,投票系统分无限制投票和有限制投票两种类型。对于无限制投票,刷票的方式很简单,比如用javascript编写一个自动点击按钮(或自动发送投票请求)、然后自动刷新页面的脚本,在油猴脚本(Firefox上的一种应用扩展,用于在任意网站上运行自己编写的脚本)上运行,就大功告成了。对于有限制的投票系统(比如每人每天仅能投几票),目前业界通用的技术无非是锁定IP或写入cookie。因此,要实现刷票,也就是要突破IP限制并删除cookie。对于突破IP限制,可以利用代理服务技术,但这种方式的缺点是实现起来比较复杂,而且代理服务器良莠不齐,免费的代理访问起来普遍较慢,用来刷票往往心有余而力不足,所以这种方式不太可取。值得庆幸的是,运营商为提高iP资源的利用率,大多数情况下给我们分配的都是动态IP(静态IP还是有的,比如我周围几条能用的线路都是,这直接导致了我不得不采用效率更低的天翼3G上网卡来刷,这是后话),这种机制给我们的刷票行动带来了很大帮助,你会发现,只要将你的电脑直接连接到调制解调器(就是说不能通过路由),当你每次执行ipconfig/release和ipconfig/renew后,你会得到一个新的IP地址,这时候就能开始新一轮的投票了。在此基础上,利用循环和延时,并将代码存为批处理文件(即*.bat文件),执行起来即可实现定期自动更新IP地址,批处理可以这么写:
set /a n=0
:cont
ping -n 25 127.0.1>nul
rem 上面的25代表25秒延时,可修改为任意值
ipconfig/release
ipconfig/renew
set /a n=n+1
echo %n%
goto :cont
刚才提过,这种方法仅适用于动态分配IP的网络连接,假如你用的宽带是静态IP(像我一样),那么只好找一个3G上网卡了。对于3G上网卡,实现IP更换的机制是断开网络连接并重连,批处理代码可以这么写:
set /a n=0
:cont
netsh interface set interface "更换为自己的宽带连接名" enable
ping -n 25 127.0.1>nul
netsh interface set interface "更换为自己的宽带连接名" disable
set /a n=n+1
echo %n%
goto :cont
实现了IP自动变换,接下来要做的就是实现网页上的自动投票。这里用到了Firefox浏览器和油猴脚本(GreaseMonkey组件),自己编写的javascript脚本如下:
// ==UserScript==
// @name t
// @namespace tengs
// @include http://tengs.info
// @version 1
// @grant none
// ==/UserScript==
//个人习惯,引入jQuery
var GM_JQ = document.createElement("script");
GM_JQ.src = "http://code.jquery.com/jquery-2.1.0.min.js";
GM_JQ.type = "text/javascript";
document.getElementsByTagName("head")[0].appendChild(GM_JQ);
//Check if jQuery's loaded
function GM_wait() {
if(typeof unsafeWindow.jQuery == "undefined") {
window.setTimeout(GM_wait,100);
}
else {
$ = unsafeWindow.jQuery;
letsJQuery();
}
}
GM_wait();
function letsJQuery() {
$(function () {
//下面用AJAX发送投票请求
$.ajax({
type: 'POST',//这个是请求方式,有可能是GET
url: 'http://xxx.com/voted/123456',//投票处理地址要根据实际填
//data: data,要根据实际情况确定是否有发送数据
success: function(){location.reload();},
dataType: 'json'
});
})
}
对于AJAX里面的参数,可以通过FireBug(也是Firefox的一个插件)监控一次真实的投票过程,从发送、接收的数据包中获取。
值得一提的是,刷票的过程中,由于网络是自动断开重连的,有可能出现网页正在请求数据却刚好断网的情况,这时候会出现网页假死,而且这种情况下由于页面未加载完成,油猴脚本不能执行,所以不能通过javascript来刷新。这时候,刷票也就停止了。解决的办法是应用Firefox的Reload Every插件(好吧,又是插件),设定一定时间间隔自动刷新页面即可。
好了,愉快的开发之旅已经结束,接下来就享受一下刷票的乐趣吧!
说了这么多,现在问题来了,我是不是应该开个淘宝承接刷票业务,赚点小钱还房贷呢?!