Python 爬蟲進(jìn)階必備 | 某壁紙網(wǎng)站請求頭參數(shù)與用戶指紋 sign 加密邏輯分析
今日網(wǎng)站
aHR0cHM6Ly9iei56enptaC5jbi8=
這個網(wǎng)站來自東哥讀者群的讀者提問(截圖為轉(zhuǎn)發(fā)消息)

抓包分析
打開目標(biāo)網(wǎng)站,需要采集的是網(wǎng)站中的圖片
開發(fā)者工具中抓到的包是這樣的

頁面上加載的圖片名字是沒有規(guī)律的,且網(wǎng)頁上不點擊圖片是沒有辦法顯示高清圖片的,所以需要找到這些圖片名稱是哪里返回的。
通過查找,可以看到圖片名稱是經(jīng)過getJson這個包返回的,并且返回的包中還標(biāo)識了分辨率

所以只要構(gòu)建這個請求,拿到返回值再拼接出壁紙的鏈接就可以下載高清的壁紙了。
參數(shù)沒有什么要看的,見名知意
{"target":"index","pageNum":1}
主要是請求的 header 中有兩個未知參數(shù)sign和access

加密定位與分析
這類比較純粹的 XHR 請求,直接使用xhr斷點分析比較輕松
在source面板添加xhr請求斷點

完成之后重新刷新頁面,就斷上了

斷點斷住的位置是ajax請求發(fā)出的位置,在這個位置可以看到我們需要分析的access參數(shù)已經(jīng)找到了
var access = sha256(contentType + location + sign + timestamp);
這個表達(dá)式對應(yīng)的參數(shù)在上面的截圖里都有(除了 sign),直接拼接在一起使用 sha256 加密即可。
這里的 sign 需要在堆棧中向上翻,可以看到一個 sign請求

斷點的位置如下

可以看到 sign 是sessionStorage中取出的,可以在當(dāng)前的文件中檢索sessionStorage,可以看到下面setItem的邏輯

sign 的實際生成邏輯其實就是我們當(dāng)前瀏覽器指紋
sign = Fingerprint2.x64hash128(components.map(function(component) {return component.value}).join(''), 31);
// 將當(dāng)前瀏覽器的屬性值拼接在一起,使用 x64hash128 生成指紋
這個指紋算法是有漏洞的,因為算法取的是當(dāng)前的設(shè)備信息,而x64hash128算法是固定的,這就導(dǎo)致了傳入x64hash128中的 key 相同的話,生成的指紋也是相同的,一個常見的規(guī)避手段是在設(shè)備信息中添加獲取當(dāng)前設(shè)備的ip這樣可以減少一部分的指紋重復(fù),不過這個網(wǎng)站的sign沒有添加這個屬性
如果這里你想調(diào)試sign的生成需要清除當(dāng)前瀏覽器的緩存,斷點才會進(jìn)入生成的邏輯

userAgent: navigator.userAgent
language : 語言
colorDepth: 返回目標(biāo)設(shè)備或緩沖器上的調(diào)色板的比特深度 screen.colorDepth
deviceMemory: 以千兆字節(jié)為單位返回設(shè)備內(nèi)存量。該值是通過舍入到最接近的2的冪并將該數(shù)除以1024而給出的近似值。
pixelRatio: 像素比 devicePixelRatio
hardwareConcurrency:navigator.hardwareConcurrency返回可用于運(yùn)行在用戶的計算機(jī)上的線程的邏輯處理器的數(shù)量
screenResolution: 檢測屏幕寬高,并根據(jù)屏幕方向矯正返回值[width,height]
availableScreenResolution:返回屏幕分辨率[width,height],無頭瀏覽器無法獲取。
timezoneOffset: 返回從當(dāng)前區(qū)域設(shè)置(主機(jī)系統(tǒng)設(shè)置)到UTC的時區(qū)差異(以分鐘為單位)鏈接
timezone:時區(qū)
sessionStorage: 是否支持sessionStorage,不支持時返回錯誤
localStorage: 是否支持localStorage
indexedDb:是否支持indexedDb
addBehavior:此時可能未定義body或以編程方式刪除
openDatabase: 返回是否支持Web SQL
cpuClass:返回瀏覽器系統(tǒng)的 CPU 等級,一般無法獲取 *
platform: 返回表示瀏覽器平臺的字符串,該規(guī)范允許瀏覽器始終返回空字符串,因此不要依賴此屬性來獲得可靠的答案.鏈接 *
doNotTrack: 返回用戶的“不跟蹤”設(shè)置。如果用戶請求不被網(wǎng)站,內(nèi)容或廣告跟蹤,則為“1”。一般結(jié)果為* 。
plugins:返回瀏覽器安裝的插件列表。
canvas: 如果瀏覽器支持canvas則返回生成baes64數(shù)據(jù)。
webgl:返回瀏覽器對webgl繪圖協(xié)議的支持情況匯總
webglVendorAndRenderer: 返會顯卡型號相關(guān)信息
adBlock:返回是否安裝去廣告插件。
hasLiedLanguages: 返回用戶是否改變了首選語言
hasLiedResolution:返回用戶是否改變了分辨率
hasLiedOs:返回用戶是否改變了操作系統(tǒng)
hasLiedBrowser:返回用戶是否改變了瀏覽器
touchSupport: 返回最大觸摸點數(shù),是否支持touch,是否支持ontouchstart事件]
fonts:返回從64種字體種篩選出的可用字體
fontsFlash:Flash字體枚舉,如果沒有swfobject,不會觸發(fā)。
audio: 返回音頻指紋
enumerateDevices:navigator.mediaDevices 請求可用媒體輸入和輸出設(shè)備的列表,例如麥克風(fēng),相機(jī),耳機(jī)等
// 參考鏈接:https://juejin.cn/post/6844903773211459597
所以這里的sign是可以設(shè)置成固定值,因為指紋是可以重復(fù)的
到這里上面access生成邏輯的所有變量均已獲得,通過python復(fù)寫加密即可獲取網(wǎng)站的圖片名稱并拼接鏈接下載高清圖片。
有知有行
[ 完 ]
對了,看完記得一鍵四連,這個對我真的很重要。

對了,看完記得一鍵四連,這個對我真的很重要。