跳转到主要内容
获取令牌时遇到问题吗
联系支持

FunCaptcha

注意!

CapMonster Cloud 默认通过内置代理工作——这些代理已包含在费用内。仅当网站不接受令牌或对内置服务的访问受限时,才需要指定您自己的代理。

如果代理按 IP 授权,请将地址 65.21.190.34 加入白名单。

请求参数


重要提示:某些参数的值是动态的 — 它们会在每次渲染包含 FunCaptcha 的页面时发生变化。
请在创建任务前立即提取这些参数,以避免在解决过程中出现错误。
参数提取示例请参见章节 获取 FunCaptcha 参数使用 data[blob] 自动解决 FunCaptcha


type<string>required

FunCaptchaTask


websiteURL<string>required

验证码所在页面的 URL。


websitePublicKey<string>required

FunCaptcha 密钥(public keypk 的值)。

格式示例:EX72CCFB-26EX-40E5-91E6-85EX70BE98ED


data<string>optional

附加参数。如果网站使用 data[blob],则此参数为必填。

重要: 请勿加载验证码框架来提取 blob。验证码加载后,该参数值将失效。


funcaptchaApiJSSubdomain<string>optional

Arkose Labs 子域名(surl 的值)。仅当它与默认值 client-api.arkoselabs.com 不同时才指定。

重要: 仅指定域名,不要包含 https:// 前缀


userAgent<string>optional

浏览器 User-Agent。
仅传递当前 Windows 系统的 UA 示例: userAgentPlaceholder


cookies<string>optional

请按以下格式传递附加 Cookie:

cookieName1=value1; cookieName2=value2

proxyType<string>optional

http - 常规 http/https 代理;
https - 仅当 "http" 无效时使用(某些自定义代理需要);
socks4 - socks4 代理;
socks5 - socks5 代理。


proxyAddress<string>optional

代理的 IPv4/IPv6 地址。禁止以下使用方式:

  • 使用透明代理(可暴露客户端 IP);
  • 使用本地机器上的代理。


proxyPort<integer>optional

代理端口。


proxyLogin<string>optional

代理服务器登录用户名。


proxyPassword<string>optional

代理服务器登录密码。

创建任务的方法

POST
https://api.capmonster.cloud/createTask

请求示例

{
"clientKey": "API_KEY",
"task": {
"type": "FunCaptchaTask",
"websiteURL": "https://yourwebsite.com/page-with-funcaptcha",
"websitePublicKey": "your-website-key",
"funcaptchaApiJSSubdomain": "example-api.arkoselabs.com",
"data": "{\"blob\":\"your-blob-value-1234567890\"}",
"userAgent": "userAgentPlaceholder"
}
}

响应示例

{
"errorId":0,
"taskId":407533077
}

获取任务结果的方法

使用 getTaskResult 获取 FunCaptcha 解决方案。

POST
https://api.capmonster.cloud/getTaskResult

请求示例

{
"clientKey": "API_KEY",
"taskId": 407533077
}

响应示例

{
"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": "userAgentPlaceholder"
},
"status": "ready"
}

获取 FunCaptcha 参数

websitePublicKeyfuncaptchaApiJSSubdomain

打开 DevTools → Elements,找到隐藏输入框 ID 为 verification-tokenFunCaptcha-Token 的元素。其中包含 pk (websitePublicKey) 和 surl (funcaptchaApiJSSubdomain) 值。

通过控制台获取参数:

const v = document.querySelector("#verification-token, #FunCaptcha-Token").value;
const p = Object.fromEntries(v.split("|").map(x => x.split("=")));
console.log("pk:", p.pk);
console.log("surl:", decodeURIComponent(p.surl));

data (blob)

如果网站使用额外的 blob 参数,可以按以下方式获取:

1. 确定数据来源

blob 参数可能存在于:

  • HTML 属性:例如 data-blob 或其他 data-* 属性。

  • JSON API 响应:用户操作(如点击或请求验证码)后返回。

  • JSON 中 URL 的查询参数:有时 blob 作为 URL 的一部分传递。

2. 执行请求

  • GET 请求到显示验证码的页面, 或
  • POST 请求到返回验证码数据的 API。

重要提示: 不要加载 captcha iframe 来提取 blob。一旦验证码加载,参数即失效。

