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

ComplexImage Recognition

注意!

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

请求参数

type<string>required

ComplexImageTask


class<string>required

recognition


imagesBase64<array>required

仅图像的Base64编码 示例: [ “/9j/4AAQSkZJRgABAQEAAAAAAAD…”]


Task(在 metadata 中)<string>required

可能的值:oocl_rotate_new 等。 任务名称(英文)。

oocl_rotate_new

创建任务oocl_rotate_new

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

要求

{
"clientKey": "API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": [
"{background_base64}",
"{circle_base64}"
],
"metadata": {
"Task": "oocl_rotate_new"
}
}
}

背景图像 (background_base64):

圆形图像 (circle_base64):

回应

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

获取任务结果oocl_rotate_new

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

要求

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

回应 圆形需要顺时针旋转的度数。

{
"errorId":0,
"status":"ready",
"errorCode":null,
"errorDescription":null,
"solution":
{
"answer":[130.90909],
"metadata":{"AnswerType":"NumericArray"}
}
}

oocl_rotate_double_new

创建任务oocl_rotate_double_new

在请求中我们传递三张图片:背景、环形和圆形。

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

要求

{ 
"clientKey": "API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": [
"{background_base64}",
"{ring_base64}",
"{circle_base64}"
],
"metadata": {
"Task": "oocl_rotate_double_new"
}
}
}

背景图像 (background_base64):

环形图像 (ring_base64):

圆形图像 (circle_base64):

回应

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

获取任务结果oocl_rotate_double_new

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

要求

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

回应 环形需要逆时针旋转的度数,圆形需要顺时针旋转的度数。

{
"errorId":0,
"status":"ready",
"errorCode":null,
"errorDescription":null,
"solution":
{
"answer":[130.90909],
"metadata":{"AnswerType":"NumericArray"}
}
}

betpunch_3x3_rotate

创建任务betpunch_3x3_rotate

在请求中我们传递九张图片。图片必须按以下顺序传递:

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

要求

{ 
"clientKey": "API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": [
"{image_1_Base64}",
"{image_2_Base64}",
"{image_3_Base64}",
"{image_4_Base64}",
"{image_5_Base64}",
"{image_6_Base64}",
"{image_7_Base64}",
"{image_8_Base64}",
"{image_9_Base64}",
],
"metadata": {
"Task": "betpunch_3x3_rotate"
}
}
}

回应

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

获取任务结果betpunch_3x3_rotate

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

要求

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

回应 "answer":[X,X,X,X,X,X,X,X,X], 其中 X 是每张图片的整数值,范围为 1 到 4。4 表示图像不需要旋转;1-3 表示图像逆时针旋转的次数。

{
"errorId":0,
"status":"ready",
"errorCode":null,
"errorDescription":null,
"solution":
{
"answer":[4,4,4,4,4,3,1,2,2],
"metadata":{"AnswerType":"NumericArray"}
}
}

bls

创建任务 bls

在请求中,我们发送9张以base64格式编码的图片。 我们还在 metadata 中传递所需的值TaskArgument。

更多相关内容,请访问我们的博客
POST
https://api.capmonster.cloud/createTask

要求

{
"clientKey":{{API_key}},
"task":
{
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": [
"image1_to_base64",
"image2_to_base64",
"image3_to_base64",
"image4_to_base64",
"image5_to_base64",
"image6_to_base64",
"image7_to_base64",
"image8_to_base64",
"image9_to_base64"
],
"metadata": {
"Task": "bls_3x3",
"TaskArgument": "123"
}
}
}

示例任务:

发送转换为base64的图片:

对于此示例: "TaskArgument": "546"

回应

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

获取任务结果 bls

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

要求

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

回应 一个值的数组,元素为 true 或 false,取决于图片中的数字是否为所需的参数。

{
"errorId":0,
"status":"ready",
"errorCode":null,
"errorDescription":null,
"solution":
{
"answer":[true,true,false,false,true,false,false,true,true],
"metadata":{"AnswerType":"Grid"}
}
}

shein

创建任务 shein

在请求中,我们传递一张 base64 格式的图片。

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

要求

{
"clientKey": "API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": [
"base64"
],
"metadata": {
"Task": "shein"
}
}
}

示例任务:

回应

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

获取任务结果 shein

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

要求

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

回应 按特定顺序点击的坐标。

