国庆在家刷个票

刷票什么鬼的已经不是一个什么新鲜话题了。放假期间受朋友所托去刷个票,整个过程还是有些东东可以分享的。

一、为什么可以刷票

基于HTTP协议是处于应用层,所以HTTP包是很容易可以构造出来的,也就是说,人通过浏览器去投票发出的HTTP请求包,机器是可以模拟构造出来的。

二、刷票前我们要了解什么

1、投票时是否绑定session

2、投票时是否识别ip

3、投票时是否需要验证码

4、投票时需要提交什么数据到什么目标地址(这里包括是否要带上特定的cookie字段,是否要识别终端等HTTP头信息)

所以,针对不同的投票网站,可能会有不一样的变通方案,但都不会离开上面四点。
这次投票的网站,经过分析,1、2是yes,3是no,不用验证码哦,这个刷票门槛马上低了n个层次,不过发现是识别ip的,一个ip投一票,请空cookie后可以继续投。
一个ip经测试,一般可以投20-30票,如果速度不快的话。

三、来来来,开刷了

感觉没上代码不舒服,先上个代码先

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?php
include_once('ip.php');

$url = URL;
$timeout = TIMEOUT;

# USER AGENT哦, 多搞几个是好事
$user_agents = array(
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2227.1 Safari/537.36'
);

while (1)
{
# 通过代理API获取IP
$ret = file_get_contents(IP);
$ret = json_decode($ret, true);
$proxy_list = $ret['data']['proxy_list'];
print_r($proxy_list);

foreach ( $proxy_list as $proxy ) {
A:
$ua = $user_agents[array_rand($user_agents)];
$options = " -v
-A \"$ua\"
-m $timeout
-x $proxy
-H \"Content-Type: application/x-www-form-urlencoded; charset=UTF-8\"
-H \"X-Requested-With: XMLHttpRequest\"
-H \"Origin: http://abc.com\"
--referer \"http://abc.com/vote.html\"";
$cmd = "/usr/bin/curl $options -d \"i=xxx\" \"$url\"";
# 用的是cmd, 用php curl也可以
$output = exec($cmd);
echo $cmd;
echo "\n*******************\n$output\n******************\n";

$ret = json_decode($output, true);
print_r($ret);
if ( $ret['success'] == '1' ) {
echo $proxy . "\n";
# 模拟停一秒, 感觉可以停久一些
sleep(1);
# 神奇的goto
goto A;
}
}
}
?>

因为是和IP相关的投票,所以只能通过代理了,这里就只能去买代理啦,只用高匿的,因为这样server那边是不知道你是用了代理的,这个请自行google了。
另外curl需要给个user agent,这样就不需显示curl了,更加真实一点,多点user agent随机会比较靠谱。

####四、这次刷票遇到的其它问题
1、估计大家都用代理嘛,代理资源可能有很多是重复的,你会发现很多取回来的代理已经不能投票了(别人已经用这个代理投过票,并且该代理IP已入黑名单),
或者说投一到两票就不能投了,所以这样刷票是有点不稳定的,如果有一手的代理资源这个问题就可以解决。

2、大家都在刷,大家都在抢占资源,所以我们可以多开些进程去刷,这里要考虑代理获取IP的API调用频率限制问题了,太快的也是不行的。

3、代理也分布在不同网络,电信、移动、网通、铁通之类,所以刷票机在多个网络会更好一些。

4、刷票的时间最好和人正常的作息时间对应,也就是说要更智能一点,更像人在投票一点。

5、因为朋友说不想名次太高,所以我另外也写了一个程序来判定是否在前几名之外,如果不在前几名,就开始刷。这些边边角角的代码就不好意思贴出来了,写得比较快,所以比较粗烂……

####五、如果有验证怎么办
这个比较恶心,因为验证码要涉及图形识别,不同图形验证码的识别率也不一样,这一块我没有深入研究过,但知道Tesseract Open Source OCR Engine可以通过不断学习来提高图形验证码的识别率。当然也可以自己写识别算法来处理,图形学是博大精深,小弟只懂个皮毛,不过有时间还是想试试这个东东。

刷票软件什么的也很厉害,以前好像有用过,大家都可以找找看吧。我这里只是分享其中一种方法与思路,应该算是刷票的基本功吧,因为软件什么的也是基于这个思路来写的,不过功能更多强大和自动化而已。

话说刷票不便, 这种无验证码的淘宝也要四毛一票呢,我这帮朋友刷了4w多票,Just a joke : )

EOF

0%