引言
在數據爬取和自動化測試過程中,人機驗證(如滑塊、點選、短信驗證等)是常見的反爬手段。貝殼網(ke.com)作為國內領先的房產平臺,其人機驗證機制較為復雜,涉及前端JS加密、動態Token、行為檢測等技術。本文將通過逆向分析貝殼網的人機驗證JS加密邏輯,并給出Python實現方案,幫助開發者繞過驗證機制,實現高效數據采集。
1. 貝殼網人機驗證機制概述
貝殼網的人機驗證通常包括以下幾種形式:
- 滑塊驗證:用戶需拖動滑塊完成拼圖。
- 點選驗證:要求用戶點擊符合要求的圖片區域。
- 動態Token驗證:前端生成加密參數,提交至后端校驗。
本文重點分析動態Token加密邏輯,即前端如何生成加密參數(如 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">token</font>**
、**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">signature</font>**
等),并模擬該過程實現自動化繞過。
2. 逆向分析流程
2.1 目標定位
- 抓包分析
使用瀏覽器開發者工具(F12)或抓包工具(Charles/Fiddler)觀察驗證請求,找到關鍵API(如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">/api/captcha/verify</font>**
)。
關鍵參數識別
通常包含以下字段:
{"token": "xxxxxx","signature": "yyyyyy","timestamp": 1234567890,"behavior_data": "{...}"
}
這些參數由前端JS生成,需逆向其加密邏輯。
2.2 JS代碼逆向
(1)查找加密入口
- 在瀏覽器中搜索關鍵詞(如
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">token</font>**
、**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">signature</font>**
、**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">encrypt</font>**
)。 - 通過調用堆棧(Call Stack)定位生成參數的函數。
(2)調試關鍵函數
假設發現以下關鍵函數:
function generateToken() {var e = Date.now();var t = encryptAES(e + "|" + Math.random());return t;
}
說明 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">token</font>**
由 **<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">AES加密(時間戳|隨機數)</font>**
生成。
(3)提取加密算法
- 使用 Chrome DevTools 的 Sources 面板,格式化混淆的JS代碼。
- 找到
**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">encryptAES</font>**
函數,提取密鑰和加密模式(如**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">CBC</font>**
、**<font style="color:rgb(64, 64, 64);background-color:rgb(236, 236, 236);">PKCS7Padding</font>**
)。
2.3 Python模擬加密
逆向完成后,用Python實現相同的加密邏輯。以下是一個示例:
(1)安裝依賴
(2)Python實現AES加密
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
import base64
import time
import randomdef encrypt_aes(data, key, iv):cipher = AES.new(key.encode(), AES.MODE_CBC, iv.encode())padded_data = pad(data.encode(), AES.block_size)encrypted = cipher.encrypt(padded_data)return base64.b64encode(encrypted).decode()# 貝殼網AES加密參數(需根據實際逆向結果調整)
KEY = "xxxxxx" # 替換為實際密鑰
IV = "yyyyyy" # 替換為實際IVdef generate_token():timestamp = int(time.time() * 1000)rand_num = random.random()raw_data = f"{timestamp}|{rand_num}"token = encrypt_aes(raw_data, KEY, IV)return token
3. 完整爬蟲實現
3.1 獲取驗證參數
import requestsdef get_captcha_params():url = "https://ke.com/api/captcha/get"headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36"}response = requests.get(url, headers=headers)return response.json()def submit_captcha(token, signature):url = "https://ke.com/api/captcha/verify"data = {"token": token,"signature": signature,"timestamp": int(time.time() * 1000)}response = requests.post(url, json=data, headers=headers)return response.json()
3.2 模擬驗證流程
# 1. 獲取驗證參數
captcha_data = get_captcha_params()# 2. 生成加密Token
token = generate_token()# 3. 計算簽名(假設signature由HMAC-SHA256生成)
import hmac
import hashlibdef generate_signature(token, secret_key):return hmac.new(secret_key.encode(), token.encode(), hashlib.sha256).hexdigest()SECRET_KEY = "zzzzzz" # 替換為實際密鑰
signature = generate_signature(token, SECRET_KEY)# 4. 提交驗證
result = submit_captcha(token, signature)
print("驗證結果:", result)
4. 反反爬策略
- IP代理池:避免IP被封。
- 請求頭偽裝:模擬瀏覽器行為。
- 瀏覽器自動化(Playwright/Selenium):用于復雜交互驗證。
5. 結論
本文通過逆向分析貝殼網人機驗證的JS加密邏輯,提取了AES加密和HMAC簽名算法,并用Python模擬生成合法參數。該方法適用于需要繞過動態Token驗證的爬蟲場景,但需注意:
- 貝殼網可能更新加密邏輯,需定期維護。
- 高頻請求可能觸發風控,建議控制采集頻率。