Перейти к основному содержимому
Возникают проблемы с получением токена?
Свяжитесь с поддержкой

Hunt Captcha

Hunt CAPTCHA — антибот-система, которая анализирует поведение пользователя и при обнаружении подозрительной активности запускает интерактивную проверку.

Примеры заданий

Ниже представлены примеры вариантов Hunt CAPTCHA, поддерживаемых CapMonster Cloud:

Puzzle CAPTCHA
Click CAPTCHA
Checkbox CAPTCHA

CapMonster Cloud поддерживает:

  • генерацию X-HD;
  • решение CAPTCHA через meta.token;
  • решение CAPTCHA через widgetUrl.
Внимание:

Для выполнения данной задачи используйте ваши собственные прокси.

Выбор сценария

СценарийПараметры в metadataРезультат
Генерация X-HDapiGetLibX-HD
Решение через meta.tokenapiGetLib, dataТокен решения CAPTCHA
Решение через widgetUrlapiGetLib, widgetUrlТокен решения CAPTCHA

Используйте widgetUrl, если полная ссылка на виджет доступна на странице. В этом сценарии получать X-HD и meta.token не требуется.

Если widgetUrl недоступен, сначала сгенерируйте X-HD, получите от сайта meta.token, а затем создайте задачу с параметром data (см. подробнее в разделе Пример решения Hunt CAPTCHA через data).

Параметры запроса


ВАЖНО: значения некоторых параметров являются динамическими — они меняются при каждом рендеринге страницы с Hunt.
Извлекайте их непосредственно перед созданием задачи, чтобы избежать ошибок при решении. Примеры автоматического извлечения параметров см. в разделах Как получить widgetUrl и Пример решения Hunt CAPTCHA через data .


type<string>required

CustomTask


class<string>required

HUNT


websiteURL<string>required

Полный URL страницы, на которой используется Hunt CAPTCHA.


apiGetLib (внутри metadata)<string>required

Полная ссылка на файл api.js.

Пример:

https://example.com/hd-api/external/apps/<app-hash>/api.js

Найдите запрос к api.js в DevTools на вкладке Network. Для поиска используйте hd-api или api.js.


data (внутри metadata)<string>optional

Значение meta.token, полученное от сайта.

Важно: передавайте только при решении CAPTCHA через meta.token. Не используйте одновременно с widgetUrl.


widgetUrl (внутри metadata)<string>optional

Полный URL виджета Hunt CAPTCHA.

Пример:

https://captcha.example.com/widget?hash=<widget-hash>

Важно: передавайте ссылку целиком, включая домен, путь и параметры запроса. Не используйте одновременно с data.


userAgent<string>optional

User-Agent браузера. Используйте текущее значение, поддерживаемое CapMonster Cloud: userAgentPlaceholder

Получить актуальное значение можно по адресу: https://capmonster.cloud/api/useragent/actual.


proxyType<string>required

http - обычный http/https прокси;
https - попробуйте эту опцию только если "http" не работает (требуется для некоторых кастомных прокси);
socks4 - socks4 прокси;
socks5 - socks5 прокси.


proxyAddress<string>required

IP адрес прокси IPv4/IPv6. Не допускается:

  • использование прозрачных прокси (там где можно видеть IP клиента);
  • использование прокси на локальных машинах.


proxyPort<integer>required

Порт прокси.


proxyLogin<string>required

Логин прокси-сервера.


proxyPassword<string>required

Пароль прокси-сервера.

Метод создания задачи

Используйте метод createTask:

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

Альтернативный адрес метода

Для пользователей из России также доступен:

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

Подробнее в разделе createTask.

Генерация X-HD

Передайте только apiGetLib внутри metadata.

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "HUNT",
"websiteURL": "https://yourwebsite.com/page-with-hunt",
"metadata": {
"apiGetLib": "https://example.com/hd-api/external/apps/<app-hash>/api.js"
},
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}

Пример ответа

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

Решение через meta.token

Используйте этот сценарий, если параметр widgetUrl недоступен.

Шаг 1. Получите X-HD

  1. Создайте задачу, передав только apiGetLib.
  2. Получите X-HD из результата getTaskResult.

Шаг 2. Получите meta.token

