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

ComplexImageTask Recaptcha

注意!

此任务无需使用代理服务器。

该对象包含解决谷歌 ReCaptcha2 任务的数据。

请求参数

type<string>required

ComplexImageTask


class<string>required

recaptcha


imageUrls<array>required (如果 imagesBase64 未填写)

单张 4x4 图片,3x3或新的 1x1 验证码部分(数组中)。 示例: [“https://i.postimg.cc/yYjg75Kv/img1.jpg”]\


imagesBase64<array>required (如果 imageUrls 未填写)

单张 4x4 图片,3x3或新的 1x1 验证码部分的 base64 格式(数组中)。 示例: [ “/9j/4AAQSkZJRgABAQEAAAAAAAD…”]


Grid (在 metadata 中)<string>required

图片网格大小。 可能的值: 4x4, 3x3, 1x1


TaskDefinition (在 metadata 中)<string>required (如果 Task 未填写)

定义任务类型的技术值 如何获取 TaskDefinition。该数据可以在对 /recaptcha/{recaptchaApi}/reload/recaptcha/{recaptchaApi}/userverify 请求的响应中找到,其中 recaptchaApi 是 "enterprise" 或 "api2",具体取决于 Recaptcha 的类型。响应包含 JSON,可以从中获取加载的验证码的 TaskDefinitions 列表。


Task (在 metadata 中)<string>required (if TaskDefinition is not filled)

可能的值:点击交通灯 及其他
任务名称 (英文)。


userAgent<string>optional

加载图像时使用的浏览器用户代理(如果在 imageUrls 中传递了链接)。需要使用现代浏览器签名,否则谷歌会返回错误并要求更新浏览器。


websiteURL<string>optional

解决验证码的页面 URL。

参数说明

imageUrls:图像链接。

imagesBase64:Base64 格式的图像。

Grid (在 metadata 中):与图像网格大小相关的附加元数据。

TaskDefinition (在 metadata 中):任务描述标识符/类型,例如:/m/015qff 表示“点击红绿灯”。

Task(在 metadata 中):与任务相关的附加元数据。

userAgent:用户代理信息。当前 userAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.0.0 Safari/537.36

websiteURL:包含验证码的网页地址。

创建任务方法

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

要求

{
"clientKey":"API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recaptcha",
"imageUrls":[ "https://i.postimg.cc/yYjg75Kv/payloadtraffic.jpg" ],
"metadata": {
"Task": "点击红绿灯",
"Grid": "3x3",
"TaskDefinition": "/m/015qff"
},
"userAgent": "userAgentPlaceholder",
"websiteUrl": "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=middle"
}
}

回应

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

获取任务结果方法

使用getTaskResult方法获取验证码解决方案。根据系统负载情况,您将在300毫秒到6秒的时间内收到响应。

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

要求

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

回应

{
"errorId":0,
"status":"ready",
"solution": {
"answer": [ false, false, false, false, true, false, false, false, false ]
}
}

属性类型描述
answerArray包含布尔值的列表,"true" 表示需要点击对应位置的图像。

定价:

名称每1000张图片的成本, $每1000张新动态图片的费用, $
1

reCAPTCHA 2 (3*3)

0.20.04
2

reCAPTCHA 2 (4*4)

0.1不适用

如何查找任务创建所需的所有参数

手动方式

  1. 请在浏览器中访问您的网站,该网站包含验证码功能。
  2. 右键点击验证码元素,选择 检查(Inspect)

websitekey:

查找方式类似于 ReCaptchaV2TaskReCaptchaV2Enterprise

imageUrls:

在元素属性中查找 URL:

imgUrl

您也可以通过右键点击图像并选择 在新标签页中打开图像 来获取完整的图像 URL。然后,直接从浏览器地址栏复制该 URL。

imgUrl1

Task(在 metadata 中)

任务描述。右键点击任务文字,然后在 开发者工具 中找到页面结构中对应的元素:

metadata

自动方法

为了自动化获取所需参数,可以通过 浏览器(普通模式或 headless 模式,例如使用 Playwright)进行提取,或直接从 HTTP 请求中获取。由于动态参数的有效时间较短,建议在获取后尽快使用。

重要

所提供的代码片段仅作为获取必要参数的基础示例。具体实现方式取决于包含验证码的网站、本身的页面结构,以及所使用的 HTML 元素和选择器。

显示代码(浏览器端)
const img = document.querySelector('img.rc-image-tile-33') || document.querySelector('img.rc-image-tile-44');
const src = img ? img.src : null;
console.log(src);

// 任务描述
const descEl =
document.querySelector('.rc-imageselect-desc-no-canonical') ||
document.querySelector('.rc-imageselect-desc');

const taskDescription = descEl
? descEl.textContent.trim()
: '未找到任务描述';

console.log(taskDescription);

