python——刷票腳本

前言

現(xiàn)在部分比賽為了推廣贊助商或者比賽本身,需要參賽隊(duì)伍進(jìn)行網(wǎng)上拉票,甚至票數(shù)還會(huì)占一定比例的成績(jī)。因此,刷票也就應(yīng)運(yùn)而生了。此次我們團(tuán)隊(duì)參加一個(gè)比賽,就需要網(wǎng)上投票決出前幾名,作為一位技術(shù)人員,當(dāng)然是得“解決”技術(shù)能解決的問題嘛,所以就寫了個(gè)刷票插件來刷一刷。

原理

刷票的原理很簡(jiǎn)單,就是相當(dāng)于模擬人登錄網(wǎng)站去投票,只是把這個(gè)過程程序化,讓程序代替人到網(wǎng)站去投票。具體一點(diǎn)說把,首先是客戶端(我們)發(fā)出請(qǐng)求(Request)給服務(wù)端(投票網(wǎng)站),跟他們說,我們需要看他們網(wǎng)站的信息,然后服務(wù)端就會(huì)回復(fù)(Respose)我們,我們?cè)侔烟詈玫谋韱伟l(fā)給他們(Request),他們收到后就會(huì)回復(fù)我們(Respose)。

主要內(nèi)容

  • 分析網(wǎng)站
  • 表單提交
  • 構(gòu)造代理IP池

1. 分析網(wǎng)站

由于每個(gè)網(wǎng)站需要提交的信息都不一樣,那么首先我們需要對(duì)目標(biāo)網(wǎng)站進(jìn)行相對(duì)應(yīng)的分析,找出他們的表單接口(也就是URL或者叫網(wǎng)址)以及我們需要提交的信息。

1.1 收集信息

首先我們登錄目標(biāo)網(wǎng)站

目標(biāo)網(wǎng)站

使用F12,打開審核元素,點(diǎn)擊Network,真實(shí)地進(jìn)行一次表單提交

框住的兩個(gè)內(nèi)容就是我們需要知道的一部分表單信息

  • Request URL:請(qǐng)求網(wǎng)址,我們提交的信息就是傳到這個(gè)url里面去
  • Request method:請(qǐng)求方法,我們提交的方法
表單信息1

下面有兩個(gè)框分別框住兩個(gè)不同的信息區(qū)域,具體有什么用呢?下面就來詳細(xì)解釋一下這個(gè)

  • Request Headers:請(qǐng)求頭,當(dāng)我們?cè)L問網(wǎng)站的時(shí)候,我們都需要提交一個(gè)請(qǐng)求頭過去,以證明我們不是爬蟲,而是真實(shí)的訪問,所以我們要把這個(gè)拿到,以便假裝我們不是爬蟲。
  • From Data:這就是我們要提交的數(shù)據(jù)了,現(xiàn)在提交的數(shù)據(jù)都是以json格式提交,按照這些信息寫好我們需要提交的json數(shù)據(jù)就好
表單信息2

以上就是需要獲得的基本信息,根據(jù)這些信息我們就可以編寫刷票插件了,但作為一個(gè)對(duì)自身有高標(biāo)準(zhǔn)嚴(yán)要求的程序員來說,僅僅這樣就足夠嗎?當(dāng)然不會(huì)啦,我們得找一找這個(gè)提交過程有沒有什么漏洞。

怎么找?分析源代碼,找了找,果真還讓我找到了!


表單漏洞

看出什么沒有,它這里有兩個(gè)致命的漏洞:

  1. 它允許提交3支或3支以上的隊(duì)伍,并且沒有限制最大數(shù)量,只限制了最少數(shù)量。
  2. 它沒有進(jìn)行相同數(shù)據(jù)的篩選。

意思就是說,我們可以一次提交幾百上千個(gè),甚至上萬(wàn)個(gè)==相同的==數(shù)據(jù)。但我會(huì)這么做嗎?考慮到后果的話肯定不會(huì),因?yàn)闆]有人可以在很短時(shí)間內(nèi)投很多票,要是他們追查起來,那發(fā)現(xiàn)還不簡(jiǎn)單?畢竟我們是在模擬真實(shí)投票嘛,所以就投3票給自己好了,隱藏功與名。

2. 表單提交

好了,既然把收集到的數(shù)據(jù)都整理好了,那么就開始寫代碼進(jìn)行表單提交了。

2.1 運(yùn)用到的庫(kù)

  • requests:非常好用的第三方庫(kù),用于表單提交

Requests庫(kù)官方技術(shù)文檔