Передайте полученный X-HD в запросе к целевому сайту (например, при запросе SMS).

Если сайту требуется прохождение CAPTCHA, он вернёт ответ вида:

{
"errors": [
{
"code": "113",
"title": "Captcha error"
}
],
"meta": {
"token": "SITE_META_TOKEN"
}
}

Шаг 3. Решите CAPTCHA

Создайте новую задачу, передав:

  • apiGetLib;
  • полученный meta.token в параметре data.

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "HUNT",
"websiteURL": "https://example.com/page-with-hunt",
"metadata": {
"apiGetLib": "https://example.com/hd-api/external/apps/<app-hash>/api.js",
"data": "SITE_META_TOKEN"
},
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}

Пример ответа

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

Решение через widgetUrl

Используйте этот сценарий, если на странице доступна полная ссылка на виджет Hunt CAPTCHA.

Получать X-HD и meta.token не требуется.

Как получить widgetUrl

  1. Откройте страницу с Hunt CAPTCHA.
  2. Откройте DevTools и перейдите на вкладку Network.
  3. Выполните действие, после которого появляется CAPTCHA.
  4. Найдите запрос по словам widget или hash.
  5. Скопируйте полное значение Request URL.
  6. Передайте его в widgetUrl (внутри metadata).


Важно:

Получайте актуальный widgetUrl в той же сессии непосредственно перед созданием задачи.

Не передавайте только значение hash: сервису нужен полный URL.

Пример запроса

{
"clientKey": "API_KEY",
"task": {
"type": "CustomTask",
"class": "HUNT",
"websiteURL": "https://example.com/page-with-hunt",
"metadata": {
"apiGetLib": "https://example.com/hd-api/external/apps/<app-hash>/api.js",
"widgetUrl": "https://captcha.example.com/widget?hash=<widget-hash>"
},
"userAgent": "userAgentPlaceholder",
"proxyType": "your-proxy-type",
"proxyAddress": "your-proxy-address",
"proxyPort": 1234,
"proxyLogin": "your-proxy-login",
"proxyPassword": "your-proxy-password"
}
}

Пример ответа

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

Метод получения результата задачи

Используйте метод getTaskResult, чтобы получить fingerprint X-HD или решение Hunt капчи:

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

Альтернативный адрес метода

Для пользователей из России также доступен:

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

Подробнее в разделе getTaskResult.

Пример запроса

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

Пример ответа

{
"errorId": 0,
"status": "ready",
"solution": {
"data": {
"token": "6IyDCCpDdSK...YGs1Wug/z/kLNSpjewI="
}
}
}

Значение solution.data.token зависит от сценария:

  • при генерации X-HD содержит X-HD;
  • при решении через data содержит токен решения CAPTCHA;
  • при решении через widgetUrl содержит токен решения CAPTCHA.

Работа с cookies

Важно:

Целевой сайт может использовать специальные cookies для управления сессией. Если они отсутствуют или не передаются с запросами, сервер может отклонить запрос или потребовать повторную проверку.

Пример cookies, полученных от сайта:

platform_type=desktop; typeBetNames=full; _glhf=1234567890; coefview=0; visit=1-123abc012345d1be726746568edc62d9; fast_coupon=true;
v3fr=1; lng=en; flaglng=en; SESSION=12a3aea8cdcfdbb9e7df8ee99b526a84; auid=ab0dW2mqlz1Tjo2AAwplAg==; ggru=195; che_g=12abcede-691f-c7b2-d1e8-8488bc557d98

Общий принцип работы с cookies:

  1. Сначала необходимо открыть страницу сайта или выполнить GET‑запрос к нужной странице. Это позволяет серверу инициализировать пользовательскую сессию и установить необходимые cookies.

  2. В ответе сервер отправляет cookies через заголовок Set-Cookie. Эти cookies могут содержать идентификатор сессии, параметры безопасности и данные антибот-защиты.

  3. Полученные cookies нужно сохранить, так как они используются для идентификации клиента при дальнейших запросах.

  4. При отправке последующих запросов к API cookies должны передаваться обратно серверу в заголовке Cookie, чтобы сервер понимал, что запрос относится к той же сессии.

  5. Все запросы должны выполняться в рамках одной сессии с тем же IP (или прокси) и User-Agent. В противном случае сервер может считать запрос подозрительным и потребовать повторную проверку.

  6. Иногда часть cookies создаётся на стороне клиента (например, JavaScript на странице). При автоматизации или тестировании иногда необходимо извлекать cookies из браузера или генерировать их аналогичным образом.

