在本文中,我们尽量回答了所有关键问题。要开始解决问题,第一步是确定当前使用的是哪种防护系统。为此,您可以查看常见验证码与反机器人防护系统列表,其中提供了可视化示例和关键特征,帮助您快速判断自己正在使用哪一种方案。
如果您发现自己的网站使用的是 FunCaptcha (Arkose Labs CAPTCHA),下一步就是更深入地了解它的特性和具体工作方式。在本文中,您还可以查看 FunCaptcha (Arkose Labs CAPTCHA) 的接入说明,以便彻底弄清它在您的网站上是如何运行的。这样一来,您不仅能更好地理解当前的防护机制,还可以更合理地规划后续的维护和支持。
通过 CapMonster Cloud API 工作的一般流程:
type - FunCaptchaTask
websiteURL - 验证码所在页面的地址;
websitePublicKey - FunCaptcha 密钥(public key 或 pk);
data - 附加参数。如果网站使用 data[blob],则必填;
funcaptchaApiJSSubdomain - Arkose Labs 子域名(surl 值)。如果不同于默认,请指定:client-api.arkoselabs.com
userAgent - 浏览器 User-Agent。请仅 发送当前 Windows UA。
此任务还需要使用您的代理:
proxyType :
proxyAddress - IPv4/IPv6 代理 IP 地址。
proxyPort - 代理端口。
proxyLogin - 代理服务器用户名。
proxyPassword - 代理服务器密码。
https://api.capmonster.cloud/createTask
{
"clientKey": "API_KEY",
"task": {
"type": "FunCaptchaTask",
"websiteURL": "https://www.example.com",
"websitePublicKey": "EX72CCFB-26EX-40E5-91E6-85EX70BE98ED",
"funcaptchaApiJSSubdomain": "example-api.arkoselabs.com",
"data": "{\"blob\":\"nj9UbL+yio7goOlTQ/b64t.ayrrBnP6kPgzlKYCP/kv491lKS...Wot/7gjpyIxs7VYb0+QuRcfQ/t6bzh5pXDkOFSskA/V/ITSVZSAlglIplLcdreZ4PE8skfMU6k1Q\"}",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36",
"proxyType": "http", // 如有需要请添加代理
"proxyAddress": "8.8.8.8",
"proxyPort": 8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere"
}
}
{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}
{
"errorId": 0,
"errorCode": null,
"errorDescription": null,
"solution": {
"token": "337187b9f57678923.5060184402|r=us-west-2|lang=en|pk=EX72CCFB-26EX-40E5-91E6-85EX70BE98ED|at=40|ag=101|cdn_url=https%3A%2F%2Fclient-api.arkoselabs.com%2Fcdn%2Ffc|surl=https%3A%2F%2Fclient-api.arkoselabs.com|smurl=https%3A%2F%2Fclient-api.arkoselabs.com%2Fcdn%2Ffc%2Fassets%2Fstyle-manager",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
},
"status": "ready"
}
// npm install playwright
const { chromium } = require("playwright");
const WEBSITE_URL = "https://example.com";
// 来自 CapMonster Cloud 的令牌
const FUN_CAPTCHA_TOKEN = "PUT_YOUR_FUN_CAPTCHA_TOKEN_HERE";
(async () => {
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
/**
* 通用 Arkose 捕获 (v1 / v2)
* 在页面加载前执行
*/
await page.addInitScript(() => {
const callbacks = [];
function captureCallback(cb, source) {
if (typeof cb === "function") {
callbacks.push(cb);
console.log("[Arkose] callback captured from", source);
}
}
function patchRender(obj, name) {
if (!obj || typeof obj.render !== "function") return;
const originalRender = obj.render;
obj.render = function (container, options = {}) {
captureCallback(options.callback, name + ".render");
return originalRender.apply(this, arguments);
};
}
// 通过 Object.defineProperty 捕获(Arkose 常用)
const originalDefineProperty = Object.defineProperty;
Object.defineProperty = function (target, prop, descriptor) {
if (
(prop === "FunCaptcha" || prop === "ArkoseEnforcement") &&
descriptor &&
typeof descriptor.value === "object"
) {
patchRender(descriptor.value, prop);
}
return originalDefineProperty.apply(this, arguments);
};
// 备用:定期检查全局对象
const interval = setInterval(() => {
if (window.FunCaptcha) patchRender(window.FunCaptcha, "FunCaptcha");
if (window.ArkoseEnforcement)
patchRender(window.ArkoseEnforcement, "ArkoseEnforcement");
if (callbacks.length > 0) clearInterval(interval);
}, 200);
// 传递令牌的通用点
window.__arkoseSolve = function (token) {
if (callbacks.length > 0) {
callbacks.forEach((cb) => cb(token));
console.log("[Arkose] token delivered via captured callbacks");
return true;
}
// 替代方案
if (typeof window.arkoseCallback === "function") {
window.arkoseCallback(token);
console.log("[Arkose] token delivered via arkoseCallback");
return true;
}
// 备用
window._arkoseToken = token;
console.log("[Arkose] token stored in window._arkoseToken");
return false;
};
});
/**
* 打开页面
*/
console.log("Opening page...");
await page.goto(WEBSITE_URL, { waitUntil: "domcontentloaded" });
/**
* 此处网站应初始化 FunCaptcha
* (注册、登录、按钮、表单等)
*/
/**
* 传递准备好的令牌
*/
console.log("Injecting FunCaptcha token...");
await page.evaluate((token) => {
if (!window.__arkoseSolve) {
console.log("[Arkose] solver not ready");
return;
}
window.__arkoseSolve(token);
}, FUN_CAPTCHA_TOKEN);
/**
* 给页面处理结果的时间
*/
await page.waitForTimeout(5000);
console.log("Done.");
await browser.close();
})();
获得访问权限后,在 Settings → Keys 中获取 两个密钥(Public / Private)。

