2026/4/12

如何突破 Cloudflare 取得 Perplexity 內容

問題背景

在自動化研究場景中,常常需要透過 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 / cloudscraper403,cloudscraper 對新版 Cloudflare 失效
Playwright(標準版)navigator.webdriver=true,立即被偵測
Playwright + stealth 參數仍有殘留信號,觸發指紋檢查
undetected-chromedriver連線錯誤,新版 Chrome 不相容
curl-impersonateTLS 指紋可能僥倖通過,但 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")

關鍵實務細節

  1. 使用 headful 模式(headless=False):相較 headless,headful 的指紋更難被偵測,搭配 Xvfb 虛擬顯示器即可在無頭伺服器上運行
  2. 等待 Challenge 完成:wait_for_function 監控標題是否離開「請稍候」頁,而非盲目 sleep
  3. 額外等待 3 秒:確保 Perplexity 的 SPA 完全渲染動態內容

失敗方法完整列表

方法結果瓶頸
curl + UA 輪換無法執行 JS
cloudscraperCloudflare 版本過新
Playwright 標準版webdriver flag
Playwright + stealth仍有殘留信號
undetected-chromedriverChrome 版本不相容
curl-impersonateJS Challenge 仍需瀏覽器
Xvfb + patchright指紋修補不完整
CloakBrowser✅ 成功C++ 層級完整修補

結論

突破 Cloudflare JS Challenge 的核心瓶頸不在於「如何繞過檢測」,而在於讓檢測看到的全部都是正常瀏覽器值。CloakBrowser 的價值在於它從 Chromium 原始碼層面解決了這個問題,而不是停留在 JS 層或參數層的半成品繞過。

對於需要自動化存取受保護網頁的系統,CloakBrowser 是目前已知最穩定、成功率最高的方案。

(本文同步發布於研究記錄 2026-04-12)

沒有留言:

張貼留言