Пример решения Hunt CAPTCHA через data

Ниже приведён полный пример решения через X-HD и meta.token. Используйте его, если widgetUrl недоступен.

В коде показано, как:

  • получить начальные cookies при открытии страницы сайта;
  • сгенерировать дополнительные cookies, которые могут создаваться на стороне клиента;
  • через CapMonster Cloud создать fingerprint (X-HD), используемый сайтом для проверки запросов;
  • отправить запрос к API сайта для инициирования действия (например, отправки SMS);
  • передать полученные данные в сервис решения капчи;
  • после получения решения выполнить финальный запрос к API с необходимыми параметрами.
Важно:

Используйте актуальные HTTP‑заголовки (подробнее о заголовках в данном разделе) и корректный User-Agent.

Показать код (Node.js)
import { gotScraping } from "got-scraping";
import crypto from "crypto";

/* ================= CONFIG (рекомендуем сохранять в .env) ================= */
// Настройки API CapMonster Cloud, сайта и пользовательские данные

const API_KEY = "YOUR_API_KEY"; // Ваш API ключ CapMonster Cloud
const SOLVER_URL = "https://api.capmonster.cloud";

const BASE_URL = "https://example.com"; // Базовый URL сайта
const API_GET_LIB =
"https://example.com/hd-api/external/apps/a1047eab1035d58682a53557e0b2a75edbfd15fd/api.js"; // api.js сайта

const PHONE = "91123456789"; // Телефон для регистрации (без кода страны)
const COUNTRY_CODE = "54"; // Код страны

const UA = "userAgentPlaceholder"; // User-Agent для запросов

/* ================= Настройки прокси ================= */

const PROXY_HOST = "proxyAddress";
const PROXY_PORT = 8080;
const PROXY_USER = "proxyLogin";
const PROXY_PASS = "proxyPassword";

const PROXY = `http://${PROXY_USER}:${PROXY_PASS}@${PROXY_HOST}:${PROXY_PORT}`;

/* ================= HEADERS ================= */
// Заголовки для HTTP-запросов
// htmlHeaders — для GET страниц
// apiHeaders — для API сайта

const htmlHeaders = {
accept:
"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US,en;q=0.9,ru;q=0.8",
"cache-control": "no-cache",
pragma: "no-cache",
priority: "u=0, i",
"sec-ch-ua": `"Not:A-Brand";v="99", "Google Chrome";v="150", "Chromium";v="150"`,
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": `"Windows"`,
"sec-fetch-dest": "document",
"sec-fetch-mode": "navigate",
"sec-fetch-site": "none",
"sec-fetch-user": "?1",
"upgrade-insecure-requests": "1",
"user-agent": UA,
};

const apiHeaders = {
accept: "application/vnd.api+json",
"accept-encoding": "gzip, deflate, br, zstd",
"accept-language": "en-US,en;q=0.9,ru;q=0.8",
"cache-control": "no-cache",
pragma: "no-cache",
priority: "u=1, i",
"content-type": "application/vnd.api+json",
origin: BASE_URL,
referer: BASE_URL + "/", // Актуальный referer с сайта
"sec-ch-ua": `"Not:A-Brand";v="99", "Google Chrome";v="150", "Chromium";v="150"`,
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": `"Windows"`,
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"user-agent": UA,
"x-requested-with": "XMLHttpRequest",
};

/* ================= UTILS ================= */
// Вспомогательные функции

const delay = (ms) => new Promise((r) => setTimeout(r, ms));

function randomString(len = 20) {
const chars =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
let result = "";
for (let i = 0; i < len; i++) {
result += chars[Math.floor(Math.random() * chars.length)];
}
return result;
}

/* ================= CAPMONSTER CLOUD ================= */
// Создание задачи и ожидание решения капчи