如有需要,请联系 Customer Success Manager (CSM):
Arkose 建议
总体流程
步骤 1. 客户端集成
在浏览器端 (Arkose Bot Manager):
Client API:
client-api.arkoselabs.com<company>-api.arkoselabs.com主要要求
客户端结果 — token 发送到服务器。
<html>
<head>
<!--
在页面 <head> 中连接 Arkose Labs API。示例:
- 将 <YOUR PUBLIC KEY> 替换为 Arkose Labs 提供的 public key;
- 将 <YOUR CALLBACK> 替换为您定义的全局 callback 函数名。
示例:
<script src="//client-api.arkoselabs.com/v2/<YOUR PUBLIC KEY>/api.js"
data-callback="setupDetect"></script>
-->
<script src="//client-api.arkoselabs.com/v2/<YOUR PUBLIC KEY>/api.js" data-callback="<YOUR CALLBACK>"></script>
<link rel="shortcut icon" href="#">
<meta charset="UTF-8">
</head>
<body>
<!--
触发元素可放置在页面任意位置,并可随时加入 DOM。
-->
<button id="arkose-trigger">
触发元素
</button>
<!--
设置 Arkose(检测或强制模式),将 script 放在 </body> 前并定义全局 callback 函数。
-->
<script>
/*
当 Arkose API 准备好时,全局函数将被调用。函数名必须与加载 Arkose API 的 script 的 data-callback 属性一致。
*/
function setupArkose(myArkose) {
myArkose.setConfig({
selector: '#arkose-trigger',
onCompleted: function(response) {
// 需发送到服务器的一次性 token
console.log(response.token);
}
});
}
</script>
</body>
</html>
步骤 2. 服务器验证
服务器通过 Arkose Verify API 验证 token。
Verify API endpoint
https://<company>-verify.arkoselabs.com/api/v4/verify/必填参数
POST 请求示例
{
"private_key": "_PRIVATE_KEY_HERE_",
"session_token": "_SESSION_TOKEN_HERE_",
"log_data": "_LOG_DATA_HERE_"
}
API 响应包含会话信息和验证结果。
关键点
<?php
$private_key = 'YOUR_PRIVATE_KEY';
$verify_url = 'https://<company>-verify.arkoselabs.com/api/v4/verify/';
$input = json_decode(file_get_contents('php://input'), true);
$session_token = $input['session_token'] ?? null;
$log_data = $input['log_data'] ?? '';
$email_address = $input['email_address'] ?? '';
if (!$session_token) {
http_response_code(400);
echo json_encode(['error' => '缺少 session token']);
exit;
}
$data = [
'private_key' => $private_key,
'session_token' => $session_token,
'log_data' => $log_data,
'email_address' => $email_address
];
$options = [
'http' => [
'header' => "Content-Type: application/json\r\n",
'method' => 'POST',
'content' => json_encode($data),
],
];
$context = stream_context_create($options);
$result = file_get_contents($verify_url, false, $context);
if ($result === FALSE) {
http_response_code(500);
echo json_encode(['error' => '验证码验证出错']);
exit;
}
echo $result;
?>
工作原理:
如果你接手了一个已经集成了验证码或其他防护系统的网站,但又无法访问其代码,也不用担心!要判断实际使用了哪种技术其实并不难。为了核实其是否正常工作,你可以在隔离的测试环境中使用CapMonster Cloud识别服务,确保令牌处理机制和校验逻辑都运行正常。
对于FunCaptcha,只需识别出所用的系统,观察其行为,并确认防护是否正常工作即可。本文演示了如何识别 FunCaptcha,以及到哪里查找其接入或重新配置的说明文档,从而帮助你自信地维护防护方案并掌控其运行情况。