程式碼改動長這樣
<div class="cf-turnstile" data-sitekey="YOUR_SITE_KEY"></div>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script><button id="login-btn">Sign in</button>
<script src="https://cdn.captcha-cdn.net/captchala-loader.js"></script>
<script>
loadCaptchala(() => Captchala.init({ appKey: 'YOUR_APP_KEY', action: 'login' })
.onSuccess(res => onToken(res.token))
.bindTo('#login-btn'));
</script>const res = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
secret: process.env.TURNSTILE_SECRET,
response: req.body['cf-turnstile-response'],
}),
})
const data = await res.json()
if (!data.success) return res.status(400).json({ error: 'bot' })const res = await fetch('https://apiv1.captcha.la/v1/validate', {
method: 'POST',
headers: {
'X-App-Key': process.env.CAPTCHALA_APP_KEY,
'X-App-Secret': process.env.CAPTCHALA_APP_SECRET,
'Content-Type': 'application/json',
},
body: JSON.stringify({ pass_token: req.body['captchala-token'] }),
})
const { data } = await res.json()
if (!data || !data.valid) return res.status(400).json({ error: 'bot' })遷移步驟
- 1
註冊並取得你的 App Key + Secret
建立免費 CaptchaLa 帳號、新增一個站點,複製 App Key(公開)與 App Secret(伺服器端)。無需 Cloudflare 帳號。
- 2
替換元件標籤
把 cf-turnstile 換成 captchala,data-sitekey 換成 data-app-key,並把 script src 改成我們的 CDN。元件形態(一個 div 佔位 + 一個 script 標籤)維持不變。
- 3
更新隱藏欄位名稱
Turnstile 會注入 cf-turnstile-response,CaptchaLa 注入 captchala-token。多數表單處理程式不會依名稱讀取該欄位,但如果你的會,改一處常數即可。
- 4
更新伺服器驗證呼叫
將端點改為 apiv1.captcha.la/v1/validate。我們接受 JSON(Turnstile 用 form-urlencoded),因此要更新 Content-Type 與 body 結構。回應仍回傳 valid 旗標(data.valid)供你的分支邏輯使用。
- 5
逐步上線
多數表單先維持 Turnstile,先在一個低流量表單上換成 CaptchaLa。觀察一天的轉化與驗證率,滿意後再擴大——沒有最低消費、沒有合約。
常見問題
我可以保留 Cloudflare CDN 同時使用 CaptchaLa 嗎?
可以。CaptchaLa 獨立於任何 CDN——我們多數客戶保留 Cloudflare 做 CDN,並用 CaptchaLa 做驗證。兩層互不衝突。
我的 Cloudflare 機器人偵測規則還會生效嗎?
會——那些是 Cloudflare WAF/Bot Management 功能,與 Turnstile 分開。移除 Turnstile 元件不會影響你的 Cloudflare zone 設定。
如果我是透過 Cloudflare Workers 使用 Turnstile 呢?
在 Worker 端的遷移方式相同。把 Turnstile 的 fetch 換成 CaptchaLa 的 fetch。文件裡有一段與 Workers runtime 相容的程式片段。