async function createTask(task) {
const { body } = await gotScraping.post(`${SOLVER_URL}/createTask`, {
json: { clientKey: API_KEY, task },
responseType: "json",
});

if (body.errorId !== 0)
throw new Error("createTask error: " + JSON.stringify(body));

return body.taskId;
}

async function waitResult(taskId) {
while (true) {
const { body } = await gotScraping.post(`${SOLVER_URL}/getTaskResult`, {
json: { clientKey: API_KEY, taskId },
responseType: "json",
});

if (body.status === "ready")
return body.solution?.token || body.solution?.data?.token;

await delay(3000);
}
}

/* ================= MAIN FLOW ================= */
// Основной процесс автоматической регистрации с капчей

(async () => {
try {
// ---------------- STEP 1: Получаем cookies ----------------
console.log("STEP 1 — Getting cookies...");

const base = await gotScraping.get(
BASE_URL + "/registration?type=phone_reg", // Замените на актуальную страницу регистрации с сайта
{
headers: htmlHeaders,
proxyUrl: PROXY,
},
);

// Сохраняем cookies, полученные от сервера
let cookies = (base.headers["set-cookie"] || [])
.map((c) => c.split(";")[0])
.join("; ");

// Генерируем дополнительные cookies, которые создаются на стороне клиента
const che_g = crypto.randomUUID();
const ggru = randomString();

cookies += `; che_g=${che_g}`;
cookies += `; ggru=${ggru}`;

console.log("Cookies:", cookies);

// ---------------- STEP 2: Создаем fingerprint ----------------
console.log("\nSTEP 2 — Creating fingerprint...");

const fingerprintTaskId = await createTask({
type: "CustomTask",
class: "HUNT",
websiteURL: BASE_URL + "/",
userAgent: UA,
metadata: { apiGetLib: API_GET_LIB },
proxyType: "http",
proxyAddress: PROXY_HOST,
proxyPort: PROXY_PORT,
proxyLogin: PROXY_USER,
proxyPassword: PROXY_PASS,
});

const xhd = await waitResult(fingerprintTaskId);
console.log("X-HD:", xhd);

// ---------------- STEP 3: Отправляем запрос на SMS ----------------
console.log("\nSTEP 3 — Trigger SMS...");

const smsResp = await gotScraping.post(
BASE_URL + "/web-api/api/web/registration/v2/sms", // Замените на актуальный API endpoint с сайта
{
headers: { ...apiHeaders, cookie: cookies, "x-hd": xhd },
json: {
data: { attributes: { phone: PHONE, country_code: COUNTRY_CODE } },
},
proxyUrl: PROXY,
responseType: "json",
},
);

const metaToken = smsResp.body?.meta?.token;
if (!metaToken) {
console.log("SMS response:", smsResp.body);
throw new Error("meta.token not received");
}

console.log("meta.token:", metaToken);

// ---------------- STEP 4: Решаем капчу ----------------
console.log("\nSTEP 4 — Solving Hunt captcha...");

const solveTaskId = await createTask({
type: "CustomTask",
class: "HUNT",
websiteURL: BASE_URL + "/",
userAgent: UA,
metadata: { apiGetLib: API_GET_LIB, data: metaToken },
proxyType: "http",
proxyAddress: PROXY_HOST,
proxyPort: PROXY_PORT,
proxyLogin: PROXY_USER,
proxyPassword: PROXY_PASS,
});

const captchaToken = await waitResult(solveTaskId);
console.log("Captcha token:", captchaToken);

// ---------------- STEP 5: Финальный запрос ----------------
console.log("\nSTEP 5 — Sending final request...");

const finalResp = await gotScraping.post(
BASE_URL + "/api/web/registration/v2/sms", // Замените на актуальный API endpoint с сайта
{
headers: { ...apiHeaders, cookie: cookies, "x-hd": xhd },
body: JSON.stringify({
data: {
attributes: {
phone: PHONE,
country_code: parseInt(COUNTRY_CODE),
captcha: captchaToken,
},
},
}),
proxyUrl: PROXY,
},
);

console.log("\nFINAL RESPONSE HEADERS:", finalResp.headers);
console.log("\nFINAL RESPONSE BODY:", finalResp.body);
} catch (err) {
console.error("\nFATAL ERROR:");
console.error(err);
}
})();