// 可见的图片块数量
const tiles = document.querySelectorAll('.rc-imageselect-tile');
const visibleTiles = Array.from(tiles).filter(tile => tile.offsetParent !== null);

const tileCount = visibleTiles.length;

let gridSize;
if (tileCount === 9) {
gridSize = '3x3';
} else if (tileCount === 16) {
gridSize = '4x4';
} else if (tileCount === 25) {
gridSize = '5x5';
} else {
gridSize = '未知';
}

console.log(`网格大小: ${gridSize}`);
显示代码(Node.js)
import { chromium } from "playwright";

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

const url =
"https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high";
await page.goto(url);

const frames = page.frames();
const checkboxFrame = frames.find((f) => f.url().includes("api2/anchor"));

if (!checkboxFrame) {
console.error("未找到 reCAPTCHA 的复选框 iframe");
await browser.close();
return;
}

const checkbox = await checkboxFrame.waitForSelector("#recaptcha-anchor", {
timeout: 5000,
});
await checkbox.click();

await page.waitForTimeout(1000);
const updatedFrames = page.frames();
const challengeFrame = updatedFrames.find((f) =>
f.url().includes("api2/bframe")
);

if (!challengeFrame) {
console.error("未找到 reCAPTCHA 的挑战 iframe");
await browser.close();
return;
}

// 图像
const img =
(await challengeFrame.$("img.rc-image-tile-33")) ||
(await challengeFrame.$("img.rc-image-tile-44"));
const src = img ? await img.getAttribute("src") : null;
console.log("图像:", src);

// 任务描述
try {
await challengeFrame.waitForSelector(
".rc-imageselect-desc-no-canonical, .rc-imageselect-desc",
{
timeout: 5000,
}
);
const taskDescription = await challengeFrame.$eval(
".rc-imageselect-desc-no-canonical, .rc-imageselect-desc",
(el) => {
const strong = el.querySelector("strong");
const text = strong ? strong.textContent.trim() : "未找到";
return text;
}
);
console.log("任务: 选择所有含有:", taskDescription, " 的图像");
} catch (error) {
console.log("未找到任务描述。");
}

// 网格大小
const tiles = await challengeFrame.$$(".rc-imageselect-tile");
const visibleTiles = await Promise.all(tiles.map((tile) => tile.isVisible()));
const tileCount = visibleTiles.filter(Boolean).length;

let gridSize;
if (tileCount === 9) {
gridSize = "3x3";
} else if (tileCount === 16) {
gridSize = "4x4";
} else if (tileCount === 25) {
gridSize = "5x5";
} else {
gridSize = "未知";
}

console.log(`网格大小: ${gridSize}`);

await browser.close();
}

extractCaptchaInfo();

使用 SDK 库

显示代码(用于浏览器)
// https://github.com/ZennoLab/capmonstercloud-client-js

import {
CapMonsterCloudClientFactory,
ClientOptions,
RecaptchaV3ProxylessRequest
} from '@zennolab_com/capmonstercloud-client';

document.addEventListener('DOMContentLoaded', async () => {

const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_API_KEY' }) // 输入您的 CapMonster Cloud API 密钥
);

// 如有必要,可以检查余额
const balance = await cmcClient.getBalance();
console.log('Balance:', balance);

// 基本示例,无需代理
// CapMonster Cloud 会自动使用它们的代理
const recaptchaV3Request = new RecaptchaV3ProxylessRequest({
websiteURL: 'https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta', // 您的验证码页面 URL
websiteKey: '6Le0xVgUAAAAAIt20XEB4rVhYOODgTl00d8juDob',
minScore: 0.6,
pageAction: 'myverify',
});

const solution = await cmcClient.Solve(recaptchaV3Request);
console.log('Solution:', solution);

});
显示代码 (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js

import { CapMonsterCloudClientFactory, ClientOptions, RecaptchaV3ProxylessRequest } from '@zennolab_com/capmonstercloud-client';

const API_KEY = "YOUR_API_KEY"; // 输入您的 CapMonster Cloud API 密钥

async function solveRecaptchaV3() {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);

// 如有必要,可以检查余额
const balance = await cmcClient.getBalance();
console.log("Balance:", balance);

// 基本示例,无需代理
// CapMonster Cloud 会自动使用它们的代理
const recaptchaV3Request = new RecaptchaV3ProxylessRequest({
websiteURL: "https://lessons.zennolab.com/captchas/recaptcha/v3.php?level=beta", // 您的验证码页面 URL
websiteKey: "6Le0xVgUAAAAAIt20XEB4rVhYOODgTl00d8juDob",
minScore: 0.6,
pageAction: "myverify",
});

const solution = await cmcClient.Solve(recaptchaV3Request);
console.log("Solution:", solution);
}

solveRecaptchaV3().catch(console.error);