turnstile-spin:把「接入 Turnstile」做成端到端可驗收的 Agent 流程

前言

註冊、登錄、聯繫表單、評論提交——凡是用戶觸發的寫操作,都容易被腳本批量撞庫或刷垃圾數據。常見做法是前端掛 CAPTCHA、後端再驗 token;Turnstile 是 Cloudflare 提供的 bot 校驗方案,文檔裏強調可在不經過 Cloudflare CDN 的前提下嵌入站點,並按訪客風險自適應挑戰強度。

實際落地時,難點往往不在「看懂文檔」,而在:掃一遍現有倉庫該改哪幾處、在控制台創建 widget 並配對域名、按框架寫嵌入片段、在現有後端接上 siteverify,以及改完後是否真的驗通。Cloudflare 在 cloudflare/skills 倉庫裏提供了 turnstile-spin Skill,把上述步驟收成帶腳本的嚮導式編排,由 Agent 讀代碼、確認插入點、改前後端,並在上報成功前做一次真實校驗。

這是什麼

turnstile-spin 是 Cloudflare 官方維護的 Agent Skill(目錄:skills/turnstile-spin)。官方描述爲:在既有前端與後端中新建、修復或遷移 Cloudflare Turnstile bot 校驗,並包含服務端 Siteverify。

Skill 把「set up Turnstile」拆成可執行鏈路:檢查鑑權、掃描代碼庫、創建 widget(或使用已有 sitekey)、在選定位置嵌入前端片段、在客戶現有後端寫入規範的 siteverify 邏輯,並在結束前完成一次驗證通過。確定性邏輯(API 調用、重試與錯誤處理)放在 scripts/ 下的腳本里;Agent 負責編排、讀倉庫、與用戶確認,以及完成前後端編輯。行爲以 Skill 內的 SKILL.md 爲規範來源,產品要求對齊 Turnstile 文檔。

核心功能

觸發與範圍

當對話裏出現 Turnstile、CAPTCHA、bot protection、siteverify、cf-turnstile-response,或「保護表單/接口/按鈕、阻止 bot 註冊」等表述,且與 Cloudflare 或 bot 場景相關時,Agent 會加載本 Skill。未提及 Turnstile 的純 Workers、Pages、R2 等任務不應單獨因本 Skill 加載。

若用戶已說明 widget 已創建並提供了 sitekey,Skill 要求走「已有 widget」分支,不再走創建 widget 的嚮導。

多框架參考

嵌入前端時,Skill 要求按現有技術棧查閱對應 reference:

前端 參考路徑(倉庫內)
Vanilla HTML references/vanilla-html.md
Next.js App Router references/nextjs-app.md
Next.js Pages Router references/nextjs-pages.md
Astro references/astro.md
SvelteKit references/sveltekit.md
Hugo references/hugo.md

嚮導式對話流程(概要)

下面按官方 SKILL.md 中的 numbered wizard 歸納;帶 [wait for user] 的步驟需要用戶確認或回覆後再繼續。

  1. 簡短確認:一句話說明將端到端完成鑑權、掃描、創建 widget、嵌入、siteverify 與驗證,並等待用戶同意(此步不先展開完整計劃)。
  2. CLI 檢查:輔助腳本通過 curl 訪問 api.cloudflare.com。枚舉賬號時需要明確的 $CLOUDFLARE_ACCOUNT_ID,或用戶批准的、項目外的 canonical WRANGLER_BIN 及精確 WRANGLER_VERSION。禁止用 npx、pnpm exec、項目內二進制或未批准的可執行文件執行帶憑證的命令;流程中也不會自動安裝 Wrangler。
  3. 鑑權與範圍探測(首個不可逆步驟):運行 scripts/auth-probe.sh,按 JSON 的 status 分支處理(見下一節)。
  4. 賬號選擇:多賬號場景下由用戶選定 CLOUDFLARE_ACCOUNT_ID 後重新探測。
  5. 域名:默認包含 localhost 與 127.0.0.1;生產域名從 package.json 的 homepage、wrangler.toml、README.md、AGENTS.md、git remote 等掃描,與用戶確認後註冊。文檔提醒:同一 widget 註冊本地與生產域名時,各環境後端應校驗 siteverify 返回的精確前端 hostname;生產後端的預期 hostname 白名單不應包含 localhost / 127.0.0.1。
  6. 代碼庫掃描:識別前端框架、後端處理位置(Express 路由、Next API、Rails、Workers、Pages Function 等),以及是否已有 reCAPTCHA / hCaptcha(有則進入遷移模式)。
  7. 插入計劃:列出候選插入點(含 [recommended] / [skip by default]),用戶確認後爲每個面指定穩定 action(如 signup、login,1–32 字符,僅字母數字下劃線連字符),並確認 action 與 handler 的映射。
  8. 創建 widget:優先使用已批准且支持 turnstile widget 子命令的 Wrangler;否則使用 scripts/widget-create.sh。創建示例(managed 模式):
WRANGLER_WRITE_LOGS=false WRANGLER_LOG=log WRANGLER_LOG_SANITIZE=true \
  "$WRANGLER_BIN" turnstile widget create "<name>" \
  --domain <d1> --domain <d2> ... --mode managed --json

在 set +x 子 shell 中捕獲完整 stdout JSON,用 jq 解析 SITEKEY 與非空的 WIDGET_SECRET,隨後 unset 響應變量。

後續步驟(資料截斷處未展開的細節)在完整 Skill 中還包括:將 secret 寫入後端環境、按 reference 改前端、寫入 siteverify、以及成功前的實機驗證。