{
"solution":
{
"answer":[{"X":68.99999964,"Y":201.954889},{"X":127.99999783999999,"Y":281.54887104},{"X":181.00000776,"Y":49.894734680000006}],
"metadata":{"AnswerType":"Coordinate"}
},
"cost":0.0003,
"status":"ready",
"errorId":0,
"errorCode":null,
"errorDescription":null
}

baidu

创建任务 baidu

注意!

在解决流程开始时,可能会暂时出现 unsolvable 的结果。 这不是错误 —— 验证码将在初始化完成后继续成功解决。

在请求中,我们传递一张 base64 格式的图片。

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

要求

{
"clientKey": "API_KEY",
"task":
{
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": ["base64"],
"metadata": {
"Task": "baidu"
}
}
}

示例任务:

回应

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

获取任务结果 baidu

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

要求

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

回应 顺时针旋转图像所需的角度。

{
"solution":
{
"answer":[297],
"metadata":{"AnswerType":"NumericArray"}
},
"cost":0.0005,
"status":"ready",
"errorId":0,
"errorCode":null,
"errorDescription":null
}

bills_audio

创建任务 bills_audio

音频验证码 bills_audio 是“收据验证码”的声音版本,其中生成的图像或数据模拟收据,例如包含数字、金额和日期。在此类任务中,用户需要听音频文件,并根据听到的信息确认输入的正确性。该格式示例如下:

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

请求

{
"clientKey": "API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recognition",
"imagesBase64": [
"UklGRnjuAwBXQVZFZm10...f/2f/9/6z/vf8MAAAA"
],
"metadata": {
"Task": "bills_audio",
"PayloadType": "Audio"
}
}
}

响应

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

获取任务结果 bills_audio

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

请求

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

响应
响应中返回音频中的数字。

{
"solution": {
"answer": [6, 8, 4, 1, 2, 3],
"metadata": {"AnswerType": "Text"}
},
"cost": 0.0008,
"status": "ready",
"errorId": 0,
"errorCode": null,
"errorDescription": null
}

如何从页面获取音频文件并转换为 Base64 格式

  1. 打开验证码页面并启动 开发者工具(DevTools),然后切换到 Network 标签。
  2. 点击相应按钮启用验证码的音频模式。
  3. 在请求列表中找到类似以下格式的 URL:
    blob:https://example.com/3be79ac6-1b3d-43ef-9a8a-7ad8877b3606
  4. 复制该 URL 并在浏览器地址栏打开 — 音频验证码文件将以 .wav 格式显示。

  1. 保存文件,并将 .wav 转换为 Base64,可使用你方便的方法,例如 Node.js 代码:
const fs = require("fs");

// 源 .wav 文件路径
const filePath = "C:\\Users\\User\\Downloads\\file-acbe-4fb3-9f8e-f989ba6c7fde.wav";

const fileBuffer = fs.readFileSync(filePath);

// 转换为 Base64
const base64 = fileBuffer.toString("base64");

// 将 Base64 字符串保存到文本文件
fs.writeFileSync("output.txt", base64);

console.log("文件已成功转换为 Base64,并保存为 output.txt");
  1. 在 CapMonster Cloud 的任务请求中使用生成的 Base64 字符串。

如何获取 Base64

网页上的图片可以以URL或Base64编码格式直接呈现。要找到所需的值,右键点击图片,选择 检查,仔细查看 元素 部分或网络请求网格——在那里可以找到URL或编码内容。

手动方式

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

base64ComplexImage

自动方法

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

重要

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

显示代码 (Node.js)
import { chromium } from 'playwright';

// 从src中提取base64的函数
async function getBase64FromSrc(elementHandle) {
const src = await elementHandle.getAttribute('src');
if (src && src.startsWith('data:image')) {
return src.split(',')[1];
}
return null;
}

// 使用截图获取base64的函数(如果src不是base64格式)
async function elementToBase64(elementHandle) {
const base64 = await getBase64FromSrc(elementHandle);
if (base64) {
return base64; // 如果图片已经是base64格式,直接返回
}
const buffer = await elementHandle.screenshot();
return buffer.toString('base64');
}

// 将元素数组转换为base64字符串数组的函数
async function multipleElementsToBase64(elements) {
const base64Array = [];
for (const el of elements) {
const base64 = await elementToBase64(el);
base64Array.push(base64);
}
return base64Array;
}

// -------------------------------------------------------------
// 为不同类型的验证码准备base64
// -------------------------------------------------------------

