兩年前的中秋節(jié),阿里巴巴四個(gè)程序員編寫了段網(wǎng)頁腳本,搶了公司一百多盒月餅而慘遭辭退。有人說阿里小題大做,有人說誠(chéng)信第一,那時(shí)我在想他們是如何做到的呢?上個(gè)月,二組群里討論P(yáng)ython編程,我忽然想起了搶月餅事件。問了一圈群里沒人做過,董書云戰(zhàn)友鼓勵(lì)我:想做就去學(xué),一定可以學(xué)會(huì)的。一拖再拖,這周終于開啟了學(xué)習(xí)。
搜索發(fā)現(xiàn)網(wǎng)絡(luò)上已經(jīng)有不少解決方法,但思路基本一致:利用瀏覽器插件實(shí)現(xiàn)代碼注入。瀏覽器編程語言為JavaScript(JS),與我熟悉的C語言相差挺大,在Kindle下載了三本相關(guān)的書,快速了解了JS的基本規(guī)則。按照網(wǎng)絡(luò)教程,學(xué)會(huì)了谷歌(Chrome)瀏覽器簡(jiǎn)單擴(kuò)展程序的開發(fā)。這樣就掌握了編寫自動(dòng)搶購腳本的最少必要知識(shí)。然后,最好的辦法就是行動(dòng)起來,去做,去犯錯(cuò)吧。
我這次要寫的這個(gè)腳本其實(shí)很簡(jiǎn)單,就是讓程序自動(dòng)點(diǎn)擊搶購頁面上的按鈕,開發(fā)步驟如下。
1.設(shè)置一個(gè)搶購頁面
第一步是做一個(gè)搶購頁面,供腳本使用。代碼如下圖所示,將其保存為html文件。

頁面顯示十分簡(jiǎn)陋,最重要的是設(shè)置的“點(diǎn)我搶購”按鈕。

正常情況下,用戶通過點(diǎn)擊按鈕參與到購買活動(dòng),拼的是手速。很多時(shí)候,我們并不知道也許自己競(jìng)爭(zhēng)的對(duì)手是機(jī)器。利用腳本在滿足條件的一瞬間(到預(yù)定時(shí)間等)迅速出擊,制造出秒殺、秒光的場(chǎng)景。
2.寫一個(gè)自動(dòng)觸發(fā)程序
開發(fā)一個(gè)簡(jiǎn)單的谷歌瀏覽器擴(kuò)展程序,配置如下圖所示,將其保存為manifest.json文件。

最核心的部分是編寫與其配套的JS文件,但代碼十分簡(jiǎn)單:
setInterval(function(){document.getElementById("rush").click()}, 1000)
作用是開啟一個(gè)定時(shí)1秒的定時(shí)器,在定時(shí)到的時(shí)候就點(diǎn)擊網(wǎng)頁上Id為"rush"的按鈕,也就是1秒自動(dòng)點(diǎn)一次搶購按鈕。在準(zhǔn)備好這兩個(gè)文件后,打開Chrome,在菜單欄找到擴(kuò)展程序選項(xiàng),點(diǎn)擊進(jìn)入擴(kuò)展程序管理界面,選擇存放這兩個(gè)文件的文件夾,即可添加剛開發(fā)的擴(kuò)展程序。
打開html文件,不做任何操作,瀏覽器就會(huì)彈出搶購成功的提示,也就是腳本已經(jīng)順利運(yùn)轉(zhuǎn),幫我自動(dòng)完成了搶購。

3.場(chǎng)景擴(kuò)展
為了測(cè)試這個(gè)腳本對(duì)真實(shí)網(wǎng)頁的效果,隨便打開了瀏覽器收藏夾中的一個(gè)網(wǎng)址,瞄準(zhǔn)了該頁面上的“搜索”按鈕,目標(biāo)是通過腳本自動(dòng)實(shí)現(xiàn)對(duì)該按鈕的點(diǎn)擊。通過查看網(wǎng)頁源代碼找到了該按鈕的Id,修改相應(yīng)的腳本代碼。重新添加擴(kuò)展程序,刷新網(wǎng)頁,預(yù)想的情況發(fā)生了,“搜索”按鈕被點(diǎn)擊,打開了一個(gè)搜索頁面。意想不到的事情也發(fā)生了,自動(dòng)打開的頁面越來越多,甚至來不及關(guān)閉原網(wǎng)頁,不得已只得關(guān)閉整個(gè)瀏覽器。

這個(gè)腳本初步實(shí)現(xiàn)了自動(dòng)搶購的功能,為了能夠滿足實(shí)際應(yīng)用,還需要根據(jù)具體情況進(jìn)行改進(jìn),比如監(jiān)測(cè)到按鈕的狀態(tài)從不可用到可用時(shí)發(fā)起點(diǎn)擊,或者在預(yù)定時(shí)間點(diǎn)發(fā)起點(diǎn)擊,或者自動(dòng)填寫網(wǎng)頁的表格等。
說實(shí)話,這個(gè)小腳本對(duì)于互聯(lián)網(wǎng)開發(fā)者根本不值一提,但對(duì)于只與盒子打交道的嵌入式程序員來說,卻仿佛看到了代碼世界的另一個(gè)維度。區(qū)塊鏈開發(fā)者嘲笑互聯(lián)網(wǎng)開發(fā)者為古典程序員,這么說我肯定算是一個(gè)遠(yuǎn)古程序員了。遠(yuǎn)古不可怕,但如果不懂進(jìn)化,或許想離滅亡就不久遠(yuǎn)了。