Решатель Popular Captcha
Решайте задачи с взаимодействием с объектами через типы задач PopularCaptchaImage или PopularClassification. Поле questionType определяет способ обработки задачи.
Поддерживаемые режимы
questionType | Описание | Формат ответа |
|---|---|---|
objectClassify | Выбрать все подходящие изображения в сетке | boolean[] на изображение |
objectClick | Кликнуть по центру целевого объекта | Координаты {x, y}[] |
objectDrag | Перетащить фрагменты паззла на места | {start, end}[] |
objectTag | Отметить объекты на изображении | Массив меток |
grid | Универсальный выбор по сетке | Булев массив |
bbox | Детекция bounding-box | Координаты |
Создание задачи — Сетка-классификация
/createTask{
"apiKey": "YOUR_API_KEY",
"task": {
"type": "PopularCaptchaImage",
"questionType": "objectClassify",
"question": "Select all objects with a bridge",
"queries": ["BASE64_IMG_1", "BASE64_IMG_2"]
}
}
Ответ
{
"code": 200,
"msg": "",
"answers": [true, false, true, true, false, true],
"questionType": "objectClassify",
"meta": { "pass_report": true, "fail_report": true }
}
Создание задачи — Клик по объекту
{
"apiKey": "YOUR_API_KEY",
"task": {
"type": "PopularCaptchaImage",
"questionType": "objectClick",
"question": "Click on the center of the car",
"queries": ["BASE64_MAIN_IMAGE"]
}
}
Создание задачи — Drag по объекту
{
"apiKey": "YOUR_API_KEY",
"task": {
"type": "PopularCaptchaImage",
"questionType": "objectDrag",
"question": "Drag the puzzle piece to the gap",
"queries": ["BASE64_BACKGROUND"],
"examples": ["BASE64_PUZZLE_PIECE"]
}
}
Параметры задачи
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
type | string | ✅ | PopularCaptchaImage или PopularClassification |
questionType | string | ✅ | objectClassify, objectClick, objectDrag, objectTag, grid, bbox |
question | string | ✅ | Текст инструкции |
queries | string[] | ✅ | Изображения в base64 |
examples | string[] | Только drag | Целевые объекты для drag-задач |
screenshort | boolean | Нет | true, если переданы скриншоты |
Решение видео-капч (Dynamic Canvas)
Некоторые задачи (например, варианты hCaptcha) содержат динамическую анимацию на холсте (canvas) вместо статических изображений. Они решаются с использованием специализированного варианта типа задачи PopularCaptchaImage, требующего захвата/записи холста на стороне клиента (путем объединения нескольких кадров видео в одно изображение или отправки исходного видео).
Чтобы избежать записи и обработки видео при каждом вызове, настоятельно рекомендуется реализовать механизм кэширования на стороне клиента, сопоставляющий целевой вопрос с разрешенной конфигурацией холста.
Стратегия Кэширования (на стороне клиента)
- Нормализация Омографов (Homoglyph Normalization): Очищайте текст
questionот Unicode-омографов (кириллических/греческих символов, похожих на английские буквы) перед запросом или сохранением в кэш. Это гарантирует, что ключи кэша будут соответствовать алгоритму нормализации на бэкенде. - TTL (Время Жизни): 24 часа.
- Емкость: Максимум 800 записей с вытеснением LRU (Least Recently Used).
- Ключ Кэша:
"nc_video_cache", сопоставляющий нормализованный текст вопроса сcanvasParams.
Процесс Решения (Алгоритм)
Сценарий А: Промах Кэша (Двухфазный Процесс)
sequenceDiagram
participant Client as Клиент
participant Server as Сервер
Note over Client: Шаг 1: Обнаружение задачи
Client->>Server: POST /createTask (Исходный стандартный запрос)
Server-->>Client: 400 Bad Request (questionVariant: "canvasvideo")
Note over Client: Шаг 2: Получение canvasParams и запись в кэш
Note over Client: Шаг 3: Запись видео с холста (например, 2 сек) и слияние кадров
Client->>Server: POST /createTask (Обогащенный запрос фазы 2)
Server-->>Client: 200 OK (Координаты ответов)
- Первоначальный захват: Отправьте стандартный однокадровый запрос в solver API (
/createTask). - Сигнал Бэкенда: Если бэкенд обнаруживает, что этот целевой вопрос требует видео-капчу, он возвращает статус
400иquestionVariant: "canvasvideo"вместе с требуемымиcanvasParams. - Сохранение в Кэш: Сохраните полученные
canvasParamsлокально. - Запись и Объединение Холста:
- Если
canvasParams.videoимеет значениеtrue, запишите видео с холста в течение указанного времени. - Извлеките и объедините/объедините кадры в соответствии с
canvasParams.format.
- Если
- Повторная отправка (Фаза 2): Сформируйте обогащенный запрос, содержащий
canvasVideo: true, объединенный кадр вqueriesи массив base64 записанного видео. Повторно отправьте запрос на бэкенд, чтобы получить успешный ответ200.
Сценарий Б: Попадание в Кэш (Однофазный Процесс)
sequenceDiagram
participant Client as Клиент
participant Server as Сервер
Note over Client: Шаг 1: Запрос к кэшу (поиск по нормализованному вопросу)
Note over Client: Шаг 2: Мгновенная запись холста и слияние кадров
Client->>Server: POST /createTask (Обогащенный запрос сразу)
Server-->>Client: 200 OK (Координаты ответов)
Note over Client: Резервный вариант: если сервер отклонил, инвалидировать кэш и запустить фазу 1
- Проверка Кэша перед отправкой: Выполните запрос к локальному кэшу, используя нормализованный текст вопроса.
- Мгновенная подготовка холста: Если найдена валидная запись в кэше, сразу же начните запись холста и объединение кадров на основе параметров из кэша.
- Однофазная отправка: Отправьте полностью сформированный запрос (объединенный кадр + данные видео) непосредственно при первом обращении.
- Резервный сброс: Если сервер отклонил запрос (например, параметры кэша устарели или изменились на сервере), удалите сохраненную конфигурацию из кэша и выполните стандартный двухфазный процесс.
Структура Данных (Запросы и Ответы)
1. Исходный Запрос (Фаза 1 - Промах Кэша)
Отправляется при первой попытке решить капчу, когда еще неизвестно, требуется ли видео-обработка.
{
"apiKey": "YOUR_API_KEY",
"task": {
"type": "PopularCaptchaImage",
"queries": ["data:image/jpeg;base64,..."],
"examples": ["data:image/jpeg;base64,..."],
"question": "Please click on the living room",
"screenshot": false,
"questionType": "objectClick",
"websiteURL": "example.com",
"websiteKEY": "sitekey-value"
}
}
2. Ответ (Указывает на необходимость Видео-Капчи)
Возвращается сервером, если обнаружен холст с видео.
{
"code": 400,
"msg": "canvasvideo",
"questionVariant": "canvasvideo",
"questionType": "objectClick",
"canvasParams": {
"duration": 2,
"video": true,
"format": ["frameMerge"],
"frames": [0.1, 0.5, 1.0],
"framecount": null
}
}
3. Обогащенный Запрос (Повторная отправка Фазы 2 / Попадание в Кэш)
Содержит объединенное изображение (в queries) и записанное видео холста.
{
"apiKey": "YOUR_API_KEY",
"task": {
"type": "PopularCaptchaImage",
"queries": ["data:image/jpeg;base64,..."], // Результат объединения кадров
"examples": ["data:image/jpeg;base64,..."],
"question": "please click on the living room", // Нормализованный вопрос
"screenshot": false,
"questionType": "objectClick",
"websiteURL": "example.com",
"websiteKEY": "sitekey-value",
"choices": [],
"canvasVideo": true,
"format": "frameMerge", // или "framecount"
"video": ["data:video/mp4;base64,..."] // Base64 записанного видео
}
}
4. Ответ (Успешное Решение)
{
"code": 200,
"status": "ready",
"questionType": "objectClick",
"answers": [
[
{ "x": 109, "y": 179 },
{ "x": 163, "y": 260 }
]
],
"meta": {
"data": "...",
"fail_report": true,
"pass_report": true
}
}
Коды Ошибок
| Код | Ошибка | Описание |
|---|---|---|
| 1 | KEY_DOES_NOT_EXIST | API ключ недействителен или не найден. |
| 2 | NO_SLOT_AVAILABLE | Все слоты решателей заняты. |
| 3 | ZERO_BALANCE | Баланс аккаунта равен нулю. |
| 10 | ERROR_BAD_PARAMETERS | Неверные или отсутствующие поля запроса. |
| 12 | ERROR_CAPTCHA_UNSOLVABLE | Капчу не удалось решить. |
| 14 | PLAN_EXPIRED | Ваш тарифный план истек. |
| 16 | RATE_LIMITED | Слишком много запросов. Снизьте скорость. |
| 17 | DAILY_LIMIT_EXCEEDED | Достигнут дневной лимит использования. |
| 18 | QUOTA_LIMIT_EXCEEDED | Исчерпана квота тарифного плана. |
| 21 | SERVICE_UNAVAILABLE | Бэкенд временно недоступен. |
Примеры Кода
# Шаг 1: Создание задачи
RESPONSE=$(curl -s -X POST "https://api.captchasonic.com/createTask" \
-H "Content-Type: application/json" \
-d '{
"apiKey": "YOUR_API_KEY",
"task": {
"type": "PopularCaptchaImage",
"questionType": "objectClassify",
"question": "Select all objects with a bridge",
"queries": [
"BASE64_IMG_1",
"BASE64_IMG_2"
]
}
}')
echo "Create Task Response: $RESPONSE"
TASK_ID=$(echo $RESPONSE | grep -o '"taskId":"[^"]*"' | cut -d'"' -f4)
# Шаг 2: Ожидание результата
while true; do
RESULT=$(curl -s -X POST "https://api.captchasonic.com/getTaskResult" \
-H "Content-Type: application/json" \
-d "{\"apiKey\": \"YOUR_API_KEY\", \"taskId\": \"$TASK_ID\"}")
echo "Result: $RESULT"
echo "$RESULT" | grep -q '"status":"processing"' || break
sleep 2
done
API Playground
Hit Send to see response
⌘ + Enter