遲到的爬蟲!!!

童年,是一幅迷人的畫

聽說懂得欣賞技術的人都已經關注了我們,你還在等什麼?

先input一個題外話,最近快到期末,老師布置了作業項目,加上快要兒童節了,最最最激動的是618的預熱。咳咳、、所以,時間比較倉促,但百忙之中還是把文章寫出來了,原諒我的懶惰!!!如果有什麼不對的地方,還請大家指正!!!

大家都知道,啊呸,可能有人知道,在微信裏面有個小程序,叫做抽獎助手(免費打了一波小廣告是不是得讓我中一次啊,

F**k!)。我經常進去抽獎,雖然一次都沒有抽到過,但是,我畢竟也沒發過獎啊

。。。等公眾號稍微做得有點起色之後再嘗試發起抽獎吧。。。

很顯然,在抽獎助手中的公共抽獎,參與抽獎是免費的,但是需要花時間,想抽獎就不得不每天打開小程序逐個點擊參與才能參與(我自己也經常忘記

),每天重複的操作覺得好繁瑣,於是在某一天看到@劉志軍寫的文章後,發現可以用爬蟲去參與抽獎,但是感覺不是圈子裡的人是看不懂的

。所以,參考了@劉志軍大大的文章的基本思路,加上我自己的理解,然後用比較容易理解的口吻和方式,重新寫了這樣一篇文章,來實現用爬蟲去自動參與抽獎。

準備事項

  1. 別的基本的廢話(什麼準備手機和電腦之類的)就不多說了,首先,你得現在電腦上安裝Python(推薦用python3.6.5的版本,請自行去社區下載安裝),特別注意要勾上Add Python 3.6 to PATH這個選項喲!
  2. 在你的電腦上安裝Fiddler,並學會使用,由於篇幅有限,並且不偏離主題,這裡不教大家使用,只是簡單介紹跟我們這次相關的知識,其他的請自行爬樓!!!
  3. 用 Python 來構建一個自動參與抽獎的腳本。
  4. 大致思路就是這樣子了,差不多了。。。

我也是菜鳥,別對我要求太多

Fiddler的工作原理

如何下載安裝就不多廢話了,如果你連這個都不會,那麼你就是連門都沒入,下面的內容也沒必要看了,這個和安裝遊戲也沒啥多大的區別!

什麼是Fiddler?

Fiddler是一個web調試代理。它能夠記錄所有客戶端和服務器間的http請求,允許你監視,設置斷點,甚至修改輸入輸出數據,fiddler包含了一個強大的基於事件腳本的子系統,並且能夠使用.net框架語言擴展。

原理?

Fiddler 作為系統代理,當啟用Fiddler 時,IE 的PROXY 設定會變成一個相對的數值,比如(127.0.0.1:8888)。所有的來自互聯網服務的HTTP 請求在到達目標Web 服務器之前都會經過Fiddler,同樣的,所有的HTTP 響應都會在返回客戶端瀏覽器之前經過Fiddler。

看上圖,你就明白原理了,它以8888端口開本地代理服務器,並且支持https!另外,除了他具有一般web調試器的所有功能之外,其最最大的一個特點是可以中途修改http通信內容來達到調試的功能。

操作

在實際操作中,手機和電腦要在同一個局域網絡中!打開Fiddler軟件,界面和其他抓包軟件一樣,全英文

再次確保安裝Fiddler的電腦和你的手機在同一局域網內,因為Fiddler只是一個代理,需要將手機的代理指向PC機,不能互相訪問是不行的。

先ping出自己的電腦的IP地址,打開控制台,輸入ipconfig即可!

然後打開Fiddler,選擇Tools>Options>Connections,勾選Allow remote computers to connect這個選項,然後確定。弄完之後一點要重啟Fiddler軟件!!!

然後在手機端配置即可!代理選擇手動,主機名就是電腦的IP地址。具體的都視情況而定。

然後就可以抓包了,先隨便抓一個看看,可以看到現在抓取的地址包:

通過 Fiddler 抓包,我們看到抽獎列表的請求地址是:/public_lottery?page=1&size=5, 請求方法是 GET,還有一個 Header 字段 Authorization,返回的數據結構可以清晰看到總共返回了5條數據,代表5個獎品,每個字段基本能猜出來什麼意思。

(這張圖片來源於@劉志軍)

看背後它是怎麼向服務器發送請求的,弄清楚了原理之後就可以用程序來自動模擬請求。

用Python來實現

現在我們就可以用 Python 來構建一個自動參與抽獎的腳本,每隔一段時間就去自動刷,發現有新的獎品,就自動參與抽獎啦。(代碼感謝@劉志軍大佬寫出來,鼓掌

源代碼

# coding=utf-8    import requests    def main():      url = "https://lucky.nocode.com/public_lottery?page=1&size=5"      # 替換成你自己的Authorization      headers = {          "Authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXV...."}      res = requests.get(url, headers=headers)      lotteries = res.json().get("data")      join_url = "https://lucky.nocode.com/lottery/{id}/join"      for lottery in lotteries:          res = requests.post(join_url.format(id=lottery.get("id")), headers=headers)          data = res.json()          if res.status_code == 200 and 'errors' not in data:              print("成功參與抽獎:《%s》" % lottery.get("prizes").get("data")[0].get("name"))    if __name__ == '__main__':      main()

(代碼可以左右滑動查看)

成功參與抽獎:《阿瑪尼紅管唇釉》  成功參與抽獎:《Havaianas 人字拖》  成功參與抽獎:《《不要成為無聊的大人》》  成功參與抽獎:《Satan 鑰匙扣》  成功參與抽獎:《桌面理線器》

運行後你就會發現,抽獎活動全部變成已參與了!

最後,祝大家:

6.1

兒童節快樂

下面是@劉志軍大佬的原話:有人可能會問,這算不算作弊呢?我覺得這就是程序員的優勢,我們只是用了不一樣的工具來完成相同的事情,以後編程還真的是每個人都應該掌握的一項基本技能,沒事寫個代碼解決繁瑣的、重複的工作。懶惰是推動社會文明進步的原動力。

下次再見

想學Java&python|其它計算機語言的你,是否有過迷茫呢?沒關係,私信龍先森,讓龍先森對你一對一解答!

『好了,本期就說到這,一期一篇,有精華有乾貨,有時也划水,還希望大家多多支持。如果你喜歡龍先森的文章,不妨點擊下關注,並分享至朋友圈!』


*版權聲明:版權歸作者本人所有,尊重原創,推送文章除非無法確認,都會註明作者和來源。如果出處有誤或侵犯到原作者權益,實屬無心之舉,請務必與我聯繫刪除或授權事宜。