3. 提取参数

  • 如果响应是 HTML — 使用正则或 HTML 解析工具定位属性。
  • 如果响应是 JSON — 获取对应键的值(例如 data.blob)。
  • 如果 blobURL 中 — 解析 query 参数以获取值。

您也可以通过 DevTools 的网络请求找到 blob 参数及其值:

  1. 打开包含验证码的页面,打开 DevTools,并触发验证码显示。 然后打开 Network(网络) 标签,找到类似以下的请求: https://arkoselabs.example.com/fc/gt2/public_key/176068BF-9607-4799-B53D-366BE98E2B84

  2. 阻止验证码 iframe 的加载,以获取有效的 blob。 操作方法:按 Ctrl + Shift + P(在 Chromium 浏览器中),输入 Enable network request blocking(启用网络请求阻止),启用请求阻止,并添加如下模式: /fc/gt2

    重新加载页面后,iframe 将被阻止。复制 blob 参数的值,并在验证码求解请求中使用。

使用 data[blob] 自动解决 FunCaptcha

下面的 JavaScript(Node.js)、Python 和 C# 示例演示了如何使用 Playwright 提取 public_keyblob 参数,在 CapMonster Cloud 创建任务,并获取验证码解决方案的 token。 你也可以使用其他自动化或测试工具实现相同的逻辑。

显示代码
// npm install playwright

const { chromium } = require("playwright");

const apiKey = "YOUR_API_KEY"; // CapMonster Cloud API 密钥
const websiteURL = "https://www.example.com/"; // 包含 FunCaptcha 的页面

// 等待 FunCaptcha 请求,检查并提取 public_key 和 blob
async function captureBlobAndPublicKey(page) {
return new Promise(resolve => {
page.on("request", req => {
const url = req.url();

// 检查请求是否与 FunCaptcha 初始化相关
if (url.includes("/fc/gt2/public_key/")) {
const publicKey = url.split("/fc/gt2/public_key/")[1].split("/")[0];
const post = req.postData();

// 检查 POST 数据中是否存在 blob 并提取
if (post && post.includes("data[blob]")) {
const params = new URLSearchParams(post);
const blob = params.get("data[blob]");

console.log("Extracted blob:", blob);
console.log("Extracted public_key:", publicKey);

resolve({ blob, publicKey });
}
}
});
});
}

// 在 CapMonster Cloud 创建 FunCaptchaTask 并发送参数
async function createTask(blob, publicKey) {
const task = {
type: "FunCaptchaTask",
websiteURL,
websitePublicKey: publicKey,
data: JSON.stringify({ blob }),
userAgent: "userAgentPlaceholder"
};

const res = await fetch("https://api.capmonster.cloud/createTask", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: apiKey, task })
});

const json = await res.json();

// 检查 CapMonster Cloud 响应并等待 taskId
if (!json.taskId) {
console.error("createTask error:", json);
process.exit(1);
}

console.log("Task created:", json.taskId);
return json.taskId;
}

// 等待任务解决
async function getTaskResult(taskId) {
while (true) {
const res = await fetch("https://api.capmonster.cloud/getTaskResult", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ clientKey: apiKey, taskId })
});

const json = await res.json();

// 检查解决方案是否就绪
if (json.status === "ready") return json.solution;

console.log("Processing...");
await new Promise(r => setTimeout(r, 2500));
}
}

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();

// 阻止验证码 iframe
await page.route("**/fc/gt2/**", route => route.abort());

console.log("Opening page...");
await page.goto(websiteURL, { waitUntil: "domcontentloaded" });

console.log("Capturing public_key + blob...");

/**
* 重要!
* 在此步骤,你需要触发 CAPTCHA。
* - 点击登录 / 注册
* - 输入邮箱 / 用户名
* - 等待 FunCaptcha 出现
*
* 示例:
* await page.click('text="Create account"');
* await page.waitForTimeout(1000);
*/

const { blob, publicKey } = await captureBlobAndPublicKey(page);

// 检查参数是否成功提取
if (!blob || !publicKey) {
console.error("Failed to extract blob or public_key");
await browser.close();
return;
}

console.log("Creating CapMonster task...");
const taskId = await createTask(blob, publicKey);

console.log("Waiting for solution...");
const solution = await getTaskResult(taskId);

// 获取最终 token
console.log("CAPTCHA SOLVED");
console.log("Token:", solution.token);

await browser.close();
})();