Python 模擬登陸百度雲盤實戰教程
本文經原作者授權發布。另外,這篇是定時發布的,試試新開放的功能。O(∩_∩)O~
原文:http://www.jianshu.com/p/efcf030e68c5
文 | resolvewang
去年大概這個時候,我寫了一篇超詳細的微博模擬登陸分析和實現,那時候才剛開始在簡書上寫技術文章,以至於收穫了一些喜歡和粉絲而激動不已。後面寫了一篇關於如何以正確姿勢科學上網的文章被屏蔽之後,就沒怎麼在簡書上寫技術文章了。自己的一些想法和一些技術上的積累也只放在 個人博客上,但是感覺流量太小了,所以又打算回歸簡書寫作。
今天我給大家講講如何模擬登陸百度雲盤(該分析過程也適用於百度別的產品,比如模擬登陸百度搜索首頁,它們的加密流程完全一樣,只是提交參數有微小差別)。
閱讀文章之前,有一些東西需要給大家闡述:
本文並沒有對驗證碼識別進行分析,因為我覺得寫爬蟲最主要的不是識別驗證碼,而是如何規避驗證碼。
本文要求讀者具有模擬登陸(主要是抓包和閱讀 js 代碼) 和密碼學的基本知識。
和模擬登陸微博的分析流程一樣,我們首先要做的是以正常人的流程完整的登錄一遍 百度網盤。在打開瀏覽器之前,先打開抓包工具,以前我在 win 平台用的是 fiddler,現在由於電腦是 mac 系統,所以選擇 charles進行抓包。如果有同學沒有 charles 的使用經驗,那麼需要先了解如何讓 charles 能抓取到本機的 https 數據包。由於使用 charles 抓包不是本文的重點,所以我就簡略說一下:
安裝 charles 證書。通過菜單 help -> ssl proxying -> install charles root certificate 進行安裝,安裝過後把證書設置為始終信任
修改 charles 的 proxy settings。 選擇 proxy->proxy settings,然後勾選"enable transparent HTTP proxying"
修改 Charles 的 SSL proxy settings。選擇 proxy->ssl proxy settings,在彈出的對話框中勾選"enable ssl proxying",並在location部分點擊 add,添加需要捕獲的站點和 443 埠,如圖:
charles ssl proxy 設置圖
charles 設置好了之後,我們再使用瀏覽器直接打開 百度網盤首頁 。注意打開之前如果以前登錄過百度網盤,一定要先清除百度網盤的 cookie,如果不清楚自己以前登錄過沒,那麼最好把關於百度的 cookie 都清除了吧。如果清除得不徹底,很可能會錯過很關鍵的一步,我先按下不表。通過抓包,我們可以看到請求百度網盤的首頁,大概有這些請求:
百度網盤首頁請求數據
這裡other hosts是本機別的請求,所以直接被我忽略了(通過設置請求為"focus"或者"ignore")。下圖給的是設置方法,主要是Focus和Disable SSL Proxying:
設置請求為 focus,並且注意disable ssl proxying
在輸入登錄賬號過後 js 觸發的請求
我們看看它返回的內容:
輸入賬號後服務端返回的內容
可以看到有效信息大概有兩個:pubkey和key,它們的用途我們都還不知道,但是看命名可知大概pubkey是某種加密演算法的公鑰。
然後我們輸入密碼,點擊登錄,可以看到 charles 的請求:
登錄中的請求
上圖圈出來的請求就是提交的密碼和登錄賬號等信息,這個只有大家自己挨著請求查看,才可以確定哪個是 post 的請求。我們查看 post 的參數:
post 參數
現在終於 Get 到重點了,主要就是要把這些提交的參數的生成方式弄清楚。如果有過模擬登陸或者爬蟲編寫經驗的同學,都應該知道請求參數構造之前必須分析清楚哪些參數是變的,哪些參數是不變的,變的哪些參數比較有規律,哪些沒有規律。這個分析過程是通過反覆登錄和抓包,對比 post 數據來完成的。我們通過反覆登錄和對比 post 的數據,可以發現:
staticpage、charset、 tpl、 subpro、apiver、codestring、 safeflg、u、 isPhone、detect、quickuser、logintype、logLoginType、idc、loginmerge、foreignusername、username、mempass、crypttype、countrycode、dv
等參數不會變化。所以我們只需要分析變化的參數。
變化的參數當中, 看樣子基本可以確定是請求時間戳(需要分析它是多少位,精確到毫秒還是秒),其它好像都沒什麼規律。由於微博模擬登陸的經驗,我們基本可以判斷出 這個參數是最難分析的(從賬戶安全形度上來說也應該是加密最複雜的),我們放到後面分析。
那麼我們先來分析 欄位吧。參數不可能憑空產生,來源只有兩種可能:一種是通過服務端返回, 另外一種是通過請求回來的 js 構造。在分析 token 產生的時候,我們需要用到 charles 的查找功能(良心推薦,很強大),它可以查找到整個登錄流程中,包含某個查找字元串的所有請求和響應。下圖中的"望遠鏡"圖標就是查找功能。
使用 charles 查找包含 token 值的請求和響應
通過查找,我們可以看到有 14 個地方包含了 token 的值,我們發現基本都是使用 token 作為請求參數的,不過有一個結果是返回 token 值的:
token 的返回
它的請求 url 是
請求參數格式化一下,可能更方便查看:
獲取 token 的請求參數
根據上面介紹的分析變數與不變數的思路,這裡我們可以看到要獲取到 ,需要知道 、 的構造方法。然後用和分析 token 同樣的方式,我們來分析 gid 的產生。通過在 charles 中查找 gid 的值,我們發現找到的結果全是在請求中,並沒有在響應中找到該值,說明該值是通過 js 生成的而不是通過服務端返回的。既然是通過 js 生成的,我們需要找到該 js 文件。怎麼找呢?我們在 charles 中輸入 ,再來看看查找的結果,注意這次我們重點關注哪個 js 文件中出現,否則查找的結果太多,看起來會比較費力。通過查找,可以看到名為 logintangramc36ce25.js這個文件中頻繁出現了*gid這個參數,基本可以確定這個 js 文件很關鍵,這也是我先前說的在抓包分析之前需要把百度的 cookie 等歷史數據清除的原因,否則該 js 文件可能已經緩存了,charles 中就查不到該 js。我們把該 js 文件下載下來,通過 webstorm 將其中的代碼格式化,再查找 ,可以看到這段代碼
gid 的生成方式
其中的 函數就是生成 gid 的函數,因為我們在 webstorm 中查找 字元串的時候,可以發現很多如下圖所示的語句,只需要定位到 即可
gid 的聲明
我們現在找到了 的生成方式了,如果讀不懂這段 js 也沒關係,可以直接使用 或者 等庫將運行後的 js 結果返回給 python 使用。然後我們再回到獲取 token 的請求參數那張圖,發現還有個 參數需要分析。同 gid 分析過程一樣,我們先搜索 callback 的值 ,發現只有請求中包含,基本可以確定它是通過 js 產生的,而加密 js 文件我們已經找到了。如果你害怕可能不是上面的那個 js 文件,我們也可以通過在 charles 中搜索 這個字元串,可以發現就是該 js 文件。通過在 webstorm 中搜索 關鍵詞(通過前面多次登錄抓包分析,可發現 callback 的 前綴不會改變,這個也可以是搜索依據),可以找到 callback 的生成方式
截至目前,我們已經弄清楚了gid和callback的生成方式了,這樣我們就可以通過構造請求來獲取到 了。我們再返回post 參數這張圖片,可以看到還有 、 、 這三個欄位還需要分析。而通過搜索 的值,可以看到其實它就是 圖片輸入賬號後服務端返回的內容中的key的值,我們可以通過
這個請求獲取到。請求的參數如圖,都是我們前面分析過並且能夠得到的參數:
獲取 key 和 pubkey 的請求參數
現在我們就只有 和 兩個欄位沒分析了。
老規矩,我們先在 charles 中搜索 的值,發現只有一個請求中出現了。那麼它肯定是 js 生成的,它是如何生成的呢?我們又在我們獲取的 logintangramc36ce25.js文件中搜索 這個字元串,可以發現這段代碼:
然後我們再看 是如何生成的。可以看到這段代碼
r.timeSpan = (new Date).getTime() - e.initTime
大概是一個時間差:當前時間-初始化時間。當前時間容易獲取,那麼初始化時間到底是什麼初始化呢?繼續追蹤 initTime 可以發現這段代碼
上述代碼既有 、 又有 關鍵字,那麼十有八九就是加密 的方法了。主要加密語句是:
e.RSA.encrypt(a)
我們查看 的實現
這裡的過程大概就是先用 返回的對象對 進行加密,然後再進行一次 ,這裡 js 的代碼十分複雜,如果想把對應的 js 轉化為 python 實現,需要很深的 js 和 python 功底,但是這個轉換已經有人幫我們做了。這裡的 即是使用rsa非對稱加密演算法對密碼進行加密。而 是 base64 編碼方法。判斷 是 rsa 加密演算法的依據是該 js 文件中出現了多次 ,並且也有
這類代碼作為佐證。判斷後者是 base64 演算法的依據是 函數中出現了
這類字元串,它是 base64 編碼的一個基礎部分。
所以說這裡的分析需要大家有基本的密碼學知識,否則分析會比較困難。這裡友情提示一句,目前主流的大中型網站都會使用 rsa 演算法對密碼進行加密,所以大家需要有這個意識。但是不要求大家會實現 rsa 等加密演算法,因為無論是 python 還是 js 還是 java 都有相關的實現了,我們只需要會分析會使用就行了。
到這裡所有的參數分析就結束了,我們可以通過 代碼進行驗證。
上面詳細介紹了百度整個登錄流程。我們來總結一下:
先通過 加密 js 文件獲取到 , 參數
根據 這個(get) 請求獲取到
根據 這個(get) 請求獲取到 和
根據獲取到的 對 password 進行加密,然後再進行 base64 編碼操作
將所有固定和構造的參數進行 post 請求,post 請求的 url 為 ,如果該 post 返回 ,那麼模擬登陸就成功了,否則則失敗,會返迴響應的
前面費了這麼大的力氣分析百度的登錄流程,如果實在是想走捷徑的,可以使用 selenium 自動化的方式登錄,這個我也給了 相關實現。讀過我的新浪微博模擬登陸的同學大概對介於直接登錄和使用 selenium 自動化登錄之間的方法還有一些印象吧,這裡我並沒有使用該方法,因為如果要使用該方法的話,需要改動一些 js 來使代碼跑通。有興趣的同學可以試試,應該比較有意思。
如果有同學感覺本文有一些難度,可以嘗試一些簡單的模擬登陸,比如知乎和 CSDN 等,我寫過一篇關於 CSDN 模擬登陸的文章, 微博模擬登陸應該比本文的分析難度稍微要小一點,如果有興趣,也可以讀讀。
我把代碼放到我的開源項目 smart_login上了,點擊 這裡可以查看百度模擬登陸流程的實現,如果有不清楚的同學,建議對照代碼再來讀本文,可能會更加清晰,如果實際動手按本文的分析流程走一遍,那麼可能會有一些收穫。
如果大家覺得本文對大家有幫助,不妨點個喜歡,如果代碼對大家有幫助,也不妨點個star,以表示對我的鼓勵吧。愛給別人點贊的孩子,運氣始終不會太差。
題圖:pexels,CC0 授權。
點擊展開全文


