說(shuō)實(shí)話,我很想把文章標(biāo)題寫成“如何利用網(wǎng)絡(luò)請(qǐng)求搶票搶優(yōu)惠券”
為了能讓大家搞清楚原理,首先讓我們簡(jiǎn)單地從流程上分析,點(diǎn)擊一次“購(gòu)買”按鈕到底發(fā)生了什么。
購(gòu)買之前,網(wǎng)頁(yè)肯定是會(huì)讓你登錄的對(duì)吧,當(dāng)你登錄之后呢,其實(shí)會(huì)生成一個(gè)Cookie保存在瀏覽器,用于校驗(yàn)?zāi)愕纳矸?/strong>。需要注意的是,這個(gè)Cookies不同的網(wǎng)站會(huì)有不同的有效時(shí)間,過期之后會(huì)提示你重新登錄。
-
當(dāng)我們鼠標(biāo)點(diǎn)擊“購(gòu)買”按鈕后,其實(shí)是在執(zhí)行JavaScript代碼。此時(shí)會(huì)生成一些參數(shù),表示你的身份,比如你要購(gòu)買的物品id,物品數(shù)量,當(dāng)前時(shí)間等等,然后將這些參數(shù)使用一定的規(guī)則拼接起來(lái),形成了FormData,它記錄了你想做的操作。
當(dāng)然,并不是所有的操作都是通過FormData來(lái)實(shí)現(xiàn)的,有的請(qǐng)求會(huì)采用Query String Parameters的形勢(shì),主要特點(diǎn)是將請(qǐng)求內(nèi)容拼接在URL后面,如https://cart.jd.com/gate.action?pid=5046791&pcount=1&ptype=1,pid=5046791&pcount=1&ptype=1是我們的發(fā)送給服務(wù)器的內(nèi)容。
于是,有了這兩個(gè)必須的參數(shù)后,就能向服務(wù)器發(fā)起網(wǎng)絡(luò)請(qǐng)求了,請(qǐng)求的目標(biāo)網(wǎng)址叫Request URL,這個(gè)網(wǎng)址可以通過抓包獲取,或者自己分析js代碼。在header里設(shè)置上我們的Cookie表明身份,通過目標(biāo)網(wǎng)址向服務(wù)器發(fā)送我們的請(qǐng)求內(nèi)容FormData(或使用QueryStringParameters)。這樣的一個(gè)網(wǎng)絡(luò)請(qǐng)求,就是點(diǎn)擊“購(gòu)買”按鈕真正起作用的步驟。
至于如何發(fā)起這樣的網(wǎng)絡(luò)請(qǐng)求,在網(wǎng)頁(yè)上點(diǎn)擊自然是使用了網(wǎng)站提供的JavaScript代碼。而我們?nèi)绻胍M這樣一個(gè)操作,可以用不同語(yǔ)言的代碼去實(shí)現(xiàn)。
我對(duì)java代碼熟悉一點(diǎn),用java編寫了一個(gè)小軟件提供給那些不會(huì)代碼或者懶癌玩家使用,同時(shí)提供了定時(shí),秒殺等等功能。GitHub地址:NetRobot
舉一個(gè)bilibili投硬幣的例子,這個(gè)例子是比較常見的POST請(qǐng)求??匆幌庐?dāng)我們想要給喜歡的視頻投硬幣,到底是怎么進(jìn)行的網(wǎng)絡(luò)請(qǐng)求。
現(xiàn)在我想要給新番刀劍神域投硬幣,于是我點(diǎn)擊了投幣,這一瞬間發(fā)生了什么。
我們可以使用瀏覽器自帶的抓包工具,以Chrome瀏覽器為例,點(diǎn)擊瀏覽器的檢查按鈕,找到Network,點(diǎn)擊clear清楚掉之前的請(qǐng)求記錄,如下圖

然后我們點(diǎn)擊確定,瀏覽器會(huì)記錄下剛才的網(wǎng)絡(luò)請(qǐng)求,如下圖

這一個(gè)add就是我們剛才投硬幣的網(wǎng)絡(luò)請(qǐng)求了,我們來(lái)分析一下這個(gè)請(qǐng)求的內(nèi)容。
首先有一個(gè)Request URL,就是前面提到的請(qǐng)求目標(biāo)api,這個(gè)操作就是向這個(gè)網(wǎng)址發(fā)起post請(qǐng)求。
然后有一個(gè)Form Data,它記錄了我們投幣的視頻id(aid),投幣數(shù)量(multiply),還有一個(gè)csrf我也不知道是什么,可能是用來(lái)身份驗(yàn)證的。
在Request Headers中,我們可以找到我們?cè)谠摼W(wǎng)站的Cookie,如下圖

有了這三個(gè)東西,我們就可以不用瀏覽器,直接使用其他的軟件完成投幣操作了。
打開我們的網(wǎng)絡(luò)請(qǐng)求軟件,將這三個(gè)參數(shù)依次復(fù)制進(jìn)去(記得點(diǎn)擊view source后復(fù)制原始文字),我們更換一下aid,這里隨便找了個(gè)視頻,aid=33615324,點(diǎn)擊一下測(cè)試按鈕發(fā)送一次網(wǎng)絡(luò)請(qǐng)求,結(jié)果如下:

這里我請(qǐng)求了一個(gè)已經(jīng)投過幣的視頻,返回結(jié)果顯示無(wú)法再投幣了,說(shuō)明起作用了。
再以jd的購(gòu)物為例,這個(gè)請(qǐng)求方式不同于常規(guī),使用了Query String Parameters的形式。
首先隨便加入一個(gè)東西到購(gòu)物車,我們可以看見請(qǐng)求的參數(shù)是Query String Parameters,而并沒有form data,說(shuō)明這個(gè)方式是將參數(shù)拼接在目標(biāo)網(wǎng)址后面的。
pid代表商品id,pcount代表數(shù)量,ptype不知..于是,我們現(xiàn)在有了RequestURL,Cookie,以及Parameters。
只要我們更換pid,我們就能將其他的商品通過網(wǎng)絡(luò)請(qǐng)求的方式加入我們的購(gòu)物車了,現(xiàn)在來(lái)試一下。

可以看見URL里有很多? & =這樣的字符,說(shuō)明不是formData的形式,于是我們只需要把URL和Cookie復(fù)制進(jìn)去就行了。

我們點(diǎn)擊開始,進(jìn)行持續(xù)請(qǐng)求,每個(gè)50毫秒請(qǐng)求一次(可以配合定時(shí)進(jìn)行搶商品)??梢钥匆姺椿亓艘欢裩tml代碼,其實(shí)就是告訴你成功加入了購(gòu)物車?,F(xiàn)在我們?nèi)ベ?gòu)物車看一看,確實(shí)是加入了。

通過這個(gè)原理,在秒殺的時(shí)候,我們只需要預(yù)先找一下商品的pid,減小一點(diǎn)間隔(太快了或者持續(xù)太久可能會(huì)有風(fēng)險(xiǎn)),就能設(shè)置個(gè)定時(shí),愉快地自動(dòng)加入購(gòu)物車了。