投票网站一般而言主要鉴别方式是IP地址,当然也有微信的(openid),微信的方式基本无法刷票,只能通过多个微信号方式。本文以普通的投票网站展开,鉴别ip的方式主要有三种,见如下代码:
public function ip() {
//strcasecmp 比较两个字符,不区分大小写。返回0,>0,<0。
if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
$ip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
$ip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
$ip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
$ip = $_SERVER['REMOTE_ADDR'];
}
$res = preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
echo $res;
//dump(phpinfo());//所有PHP配置信息
}
其中HTTP_CLIENT_IP和HTTP_X_FORWARDED_FOR两种方式可以通过伪造http的请求头来达到欺骗的目的,使用chrome和postman和firfox的RestFul插件都可以很容易的实现,这里不再详述。这个投票网站是以第三种的方式,即REMOTE_ADDR的方式,伪造这种方式只能更换访问客户端的IP地址,使用匿名代理进行。
对于匿名代理而言主要涉及三步,获取代理ip,验证代理ip,建立ip池,使用代理方式发起http请求。
1 获取代理ip的获取和验证
这里通过国内免费的匿名代理ip网站获取测试代理。但是经过测试代理的质量一般,基本上只有20%的左右的可用性。建议寻找收费的代理ip,而且提供可靠的api接入方式。
免费代理网站:https://www.kuaidaili.com/free/
https://www.xicidaili.com/
代理ip的获取方式很多,但都是大同小异,基本上是通过爬取代理网站的ip然后转存到数据库中,通过另外一个程序对数据中的代理ip进行验证,删除不能正常代理的,筛选出的ip作为后续使用。我使用的是github的python脚本,在这里感谢作者:https://github.com/luzzbob/ProxyPool
2 建立代理ip池
这里的ip池是为后续程序自动请求提供代理,所以代理需要可靠,否则会导致程序刷票的效率很低。这里需要将数据库中筛选的ip以一定格式写入文件中。
import pymysql
def handle_http():
conn = pymysql.connect(host='localhost',
user='root',
passwd='12345678',
db='proxypool',
port=3306,
charset='utf8')
cursor = conn.cursor()
cursor.execute('select ip,ip_port from proxypool')
ip_list = []
fp = open("./ip.txt",'w')
for row in cursor.fetchall():
fp.writelines(row[0]+":"+row[1]+"\n")
fp.close()
# content = random.choice(ip_list)
return ip_list
if __name__ == '__main__':
handle_http()
3 使用代理发起http请求
#coding:utf-8
import urllib2,urllib,time,socket,random,Proxy_ip,Useragent
def Visitpage(proxyip,url):
socket.setdefaulttimeout(6)
proxy_support = urllib2.ProxyHandler({'http':proxyip})
user_agent = random.choice(Useragent.user_agents)
opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
urllib2.install_opener(opener)
try:
request = urllib2.Request(url)
print 1+request
request.add_header('Referer','http://www.baidu.com')
request.add_header('User-Agent',user_agent)
html = urllib2.urlopen(request).read()
print(html)
time.sleep(random.randint(60,180))
except urllib2.URLError,e:
print 'URLError! The bad proxy is %s' %proxyip
except urllib2.HTTPError,e:
print 'HTTPError! The bad proxy is %s' %proxyip
except:
print 'Unknown Errors! The bad proxy is %s ' %proxyip
def Clicklikebutton(proxyip,url,data):
socket.setdefaulttimeout(6)
proxy_support = urllib2.ProxyHandler({'http':proxyip})
user_agent = random.choice(Useragent.user_agents)
opener = urllib2.build_opener(proxy_support,urllib2.HTTPHandler)
try:
request = urllib2.Request(url)
request.add_header('Referer','http://www.baidu.com')
request.add_header('User-Agent',user_agent)
data = urllib.urlencode(data)
resp = opener.open(request, data)
print resp.read()
time.sleep(random.randint(60,180))
except urllib2.URLError,e:
print 'URLError! The bad proxy is %s' %proxyip
except urllib2.HTTPError,e:
print 'HTTPError! The bad proxy is %s' %proxyip
except:
print 'Unknown Errors! The bad proxy is %s ' %proxyip
def main():
for i in range(len(Proxy_ip.iplist)):
proxyip = Proxy_ip.iplist[i]
i += 1
print proxyip
for m in range(random.randint(2,4)):
#Visitpage(proxyip,'http://xxx')
Clicklikebutton(proxyip,'http://152.136.57.219/vote_ip_final/submit2',{'temxx':1})
if __name__ == "__main__":
main()
代码转自博客https://www.cnblogs.com/dengsm/p/6213998.html
4 验证
经过验证,可以正常完成投票,建议将每次投票的间隔调整好,否则容易被认定非正常投票。