※Houdini中Expressions,HScript,Python,VEX區別
※如何用 Python 檢測偽造的視頻
※為什麼數據科學家偏愛Python
※超詳細的Python實現新浪微博模擬登陸
※為什麼數據科學家偏愛Python?
TAG:Python |
※Google推出Google One雲盤服務替代Google Drive
※這很OneDrive:Chrome OS支持雲盤離線了
※索尼為PlayStation Plus會員雲盤擴容至100GB
※如何在 iPhone 上刪除 iCloud 雲盤下載的文件?
※用iPhone搭建自有雲盤教程,安全又簡單!
※你的私有雲盤,AirDisk Q3S網路移動硬碟盒評測
※不買iCloud了,果粉福音:西數 3TB 私有雲盤 開箱體驗
※群暉和阿里雲一起做了一個企業雲盤——SkyNAS
※微軟OneDrive雲盤可擴容至2TB:每月9.99美元
※自帶WiFi的移動硬碟,網路雲盤般方便,私人NAS般穩妥
※360 安全雲盤 iPad 端上線:支持個人存儲
※雲盤數據換新家,鐵威馬F4-220 NAS輕評測!
※小白家庭雲盤體驗 入門級NAS的新選擇
※360安全雲盤iPad版上線:個人可存儲、共享文件
※隨身攜帶4TB私有雲盤?WD無線存儲體驗
※實測:不僅無需公網IP,還能免費內網穿透群暉NAS私有雲盤?
※鐵威馬NAS+8T酷狼搭建專屬雲盤,從此數據更安全!
※0元購?斐訊挖礦NAS雲盤曝光:無限存儲空間
※不要再買雲盤會員,有這神器在家就能搭NAS—奧睿科 3.5英寸硬碟櫃評測
※讓EOS變身我們的免費雲盤