ComplexImageTask Recaptcha
Использование прокси-серверов для данной задачи не требуется.
Объект содержит данные о задаче на решение ReCaptcha2 от Google.
Параметры запроса
type<string>requiredComplexImageTask
class<string>requiredrecaptcha
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, в котором можно взять список TaskDefinition-ов для подгруженных капч.
Task (внутри metadata)<string>required (если не заполнено TaskDefinition)Возможные значения: Click on traffic lights и другие
Текст задания (на английском).
userAgent<string>optionalUser-Agent браузера, используемый при загрузке изображений, если были переданы ссылки в imageUrls. Необходимо использовать подпись современного браузера, иначе Google будет возвращать ошибку, требуя обновить браузер.
websiteURL<string>optionalАдрес страницы, на которой решается капча.
Описание параметров
imageUrls: ссылки на изображения.
imagesBase64: изображения в формате Base64.
Grid (внутри metadata): дополнительные метаданные, связанные с размерами сетки изображений.
TaskDefinition (внутри metadata): идентификатор/тип описания задания, например: /m/015qff означает “Click on traffic lights”.

Task (внутри metadata): дополнительные метаданные, связанные с задачей.
userAgent: информация о пользовательском агенте. Актуальный userAgent: userAgentPlaceholder
websiteURL: адрес веб-страницы с капчей.
Метод создания задачи
https://api.capmonster.cloud/createTask
Запрос
{
"clientKey":"API_KEY",
"task": {
"type": "ComplexImageTask",
"class": "recaptcha",
"imageUrls":[ "https://i.postimg.cc/yYjg75Kv/payloadtraffic.jpg" ],
"metadata": {
"Task": "Click on traffic lights",
"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 с.
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 ]
}
}
| Свойство | Тип | Описание |
|---|---|---|
| answer | Array | Список в булевыми значениями, true - означает, что нужно произвести клик на соответствующее этой позиции изображение |
Как найти все нужные параметры для создания задачи на решение
Вручную
- Откройте ваш сайт, где отображается капча, в браузере.
- Правой кнопкой кликните по элементу капчи и выберите Inspect.
websitekey:
Процесс поиска аналогичен поиску websitekey ReCaptchaV2Task и ReCaptchaV2Enterprise.
imageUrls:
Найдите ссылку в атрибутах элемента:

Также ссылку цельного изображения можно получить, просто кликнув правой кнопкой мыши по изображению и выбрать Открыть изображение в новой вкладке. После этого ссылку можно скопировать прямо из адресной строки браузера.

Task (внутри metadata)
Описание задания. Кликните правой кнопкой мыши на текст задания и в Инструментах разработчика найдите соответствующий элемент в структуре страницы:

Автоматически
Для автоматизации поиска параметров их можно извлекать через браузер (обычный или headless, например, с Playwright) или напрямую из HTTP-запросов. Поскольку значения динамических параметров действуют недолго, их рекомендуется использовать сразу после получения.
Приведённые фрагменты кода являются базовыми примерами для ознакомления в извлечении необходимых параметров. Точная реализация будет зависеть от вашего сайта с капчей, его структуры и используемых HTML-элементов и селекторов.
- JavaScript
- Python
- C#
Показать код (для браузера)
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 = 'Unknown';
}
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("Не найден iframe с чекбоксом reCAPTCHA");
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("Не найден iframe с заданием reCAPTCHA");
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 = "Unknown";
}
console.log(`Размер сетки: ${gridSize}`);
await browser.close();
}
extractCaptchaInfo();
Показать код
import asyncio
from playwright.async_api import async_playwright
async def extract_captcha_info():
async with async_playwright() as p:
browser = await p.chromium.launch(headless=False)
page = await browser.new_page()
await page.goto("https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high")
# Поиск iframe с чекбоксом
checkbox_frame = next((f for f in page.frames if "api2/anchor" in f.url), None)
if not checkbox_frame:
print("Не найден iframe с чекбоксом reCAPTCHA")
await browser.close()
return
checkbox = await checkbox_frame.wait_for_selector("#recaptcha-anchor", timeout=5000)
await checkbox.click()
await page.wait_for_timeout(1000)
# Поиск фрейма с заданием
challenge_frame = next((f for f in page.frames if "api2/bframe" in f.url), None)
if not challenge_frame:
print("Не найден iframe с заданием reCAPTCHA")
await browser.close()
return
# Изображение: ищем с классами rc-image-tile-33 или rc-image-tile-44
img = await challenge_frame.query_selector("img.rc-image-tile-33") or await challenge_frame.query_selector("img.rc-image-tile-44")
src = await img.get_attribute("src") if img else None
print("Изображение:", src)
# Задание
try:
await challenge_frame.wait_for_selector(".rc-imageselect-desc-no-canonical, .rc-imageselect-desc", timeout=5000)
task_text = await challenge_frame.eval_on_selector(
".rc-imageselect-desc-no-canonical, .rc-imageselect-desc",
"el => el.querySelector('strong')?.textContent?.trim() || 'Не найдено'"
)
print("Задание: выбрать все изображения с:", task_text)
except:
print("Описание задания не найдено.")
# Размер сетки
tiles = await challenge_frame.query_selector_all(".rc-imageselect-tile")
visible_count = 0
for tile in tiles:
if await tile.is_visible():
visible_count += 1
if visible_count == 9:
grid = "3x3"
elif visible_count == 16:
grid = "4x4"
elif visible_count == 25:
grid = "5x5"
else:
grid = "Unknown"
print("Размер сетки:", grid)
await browser.close()
asyncio.run(extract_captcha_info())
Показать код
using System;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Playwright;
class Program
{
public static async Task Main()
{
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new() { Headless = false });
var page = await browser.NewPageAsync();
await page.GotoAsync("https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=high");
var checkboxFrame = page.Frames.FirstOrDefault(f => f.Url.Contains("api2/anchor"));
if (checkboxFrame == null)
{
Console.WriteLine("Не найден iframe с чекбоксом reCAPTCHA");
await browser.CloseAsync();
return;
}
var checkbox = await checkboxFrame.WaitForSelectorAsync("#recaptcha-anchor");
await checkbox.ClickAsync();
await page.WaitForTimeoutAsync(1000);
var challengeFrame = page.Frames.FirstOrDefault(f => f.Url.Contains("api2/bframe"));
if (challengeFrame == null)
{
Console.WriteLine("Не найден iframe с заданием reCAPTCHA");
await browser.CloseAsync();
return;
}
// Ищем изображение с классами rc-image-tile-33 или rc-image-tile-44
var img = await challengeFrame.QuerySelectorAsync("img.rc-image-tile-33") ?? await challengeFrame.QuerySelectorAsync("img.rc-image-tile-44");
var src = img != null ? await img.GetAttributeAsync("src") : null;
Console.WriteLine("Изображение: " + src);
try
{
await challengeFrame.WaitForSelectorAsync(".rc-imageselect-desc-no-canonical, .rc-imageselect-desc");
var taskText = await challengeFrame.EvalOnSelectorAsync<string>(
".rc-imageselect-desc-no-canonical, .rc-imageselect-desc",
@"el => {
const strong = el.querySelector('strong');
return strong ? strong.textContent.trim() : 'Не найдено';
}");
Console.WriteLine("Задание: выбрать все изображения с: " + taskText);
}
catch
{
Console.WriteLine("Описание задания не найдено.");
}
var tiles = await challengeFrame.QuerySelectorAllAsync(".rc-imageselect-tile");
int visibleCount = 0;
foreach (var tile in tiles)
{
if (await tile.IsVisibleAsync())
visibleCount++;
}
string gridSize = visibleCount switch
{
9 => "3x3",
16 => "4x4",
25 => "5x5",
_ => "Unknown"
};
Console.WriteLine("Размер сетки: " + gridSize);
await browser.CloseAsync();
}
}
Используйте библиотеку SDK
- JavaScript
- Python
- C#
Показать код (для браузера)
// https://github.com/ZennoLab/capmonstercloud-client-js
import { CapMonsterCloudClientFactory, ClientOptions, ComplexImageRecaptchaRequest } from '@zennolab_com/capmonstercloud-client';
document.addEventListener('DOMContentLoaded', async () => {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_API_KEY' }) // Укажите ваш API-ключ CapMonster Cloud
);
// При необходимости можно проверить баланс
const balance = await cmcClient.getBalance();
console.log("Balance:", balance);
const complexImageRecaptchaRequest = new ComplexImageRecaptchaRequest({
imageUrls: ['https://i.postimg.cc/yYjg75Kv/payloadtraffic.jpg'], // Замените на реальные значения
metaData: {
Grid: '3x3',
Task: 'Please click each image containing a mountain',
TaskDefinition: '/m/015qff'
},
websiteURL: 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=middle' // URL страницы с капчей
});
const result = await cmcClient.Solve(complexImageRecaptchaRequest);
console.log("Solution:", result);
});
Показать код (Node.js)
// https://github.com/ZennoLab/capmonstercloud-client-js
import { CapMonsterCloudClientFactory, ClientOptions, ComplexImageRecaptchaRequest } from '@zennolab_com/capmonstercloud-client';
const API_KEY = "YOUR_API_KEY"; // Укажите ваш API-ключ CapMonster Cloud
async function solveComplexImageRecaptcha() {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);
// При необходимости можно проверить баланс
const balance = await cmcClient.getBalance();
console.log("Balance:", balance);
const complexImageRecaptchaRequest = new ComplexImageRecaptchaRequest({
imageUrls: ['https://i.postimg.cc/yYjg75Kv/payloadtraffic.jpg'], // Замените на реальные значения
metaData: {
Grid: '3x3',
Task: 'Please click each image containing a mountain',
TaskDefinition: '/m/015qff'
},
websiteURL: 'https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=middle' // URL страницы с капчей
});
const result = await cmcClient.Solve(complexImageRecaptchaRequest);
console.log("Solution:", result);
}
solveComplexImageRecaptcha().catch(console.error);
Показать код
# https://github.com/ZennoLab/capmonstercloud-client-python
import asyncio
from capmonstercloudclient import CapMonsterClient, ClientOptions
from capmonstercloudclient.requests import RecaptchaComplexImageTaskRequest
# Укажите ваш API-ключ CapMonster Cloud
client_options = ClientOptions(api_key="YOUR_API_KEY")
cap_monster_client = CapMonsterClient(options=client_options)
complex_image_recaptcha_request = RecaptchaComplexImageTaskRequest(
imagesUrls=["https://i.postimg.cc/yYjg75Kv/payloadtraffic.jpg"], # Замените на реальные значения
metadata={
"Task": "Click on traffic lights",
"Grid": "3x3",
"TaskDefinition": "/m/015qff",
"websiteUrl": "https://lessons.zennolab.com/captchas/recaptcha/v2_simple.php?level=middle" # URL страницы с капчей
}
)
async def solve_captcha():
# При необходимости можно проверить баланс
balance = await cap_monster_client.get_balance()
print("Balance:", balance)
solution = await cap_monster_client.solve_captcha(complex_image_recaptcha_request)
return solution
responses = asyncio.run(solve_captcha())
print("Solution:", responses)
Показать код
// https://github.com/ZennoLab/capmonstercloud-client-dotnet
using System;
using System.Threading.Tasks;
using Zennolab.CapMonsterCloud.Requests;
using Zennolab.CapMonsterCloud;
class Program
{
static async Task Main(string[] args)
{
var clientOptions = new ClientOptions
{
ClientKey = "YOUR_API_KEY" // Укажите ваш API-ключ CapMonster Cloud
};
var cmCloudClient = CapMonsterCloudClientFactory.Create(clientOptions);
// При необходимости можно проверить баланс
var balance = await cmCloudClient.GetBalanceAsync();
Console.WriteLine("Balance: " + balance);
var complexImageRecaptchaRequest = new RecaptchaComplexImageTaskRequest
{
ImageUrls = new[] { "https://i.postimg.cc/yYjg75Kv/payloadtraffic.jpg" }, // Замените на реальные значения
Metadata = new RecaptchaComplexImageTaskRequest.RecaptchaMetadata
{
Task = "Click on traffic lights",
Grid = RecaptchaComplexImageTaskRequest.RecaptchaMetadata.GridSize.Grid3x3,
TaskDefinition = "/m/015qff"
}
};
var complexImageRecaptchaResult = await cmCloudClient.SolveAsync(complexImageRecaptchaRequest);
Console.WriteLine("Captcha Solution: " + string.Join(", ", complexImageRecaptchaResult.Solution.Answer));
}
}
