对某投票网站的刷票方式

投票网站一般而言主要鉴别方式是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 验证

经过验证,可以正常完成投票,建议将每次投票的间隔调整好,否则容易被认定非正常投票。

你可能感兴趣的:(编程)