在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。
如果您发现自己的网站使用的是 Cloudflare Turnstile,下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 Cloudflare Turnstile 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。
测试包含 Cloudflare Turnstile 的表单时,常常需要确认 captcha 是否集成正确并工作正常。
你可以手动验证站点上的 captcha。
若想自动解题,可以使用 CapMonster Cloud 等服务,它会接收验证码参数、在服务器中解析并返回可直接使用的 token。把 token 注入表单即可无需人工操作通过验证。
通过 CapMonster Cloud API 工作的一般流程:
识别 Cloudflare Turnstile 的请求必须指定以下参数:
type - TurnstileTask;
websiteURL - 解决验证码的页面地址;
websiteKey - Turnstile 密钥 (Sitekey).
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";
async function main() {
// 1. 通过 CapMonster Cloud 识别 Turnstile
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
);
const turnstileRequest = new TurnstileRequest({
websiteURL: 'http://tsmanaged.zlsupport.com',
websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
});
const result = await cmcClient.Solve(turnstileRequest);
const token = result.solution.token;
console.log('已接收 Turnstile Token:', token);
// 2. 启动 Playwright
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('http://tsmanaged.zlsupport.com');
// 3. 填写登录名和密码
await page.fill('#username', 'your_username');
await page.fill('#password', 'your_password');
// 4. 等待隐藏的 Token 字段出现
await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });
// 5. 插入 Token 并使字段可见
await page.evaluate((t) => {
const tokenInput = document.querySelector('#token');
if (tokenInput) {
tokenInput.type = 'text'; // 使字段可见
tokenInput.value = t; // 插入 Token
console.log('Token 已插入 Token 字段');
} else {
console.error('未找到字段 #token');
}
}, token);
// 6. 验证 Token 是否实际已插入
const checkValue = await page.$eval('#token', el => el.value);
console.log('检查 Token 值:', checkValue);
// 7. 提交表单
await page.click('button[type="submit"]');
console.log('已提交带有 Turnstile Token 的表单');
// await browser.close();
}
main().catch(err => console.error(err));1. 转到 Cloudflare Turnstile 页面,点击 Get Started。
2. 注册服务。
3. 在 Turnstile Widgets 中,点击蓝色的 Add Widget 按钮。

4. 配置 Cloudflare Turnstile,指定:
5. 创建小部件后,您将收到两个密钥—Site Key 和 Secret Key。

6. 连接客户端部分
1) 连接 Turnstile 脚本:
自动渲染(页面加载时自动创建小部件):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>编程控制(通过 JavaScript 自行创建小部件):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>重要:脚本必须从确切的 URL 加载。代理或缓存可能会导致失败。
2) 为小部件创建容器
自动:
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>编程方式:
<div id="turnstile-container"></div>3) 小部件配置
通过数据属性:
<div class="cf-turnstile"
data-sitekey="<YOUR_SITEKEY>"
data-theme="light"
data-size="normal"
data-callback="onSuccess">
</div>通过 JavaScript:
const widgetId = turnstile.render("#turnstile-container", {
sitekey: "<YOUR_SITEKEY>",
theme: "light",
size: "normal",
callback: token => console.log("Token:", token)
});4) 使用 Token
const token = turnstile.getResponse(widgetId); // 获取 Token
const isExpired = turnstile.isExpired(widgetId); // 检查过期
turnstile.reset(widgetId); // 重置
turnstile.remove(widgetId); // 移除
turnstile.execute("#turnstile-container"); // 手动执行
5) 与表单集成
<form id="my-form" method="POST">
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
<button type="submit">提交</button>
</form>
<script>
function onSuccess(token) {
document.getElementById("cf-turnstile-response").value = token;
}
</script>
<title>Turnstile Example</title>
<!-- 连接 Turnstile 脚本 -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<h1>带有 Turnstile 的表单示例</h1>
<form id="my-form">
<label for="username">姓名:</label>
<input type="text" name="username" id="username" required>
<!-- Turnstile 容器 -->
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>" data-callback="onTurnstileSuccess"></div>
<button type="submit">提交</button>
</form>
<script>
// 通过验证码后调用的回调
function onTurnstileSuccess(token) {
console.log("已接收 Turnstile Token:", token);
// 将 Token 保存到隐藏表单字段(可选)
document.getElementById("cf-turnstile-token")?.remove();
const input = document.createElement("input");
input.type = "hidden";
input.name = "cf-turnstile-response";
input.id = "cf-turnstile-token";
input.value = token;
document.getElementById("my-form").appendChild(input);
}
// 表单提交
document.getElementById("my-form").addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const response = await fetch("/submit-form", {
method: "POST",
body: formData
});
const result = await response.json();
if(result.success){
alert("表单已成功提交且 Token 已验证!");
} else {
alert("Turnstile Token 验证错误。请重试。");
// 重置小部件,以便用户可以再次完成验证码
turnstile.reset();
}
});
</script>
</body>
</html>
6) 配置服务器端部分
服务器端验证流程:
Siteverify API:
https://challenges.cloudflare.com/turnstile/v0/siteverify请求参数:
Token 属性:
<?php
function validateTurnstile($token, $secret, $remoteip = null) {
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$data = ['secret' => $secret, 'response' => $token];
if ($remoteip) $data['remoteip'] = $remoteip;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$response = file_get_contents($url, false, stream_context_create($options));
if ($response === FALSE) {
return ['success' => false, 'error-codes' => ['internal-error']];
}
return json_decode($response, true);
}
// 用法
$secret_key = 'YOUR_SECRET_KEY';
$token = $_POST['cf-turnstile-response'] ?? '';
$remoteip = $_SERVER['REMOTE_ADDR'];
$result = validateTurnstile($token, $secret_key, $remoteip);
if($result['success']){
echo "表单提交成功!";
} else {
echo "验证错误: " . implode(', ', $result['error-codes']);
}
?>
如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。
对于Cloudflare Turnstile,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 Cloudflare Turnstile,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。