開始
在上一文中,我們保存了百度雲盤的地址和提取碼,但是這種分享鏈接很容易被屏蔽,最好的做法就是保存資源到自己的網盤,不過采集的鏈接有上萬個,人肉保存並不現實,所以本文嘗試了批量保存資源,如您還沒看過上文,這里可以跳轉。
觀察請求
以下面資源鏈接為例:
在瀏覽器中輸入以上鏈接,會自動跳轉到 https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ
,
輸入正確提取碼后發現直接跳轉到資源保存頁面了,F12 NETWORK里也看不到此請求的返回值,這時候只能使用Fiddler才能抓到包了。
Fiddler抓包
打開Fiddler,為了不讓其它各類請求影響到我們,首先進行簡單設置,以此來顯示我們想要的請求,點擊Filters 進行如下設置,最后點擊Actions里的Run Filterset now,就只會顯示 pan.baidu.com
域名的請求:
測試post數據
為了得到點擊提取文件按鈕時發送的請求和post的數據,先嘗試輸入一個錯誤的提取碼123,查看請求:
https://pan.baidu.com/share/verify?surl=tHSxZQueF-Wsa2T0NlT3vQ&t=1593142082616&channel=chunlei&web=1&app_id=250528&bdstoken=855345cbf66bbfba3d30d5e201ea346f&logid=MTU5MzE0MjA4MjYyMDAuNTM5MjA2Nzg2ODEyNTcxNA==&clienttype=0
看來上面這個url就提取數據的請求,接下來具體看一下都提交了哪些數據:
Form Data中的pwd就是剛才輸入的錯誤提取碼,而其它兩個參數vcode和vcode_str在沒有驗證碼的情況下也不用管,再看看Query String中的參數,為了測試這些參數有哪些是變化的,我挑選了一些資源鏈接去嘗試,具體過程就省略了,總結如下:
Query String參數 | 是否變化 |
---|---|
surl | 即資源鏈接中的最后部分,可直接獲取 |
t | 時間戳,可直接獲取 |
channel | 固定 |
web | 固定 |
app_id | 固定 |
bdstoken | 固定 |
logid | 變化 |
clienttype | 固定 |
Form Data參數 | 是否變化 |
---|---|
pwd | 即提取碼 |
vcode | 無 |
vcode_str | 無 |
從上面表格來看,需要手動獲取的就是logid,稍微有點經驗的話應該都能想到這會不會是js動態生成的,抱着這個心態來到sources標簽下,搜索logid關鍵字,果不其然,有個JS文件里有這個參數,直接定位到相應的行數:
直接在68行打一個斷點,查看運行狀態:
細心的同學一個很快就能發現上圖紅框里的值就是第一次請求 https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ
cookies里的 BAIDUID
的值, logid
就是通過上面一些js代碼中的一些算法得到的,cookies如下:
BIDUPSID=EC39F255CF7B146E8ADD4FA37DB16739;BAIDUID=BBBC2B2C1269AF3AA7D113D07FAC5E80:FG=1; PSTM=1587390447; PANWEB=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDCLND=C4jsJ4aHacfrqq02TYbUOKGFFDefnJAMNmU%2BI3v5FNM%3D;
水平有限,沒辦法將這段js改寫為python,不過好在python提供了一個執行js代碼的庫 pyexecjs
,該庫運行於Nodejs環境,首先要保證你的機器安裝了Nodejs:
pip install pyexecjs
下圖即代表安裝正確了,execjs可以正常使用
將js代碼稍微修改一下,保存為 yunpan.js
:
使用execjs執行一下
得到所有的變化參數后就可以提交數據了:
通過Fiddler抓包發現返回的res為下,errno為0即代表提交成功:
{"errno":0,"err_msg":"","request_id":8738382064533520558,"randsk":"g2VwUSYs1KSuOMh9%2FQDVUUwc7ICFq4CZNmU%2BI3v5FNM%3D"}
留意上面的 randsk
。
如果你是用瀏覽器抓包就會發現輸對提取碼點擊按鈕后請求會全部刷新一次,就不能確認到底是哪個請求跳轉到資源頁面的,只能使用Fiddler才能抓到 POST
成功后的請求,經過測試,發現POST數據后又再次請求了 https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w
這個鏈接,沒錯,就是上面一開始請求的鏈接,區別就是這次請求cookie中攜帶了剛才返回的 randsk
的值。所以再次請求時添加上 randsk
:
保存資源
抓包分析
抓包保存資源鏈接發現為:
#保存鏈接 https://pan.baidu.com/share/transfer?shareid=4180912663&from=2693937402&ondup=newcopy&async=1&channel=chunlei&web=1&app_id=250528&bdstoken=7a8e1e34b454fd27de65b7662f67c2fa&logid=MTU5MzE4MTYzNDY0NDAuOTE1MzE0NDI5MzI1NTY4OA==&clienttype=0"
Query String
和 Form Data
為:
Query String大部分參數都提到過,可以參考上面,這里出現了新的兩個參數 shareid
和 from
,經過測試除了這兩個參數和上文中 logid
,其它參數均為固定。
Form Data參數 | 是否變化 |
---|---|
fsidlist | 變化 |
path | 你自己選擇保存的路徑,約等於固定 |
type | 固定 |
到這里又稍微被 shareid
和 from
、 fsidlist
三個參數卡住了,在頁面中搜索這三個參數也沒有結果,在source中搜索了一下,倒是又一個shareid,但是貌似也關系不大,折騰了一會就想到既然參數名搜不到,那我搜一下參數值試試?,果然在資源頁面中搜到了三個參數的值(即 https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w
這頁面),如下圖:
正則表達式即可提取出三個值。
轉存
轉存時候注意cookie里要攜帶 BDUSS
和 STOKEN
,這兩個參數在資源頁面的cookies里,且都為固定的,沒有登錄的話只有 STOKEN
, BDUSS
的值要在登錄狀態下才能看到,下圖時登錄后的cookie:
代碼如下:
完結,撒花
到這里就結束了,本文講解了如何使用python轉存百度雲盤資源。
此文轉載文,著作權歸作者所有,如有侵權聯系小編刪除!
原文地址:http://www.cnblogs.com/luohua13950/p/13723860.html
如需要源代碼點擊這里下載