鑑權探測結果怎麼處理

運行 scripts/auth-probe.sh 後常見分支:

  • ok:繼續掃描與集成。
  • missing_token / missing_scope:引導用戶在 API Tokens 創建 Custom token,權限爲 Account.Turnstile:Edit,並在 Account Resources 中包含目標賬號。不要求用戶把 token 粘貼到聊天;可提供「終端 export 後重啓 Agent」或「寫入僅用戶可讀文件」等方式。除非所用 Wrangler 版本的 OAuth scope 已包含 Account.Turnstile:Edit,否則不要默認讓用戶 wrangler login。
  • network_failure / upstream_failure:按診斷處理網絡或短暫重試,勿誤判爲 token 權限問題。
  • multiple_accounts / account_mismatch:展示賬號列表或修正 CLOUDFLARE_ACCOUNT_ID。

從其他 CAPTCHA 遷移

掃描到 reCAPTCHA 或 hCaptcha 時,Step 7 改爲展示遷移計劃(細節見 Skill 內 “Migrating from another CAPTCHA” 小節),而不是僅做新建嵌入。

安裝與啓用

turnstile-spin 隨 cloudflare/skills 插件或技能包安裝;各 Agent 入口如下(摘自官方 README)。

Codex

codex plugin marketplace add cloudflare/skills
codex plugin add cloudflare@cloudflare

安裝後新開 Codex 會話。

Claude Code

/plugin marketplace add cloudflare/skills
/plugin install cloudflare@cloudflare

VS Code / GitHub Copilot

  1. 在設置中啓用 chat.plugins.enabled。
  2. 命令面板執行 Chat: Install Plugin From Source。
  3. 填入 https://github.com/cloudflare/skills。

Cursor

從 Cursor Marketplace 安裝,或在 Settings > Rules > Add Rule > Remote Rule (Github) 添加 cloudflare/skills。

npx skills

npx skills add https://github.com/cloudflare/skills

僅複製 Skill 目錄

也可克隆倉庫後將 turnstile-spin 等技能文件夾複製到 Agent 約定目錄,例如 Cursor 爲 ~/.cursor/skills/(完整表格見官方 README)。

Skills 按對話上下文自動加載;當請求匹配 Skill 的觸發條件時,Agent 載入 turnstile-spin 並按 SKILL.md 執行。

典型用法

典型用法不是手寫一長串配置,而是在支持 Agent Skills 的 IDE 或 CLI 裏用自然語言發起集成,由 Skill 驅動腳本與改碼。

示例 1:新站表單防刷

在已安裝 Cloudflare 插件的 Cursor 中,可表述:「在這個 Next.js 項目裏給註冊表單加 Turnstile,並在 API 路由裏做 siteverify。」Skill 會先確認端到端步驟,再跑 auth-probe.sh、掃描 App Router 結構、引用 references/nextjs-app.md,與用戶確認註冊域與插入點後創建或使用 widget,最後改前端與 API 並做驗證。

示例 2:已有 sitekey

若 widget 已在控制台創建,對話中直接提供 sitekey(及後續步驟所需的 secret 配置方式按 Skill 指引),Agent 應跳過 widget 創建嚮導,進入「已有 widget」流程,只做嵌入與 siteverify。

示例 3:從 reCAPTCHA 遷移

說明「登錄頁現在是 reCAPTCHA,想換成 Turnstile」,掃描後會進入遷移模式,在確認插入點與 handler 映射後再替換前端與校驗邏輯。

上述示例描述的是 Skill 文檔聲明的行爲路徑;具體命令輸出與文件改動以你倉庫掃描結果和用戶確認爲準。

適用場景與注意

適合誰

  • 需要在現有前後端(非從零腳手架)裏接入或修復 Turnstile 的團隊。
  • 使用 Next.js(App/Pages)、Astro、SvelteKit、Hugo 或純 HTML 的項目。
  • 希望 bot 防護落在註冊、登錄、聯繫表單、評論、下載按鈕等用戶觸發請求上的場景。

限制與注意

  • 必須有 Cloudflare API Token,且包含 Account.Turnstile:Edit;多賬號需明確 CLOUDFLARE_ACCOUNT_ID。
  • Wrangler 僅在使用已批准的二進制且版本滿足 turnstile widget 子命令時用於創建 widget;流程不會自動安裝 Wrangler,也不會用 npx 等方式執行帶憑證命令。
  • Token 不應出現在聊天或 shell history;Skill 文檔給出了更安全的錄入方式。
  • 本地與生產域名同 widget 時,務必在後端按 hostname 嚴格校驗 siteverify 結果,避免本地配置誤用於生產白名單。
  • 本 Skill 專注 Turnstile 集成,不替代 Turnstile 以外的 Cloudflare 產品配置。

Turnstile 本身在官方概述中說明:挑戰在客戶端完成,用於區分人與自動化流量;Managed 模式爲推薦 widget 類型,並支持 Non-interactive、Invisible 等類型(創建嚮導示例使用 managed)。

結尾

turnstile-spin 把 Turnstile 從「文檔 + 控制台 + 多處改代碼」收斂成可確認的端到端流程:腳本負責 API 與探測,Agent 負責讀庫、選插入點、改前後端並在成功前做實機校驗。若你正在 Cursor、Codex、Claude Code 或 VS Code Copilot 上開發需要 bot 防護的 Web 應用,安裝 cloudflare/skills 後,用對話觸發即可加載本 Skill。

Skill 目錄與完整嚮導:https://github.com/cloudflare/skills/tree/main/skills/turnstile-spin

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