Cloudflare Turnstile 看起來像一個核取方塊,但它並不是舊意義上的 CAPTCHA — 通常並沒有什麼東西要你去解。它在你的瀏覽器裡執行幾百毫秒的 JavaScript,評估那個瀏覽器看起來有多真實,並核發一個 token。如果你的爬蟲無法令人信服地執行那段 JS,你就永遠拿不到一個有效的 token,而每一個需要 token 的請求都會以一道挑戰回來。
這就是為什麼常見的那些爬取修法對 Turnstile 毫無作用。輪換代理、設定標頭,甚至送出一個完美的瀏覽器 TLS 指紋 — 如果那段 JavaScript 挑戰從未執行,這些全都無關緊要。本指南說明 Turnstile 實際上衡量什麼,以及在 2026 年穿過它的務實方法。
Turnstile 是一種「瀏覽器的證明」,而非「人類的證明」。當小工具載入時,它會悄悄執行一系列檢查,並把它們餵進一個分數:
requests、httpx、curl)根本產生不出 token。navigator.webdriver、CDP 痕跡、缺失或偽造的外掛,以及那些即使你修補了明顯旗標後仍會留存的 CDP/headless 訊號。你拿到的 token 會綁定到你的 IP 與一個短暫的時間窗。所以即使是一個從別處「借來」的有效 token,當你接著從另一個 exit 使用它時也會失敗。
代理只移動那些訊號中的一個:IP 信譽。那很重要 — 一個乾淨的住宅 ASN 能把一個臨界分數抬過那條線 — 但它無法製造出一個 token。如果你是用一個 HTTP 用戶端去命中 Turnstile,沒有任何代理能修好它,因為根本沒有瀏覽器去執行那道挑戰。代理是必要的,但並不充分。
最可靠的途徑,是真的在一個真實、偽裝良好的瀏覽器裡執行那道挑戰 — 帶有反偵測修補的 Playwright 或 Puppeteer,或一個以隱身為導向的瀏覽器。token 會在你的 IP 上、在一個真實的環境裡自然地產生:
from playwright.sync_api import sync_playwright
proxy = {"server": "socks5h://us.jibaoproxy.com:913",
"username": "USERNAME", "password": "PASSWORD"}
with sync_playwright() as p:
browser = p.chromium.launch(headless=False, proxy=proxy)
page = browser.new_page()
page.goto("https://target.site")
page.wait_for_timeout(4000) # let Turnstile run and settle
# the cf token is now in the form; submit / read it as the site expects
token = page.eval_on_selector(
"input[name='cf-turnstile-response']", "el => el.value")
print("token:", token[:20], "...")
browser.close()
用有頭模式執行(或一個真實的 headless 版本),讓瀏覽器環境保持一致,並把它透過一個住宅 exit 路由,好讓 IP 分數與瀏覽器分數一致。兩者必須相符 — 一個完美的瀏覽器在一個機房 IP 上,分數依然很差。
2Captcha、CapSolver 之類的服務會替你執行那道挑戰,並透過 API 回傳一個 token。它們在規模化時很有用,但有兩個常讓人翻車的陷阱:
Turnstile 通常以一種非互動式的「託管」模式執行:如果你的分數夠高,它會核發一個 token,不需要核取方塊、也沒有摩擦。最便宜的「繞過」往往就是單純地讓自己看起來夠真實,以致你永遠不會被挑戰 — 一個乾淨的瀏覽器指紋,加上一個 ASN 信譽良好的住宅 IP。讓分數越過門檻,Turnstile 就會悄悄地放你過去。
navigator.webdriver 與 CDP 破綻,否則分數會一直偏低。新用戶註冊即送 500M免費流量,首次儲值另有贈金。優惠限時供應。