把它看一遍,所有操作就沒問題了,下面就來寫代碼吧!

2.2 構(gòu)造表單信息

拿著這個(gè)代碼就能去投票啦,開不開心?

# 請(qǐng)求頭信息
headers = {
    'Accept': '*/*',
    'Accept-Encoding': 'gzip',
    'Accept-Language': 'zh-CN',
    'Connection': 'keep-alive',
    'Content-Length': '16',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'www.dingnf.com',
    'Origin': 'http://www.dingnf.com',
    'Referer': 'http://www.dingnf.com/active/wxws_s',
    'User-Agent': 'Mozilla/4.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.3029.110 Safari/537.36',
    'X-Requested-With': 'XMLHttpRequest'
}

# post表單網(wǎng)址
url = "http://www.dingnf.com/active/wxws_t"
params = {'ids': ['22', '22', '22']}
r = requests.post(url=url, data=params, headers=headers, proxies=proxies)

突然發(fā)現(xiàn)問題來了,只能提交一次!這是為什么?

3. 構(gòu)造代理IP池

大部分投票網(wǎng)站都會(huì)記錄投票的IP地址,避免同一個(gè)IP多次投票,那怎么辦?我們能模仿真實(shí)投票,還換不了IP地址?換IP地址是可以的,不過比較麻煩,我們有一種更加簡(jiǎn)便的方法:使用代理服務(wù)器去爬去某個(gè)網(wǎng)站的內(nèi)容,那對(duì)方網(wǎng)站上顯示的就不是我們真實(shí)的IP地址了,而是代理服務(wù)器的IP地址,在python中,使用代理服務(wù)器設(shè)置很簡(jiǎn)單。

3.1 找到代理IP

這里推薦西刺免費(fèi)代理IP,西刺,值得你擁有

代理IP

使用API可以快速獲得我們需要的IP地址,當(dāng)然,我們也可以做個(gè)爬蟲,去爬它網(wǎng)站上的URL,這里就不展開說了。


網(wǎng)站API

3.2 構(gòu)造IP代理容器

由于從API上獲得的數(shù)據(jù)多出一些換行符和回車符,不利于直接提取IP地址,所以就先用正則表達(dá)式直接提取需要的信息,再寫進(jìn)列表里面,方便之后讀取。

def WriteIPadress():
    all_url = [] # 存儲(chǔ)IP地址的容器
    # 代理IP的網(wǎng)址
    url = "http://api.xicidaili.com/free2016.txt"
    r = requests.get(url=url)
    all_url = re.findall("\d+\.\d+\.\d+\.\d+\:\d+",r.text)
    with open("D:\\code\\python\\new\\Brush ticket\\IP.txt",'w') as f:
        for i in all_url:
            f.write(i)
            f.write('\n')
    return all_url

4. 主函數(shù)

count = 0 # 計(jì)數(shù)器
while count < 4000:
    all_url = WriteIPadress()
    for i in all_url:
        proxies = {"http": i}
        try:
            r = requests.post(url=url, data=params, headers=headers, proxies=proxies)
            if(r.json()['flag'] == True):
                count += 1
                print("成功投票%d次!" % (count))
            print(r.json())
        except Exception as reason:
            print("錯(cuò)誤原因是:",reason)

由于某些IP地址是存在問題的,所以需要設(shè)置異常處理,以便讓程序能夠正常運(yùn)行,而API的數(shù)據(jù)每15分鐘更新一次,我們每跑完一遍列表的時(shí)間也差不多,因此也就不做其他處理了。

運(yùn)行日志


日志

源代碼

完整源代碼

個(gè)人博客,最新更新的文章都發(fā)在這,歡迎關(guān)注:https://yeah-kun.github.io/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,699評(píng)論 19 139
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,355評(píng)論 25 708
  • 有個(gè)人幫你鋪了席子真的會(huì)熱淚盈框
    27級(jí)單純閱讀 148評(píng)論 0 0
  • 痛風(fēng)又稱“高尿酸血癥”,是人體嘌呤代謝障礙引起的,屬于關(guān)節(jié)炎一種。痛風(fēng)是人體內(nèi)嘌呤的物質(zhì)的新陳代謝發(fā)生紊亂,致使人...
    雨下的陽(yáng)光閱讀 429評(píng)論 0 1
  • 我以為一切順理成章,我對(duì)你有些些心動(dòng),你對(duì)我也感覺不錯(cuò),可以在一起。 可是你卻說,咱們兩個(gè)都是射手座,可能射著射著...
    Miss暖晴閱讀 265評(píng)論 0 0

友情鏈接更多精彩內(nèi)容