最近看到發的一個微信拉票,閒來無事研究了一下,發現這個活動是可以刷票的,簡要的記錄一下寫刷票腳本的過程。實際上,這種爬蟲程式碼的實作永遠都是小問題的,重要的是你要知道別人的頁面的邏輯,如何去分析和爬取才是難點
打開微信的投票頁面,將螢幕往下拉會發現螢幕頂端顯示為"本網頁由XXX提供",需要注意的是,這裡的"XXX"並不是"mp.weixin.qq.com",而是活動舉辦方的域名。也就是說,這個投票活動的程式是運行在S商城的伺服器上面的。這裡就涉及到微信公眾平台OpenID的概念了,官方對OpenID的解釋是:加密後的微訊號,每個使用者對每個公眾號碼的OpenID是唯一的。也就是一個用戶對一個公眾號碼有一個唯一的OpenId。
投票的邏輯是用戶在投票請求時,會在POST參數中提供用戶的OpenID;S商城伺服器在接收到投票的POST請求後,透過查詢當前OpenID是否在4小時已經投過票,就可以阻止單一用戶重複投票的行為了。
然而,這裡面卻存在著一個很大的漏洞!
S商城只能判斷OpenID是否出現了重複,但是卻無法校驗OpenID的有效性,因為它是無法呼叫微信伺服器來對這個OpenID進行校驗的。
那我們只需要產生符合格式OpenId然後發送post請求就可以了。
但是一次投票也很奇怪,實際上是分兩步驟完成的。第一次是一個get請求(圖片中被打碼的部分設計到隱私,只需要知道一次投票是透過兩個請求來完成的就行了
當我看到第一個請求的名字的時候,我以為是這次請求就完成了,但當使用爬蟲訪問這個介面時,並不能使得票數增加。仔細觀察後發現還有另一個請求。
這個請求的path很奇怪,是一串亂碼,而且每次不一樣。只觸發了第一個請求之後沒有再進行其餘的操作,這時我就能我就能確定,一次投票是透過第一個請求得到一些隨機產生的參數,然後再第二次請求帶上這些參數來保證第二次請求的合法性,這樣來完成一次投票過程。所以第一個請求的頁面中一定有地方呼叫了第二個請求。這時候查看原始程式碼時發現在頁面中有一串這樣的程式碼
當在頁面中發現亂碼的時候,往往是程式碼被加密了
其中有兩個參數是第二個請求的path,可以看出這串亂碼是和第二個請求有關聯的,而那一串顏文字是對js程式碼的加密。雖然我們看不懂這串亂碼是什麼意思,但我們可以按分號(;)將這串亂碼格式化之後直接在chrome控制台中跑,發現這串顏文字代碼的效果就是執行第二個請求。 (這個地方應該是可以還原程式碼的,有知道的可以講解一下)
到這裡基本上就算做完了,剩下的就是程式碼實現,總的來說,就是訪問第一個請求,用正則在頁面中爬取參數,將參數作為第二個請求的path進行對第二個請求的存取。 當然還有ip代理,訪問的隨機的時間間隔,最好能動態模擬不同的設備,即修改User-Agent這些常見問題就不做說明,如果對這些有什麼問題可以發郵件。
總的來說,使用python進行程式碼實現並沒有太大的難度,難度在於一步步的分析,掌握網站的邏輯,並且不斷的嘗試。這點只有多做才有效果