問題背景
在自動化研究場景中,常常需要透過 AI 搜尋引擎(如 Perplexity)抓取整理過的答案,並進一步餵給其他系統處理。然而 Perplexity 的分享連結受到 Cloudflare JS Challenge 保護,大多數程式化的存取方式都會被阻擋。
本文記錄完整的原因分析、所有嘗試過的失敗方法,以及最終如何透過 CloakBrowser 成功突破。
為什麼無法直接取得 Perplexity 內容?
根本原因:瀏覽器指紋偵測
Perplexity 使用的保護機制不是傳統的「封 IP」或「輸入驗證碼」,而是瀏覽器指紋偵測(Browser Fingerprinting)。
當請求抵達 Cloudflare 時,會檢測以下項目:
- navigator.webdriver 是否為 true(自動化框架標記)
- navigator.plugins.length 是否符合真實瀏覽器
- window.chrome 物件是否存在
- WebGL / Canvas / Audio 指紋是否正常
- WebRTC 是否洩漏真實 IP
- TLS 指紋(JA3/JA4)是否為常見瀏覽器
只要有任何一項不符,Cloudflare 就判定為機器人,發回 JS Challenge 頁面。
常見工具為何全部失效?
| 嘗試方法 | 失敗原因 |
|---|---|
| curl + 多種 User-Agent | 無法執行 JavaScript,只能拿到 Challenge 頁 HTML |
| web_fetch / cloudscraper | 403,cloudscraper 對新版 Cloudflare 失效 |
| Playwright(標準版) | navigator.webdriver=true,立即被偵測 |
| Playwright + stealth 參數 | 仍有殘留信號,觸發指紋檢查 |
| undetected-chromedriver | 連線錯誤,新版 Chrome 不相容 |
| curl-impersonate | TLS 指紋可能僥倖通過,但 JS Challenge 仍需瀏覽器執行 |
| Xvfb + patchright | 底層同樣缺乏完整指紋修補 |
這些方法的共同盲點是:都在試圖「欺騙」Cloudflare 的 JS 檢測層,而非真正讓檢測看到的都是正常值。
解決方案:CloakBrowser
工具介紹
CloakBrowser(GitHub: CloakHQ/CloakBrowser)是 目前唯一在 C++ 層級修改 Chromium 原始碼的指紋修補方案。不是設定調整,不是 JS 注入,而是49 個指紋 patch 直接編進二進位,包括:
- navigator.webdriver → false
- navigator.plugins.length → 真實 plugin 清單
- window.chrome → 正常瀏覽器物件
- WebGL / Canvas / Audio 指紋
- Font / Screen / Hardware 指紋
- WebRTC IP leak 防護
- TLS 指紋(JA3/JA4/Akamai)
- Automation signals(CDP detection)
安裝方式
pip install cloakbrowser
Python 使用範例
from cloakbrowser import launch
import time
browser = launch(headless=False)
page = browser.new_page()
page.goto(
"https://www.perplexity.ai/search/你的分享連結",
wait_until="domcontentloaded"
)
# 等待 Cloudflare 挑戰自動通過
page.wait_for_function(
"() => !document.title.includes('Just a moment')",
timeout=40000
)
time.sleep(3) # 額外等待確保渲染完成
html = page.content()
browser.close()
print(f"成功取得內容,HTML 長度: {len(html)} bytes")
關鍵實務細節
- 使用 headful 模式(headless=False):相較 headless,headful 的指紋更難被偵測,搭配 Xvfb 虛擬顯示器即可在無頭伺服器上運行
- 等待 Challenge 完成:wait_for_function 監控標題是否離開「請稍候」頁,而非盲目 sleep
- 額外等待 3 秒:確保 Perplexity 的 SPA 完全渲染動態內容
失敗方法完整列表
| 方法 | 結果 | 瓶頸 |
|---|---|---|
| curl + UA 輪換 | ❌ | 無法執行 JS |
| cloudscraper | ❌ | Cloudflare 版本過新 |
| Playwright 標準版 | ❌ | webdriver flag |
| Playwright + stealth | ❌ | 仍有殘留信號 |
| undetected-chromedriver | ❌ | Chrome 版本不相容 |
| curl-impersonate | ❌ | JS Challenge 仍需瀏覽器 |
| Xvfb + patchright | ❌ | 指紋修補不完整 |
| CloakBrowser | ✅ 成功 | C++ 層級完整修補 |
結論
突破 Cloudflare JS Challenge 的核心瓶頸不在於「如何繞過檢測」,而在於讓檢測看到的全部都是正常瀏覽器值。CloakBrowser 的價值在於它從 Chromium 原始碼層面解決了這個問題,而不是停留在 JS 層或參數層的半成品繞過。
對於需要自動化存取受保護網頁的系統,CloakBrowser 是目前已知最穩定、成功率最高的方案。
(本文同步發布於研究記錄 2026-04-12)
沒有留言:
張貼留言