開始
在上一文中,我們保存了百度云盤的地址和提取碼,但是這種分享鏈接很容易被屏蔽,最好的做法就是保存資源到自己的網盤,不過采集的鏈接有上萬個,人肉保存并不現實,所以本文嘗試了批量保存資源,如您還沒看過上文,這里可以跳轉。
觀察請求
以下面資源鏈接為例:
?

在瀏覽器中輸入以上鏈接,會自動跳轉到https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQ,
?

輸入正確提取碼后發(fā)現直接跳轉到資源保存頁面了,F12 NETWORK里也看不到此請求的返回值,這時候只能使用Fiddler才能抓到包了。
Fiddler抓包
打開Fiddler,為了不讓其它各類請求影響到我們,首先進行簡單設置,以此來顯示我們想要的請求,點擊Filters 進行如下設置,最后點擊Actions里的Run Filterset now,就只會顯示pan.baidu.com域名的請求:
?

測試post數據
為了得到點擊提取文件按鈕時發(fā)送的請求和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動態(tài)生成的,抱著這個心態(tài)來到sources標簽下,搜索logid關鍵字,果不其然,有個JS文件里有這個參數,直接定位到相應的行數:
?

直接在68行打一個斷點,查看運行狀態(tài):
?

細心的同學一個很快就能發(fā)現上圖紅框里的值就是第一次請求https://pan.baidu.com/share/init?surl=tHSxZQueF-Wsa2T0NlT3vQcookies里的BAIDUID的值,logid就是通過上面一些js代碼中的一些算法得到的,cookies如下:
BIDUPSID=EC39F255CF7B146E8ADD4FA37DB16739;BAIDUID=BBBC2B2C1269AF3AA7D113D07FAC5E80:FG=1;? PSTM=1587390447; PANWEB=1; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; BDCLND=C4jsJ4aHacfrqq02TYbUOKGFFDefnJAMNmU%2BI3v5FNM%3D;
水平有限,沒辦法將這段js改寫為python,不過好在python提供了一個執(zhí)行js代碼的庫pyexecjs,該庫運行于Nodejs環(huán)境,首先要保證你的機器安裝了Nodejs:
pip install pyexecjs
下圖即代表安裝正確了,execjs可以正常使用
?

將js代碼稍微修改一下,保存為yunpan.js:
?
使用execjs執(zhí)行一下
?

?

得到所有的變化參數后就可以提交數據了:
?
通過Fiddler抓包發(fā)現返回的res為下,errno為0即代表提交成功:
{"errno":0,"err_msg":"","request_id":8738382064533520558,"randsk":"g2VwUSYs1KSuOMh9%2FQDVUUwc7ICFq4CZNmU%2BI3v5FNM%3D"}
留意上面的randsk。
如果你是用瀏覽器抓包就會發(fā)現輸對提取碼點擊按鈕后請求會全部刷新一次,就不能確認到底是哪個請求跳轉到資源頁面的,只能使用Fiddler才能抓到POST成功后的請求,經過測試,發(fā)現POST數據后又再次請求了https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w這個鏈接,沒錯,就是上面一開始請求的鏈接,區(qū)別就是這次請求cookie中攜帶了剛才返回的randsk的值。所以再次請求時添加上randsk:
?
保存資源
抓包分析
抓包保存資源鏈接發(fā)現為:
#保存鏈接
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,經過測試除了這兩個參數和上文中l(wèi)ogid,其它參數均為固定。
Form Data參數是否變化
fsidlist變化
path你自己選擇保存的路徑,約等于固定
type固定
到這里又稍微被shareid和from、fsidlist三個參數卡住了,在頁面中搜索這三個參數也沒有結果,在source中搜索了一下,倒是又一個shareid,但是貌似也關系不大,折騰了一會就想到既然參數名搜不到,那我搜一下參數值試試?,果然在資源頁面中搜到了三個參數的值(即https://pan.baidu.com/s/1wy0LC4O6iY7l9M6RD25k6w這頁面),如下圖:
?

正則表達式即可提取出三個值。
?
轉存
轉存時候注意cookie里要攜帶BDUSS和STOKEN,這兩個參數在資源頁面的cookies里,且都為固定的,沒有登錄的話只有STOKEN,BDUSS的值要在登錄狀態(tài)下才能看到,下圖時登錄后的cookie:
?

代碼如下:
?
完結,撒花
到這里就結束了,本文講解了如何使用python轉存百度云盤資源。
此文轉載文,著作權歸作者所有,如有侵權聯(lián)系小編刪除!
原文地址:http://www.cnblogs.com/luohua13950/p/13723860.html
如需要源代碼點擊這里下載