// 1. oocl_rotate_new (背景 + 圆圈)
async function prepareOoclRotateNew(page) {
const background = await page.$('img.background');
const circle = await page.$('img.circle');

const backgroundBase64 = await elementToBase64(background);
const circleBase64 = await elementToBase64(circle);

return { backgroundBase64, circleBase64 };
}

// 2. oocl_rotate_double_new (背景 + 圆环 + 圆圈)
async function prepareOoclRotateDoubleNew(page) {
const background = await page.$('img.background');
const ring = await page.$('img.ring');
const circle = await page.$('img.circle');

const backgroundBase64 = await elementToBase64(background);
const ringBase64 = await elementToBase64(ring);
const circleBase64 = await elementToBase64(circle);

return { backgroundBase64, ringBase64, circleBase64 };
}

// 3. betpunch_3x3_rotate (9张小图片)
async function prepareBetpunch3x3(page) {
const sectors = await page.$$('img.sector');

const sectorsBase64 = await multipleElementsToBase64(sectors);

return { sectorsBase64 };
}

// 4. bls (9张小图片用于点击)
async function prepareBls(page) {
const sectors = await page.$$('img.sector');

const sectorsBase64 = await multipleElementsToBase64(sectors);

return { sectorsBase64 };
}

// 5. shein (1张大图片)
async function prepareShein(page) {
const captchaImage = await page.$('img.captcha');

const captchaBase64 = await elementToBase64(captchaImage);

return { captchaBase64 };
}

// Playwright示例
async function run() {
const browser = await chromium.launch();
const page = await browser.newPage();
await page.goto('https://example.com'); // 替换为实际URL

// 获取oocl_rotate_new的base64示例
const { backgroundBase64, circleBase64 } = await prepareOoclRotateNew(page);
console.log('Base64背景:', backgroundBase64);
console.log('Base64圆圈:', circleBase64);

await browser.close();
}

run();
在Node.js中搜索oocl参数的示例
import { chromium } from "playwright";

// 代理(可选)
// const proxyHost = "";
// const proxyUsername = "";
// const proxyPassword = "";

async function getBase64FromSrc(elementHandle) {
const src = await elementHandle.getAttribute("src");
if (src && src.startsWith("data:image")) {
return src.split(",")[1];
}
return null;
}

async function elementToBase64(elementHandle) {
const base64 = await getBase64FromSrc(elementHandle);
if (base64) {
return base64;
}
const buffer = await elementHandle.screenshot();
return buffer.toString("base64");
}

async function extractVerifyImagesBase64(page) {
const imgSelectors = [".verify-img-panel img", ".verify-sub-block img"];

const imageHandles = (
await Promise.all(imgSelectors.map((selector) => page.$$(selector)))
).flat();

if (imageHandles.length === 0) {
throw new Error(
"在verify-img-panel或verify-sub-block中未找到图片。"
);
}

const imagesBase64 = [];
for (const handle of imageHandles) {
const base64 = await elementToBase64(handle);
imagesBase64.push({
src: await handle.getAttribute("src"),
base64,
});
}

return imagesBase64;
}

async function run() {
const browser = await chromium.launch({
headless: false,
// proxy: {
// server: `http://${proxyHost}`,
// username: proxyUsername,
// password: proxyPassword,
// },
});

const page = await browser.newPage();
await page.goto(
"https://example.com/registration/form?appurl=https://example.com"
);

try {
const images = await extractVerifyImagesBase64(page);
for (const { src, base64 } of images) {
console.log("来源:", src);
console.log("Base64:", base64);
}
} catch (err) {
console.error(err.message);
}

await browser.close();
}

run();

使用 SDK 库

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

import { CapMonsterCloudClientFactory, ClientOptions, ComplexImageTaskRecognitionRequest } 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);

const citRecognitionRequest = new ComplexImageTaskRecognitionRequest({
imagesBase64: ['/9xwee/'], // base64 格式的图片
metaData: { Task: 'oocl_rotate' }
});

const result = await cmcClient.Solve(citRecognitionRequest);
console.log("Solution:", result);
});
显示代码 (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js

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

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

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

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

const citRecognitionRequest = new ComplexImageTaskRecognitionRequest({
imagesBase64: ['/9xwee/'], // base64 格式的图片
metaData: { Task: 'oocl_rotate' }
});

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

solveComplexImageTask().catch(console.error);