Pular para o conteúdo principal
Está tendo problemas para obter o token?
Entre em contato com o suporte

Hunt Captcha

O Hunt CAPTCHA é um sistema antibot que analisa o comportamento do usuário e inicia uma verificação interativa ao detectar atividades suspeitas.

Exemplos de tarefas

Abaixo estão alguns exemplos de variantes do Hunt CAPTCHA compatíveis com o CapMonster Cloud:

Puzzle CAPTCHA
Click CAPTCHA
Checkbox CAPTCHA

O CapMonster Cloud oferece suporte a:

  • geração de X-HD;
  • resolução do CAPTCHA por meio de meta.token;
  • resolução do CAPTCHA por meio de widgetUrl.
Atenção:

Para executar esta tarefa, utilize seus próprios proxies.

Escolha do cenário

CenárioParâmetros em metadataResultado
Geração de X-HDapiGetLibX-HD
Resolução por meio de meta.tokenapiGetLib, dataToken de resolução do CAPTCHA
Resolução por meio de widgetUrlapiGetLib, widgetUrlToken de resolução do CAPTCHA

Use widgetUrl quando o link completo do widget estiver disponível na página. Nesse cenário, não é necessário obter o X-HD nem o meta.token.

Se widgetUrl não estiver disponível, primeiro gere o X-HD, obtenha o meta.token do site e depois crie uma tarefa com o parâmetro data (consulte a seção Exemplo de resolução do Hunt CAPTCHA por meio de data).

Parâmetros da solicitação


IMPORTANTE: os valores de alguns parâmetros são dinâmicos — eles mudam sempre que a página com o Hunt é renderizada.
Extraia-os imediatamente antes de criar a tarefa para evitar erros durante a resolução. Para ver exemplos de extração automática dos parâmetros, consulte as seções Como obter o widgetUrl e Exemplo de resolução do Hunt CAPTCHA por meio de data.


type<string>required

CustomTask


class<string>required

HUNT


websiteURL<string>required

URL completo da página em que o Hunt CAPTCHA é usado.


apiGetLib (dentro de metadata)<string>required

Link completo para o arquivo api.js.

Exemplo:

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

Localize a solicitação para api.js no DevTools, na guia Network. Use hd-api ou api.js na busca.


data (dentro de metadata)<string>optional

Valor de meta.token obtido do site.

Importante: envie esse parâmetro somente ao resolver o CAPTCHA por meio de meta.token. Não o use junto com widgetUrl.


widgetUrl (dentro de metadata)<string>optional

URL completo do widget do Hunt CAPTCHA.

Exemplo:

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

Importante: envie o link completo, incluindo domínio, caminho e parâmetros da solicitação. Não o use junto com data.


userAgent<string>optional

User-Agent do navegador. Use o valor atual compatível com o CapMonster Cloud: userAgentPlaceholder

Você pode obter o valor mais recente em: https://capmonster.cloud/api/useragent/actual.


proxyType<string>required

http - proxy HTTP/HTTPS normal;
https - use se http não funcionar (necessário para alguns proxies personalizados);
socks4 - proxy SOCKS4;
socks5 - proxy SOCKS5.


proxyAddress<string>required

Endereço IP do proxy (IPv4/IPv6). Não permitido:

  • Proxies transparentes
  • Proxies da máquina local


proxyPort<integer>required

Porta do proxy.


proxyLogin<string>required

Login do proxy.


proxyPassword<string>required

Senha do proxy.

Criar método de tarefa

Use o método createTask:

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

Geração de X-HD

Envie somente apiGetLib dentro de metadata.

Exemplo de solicitação

{
"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"
}
}

Exemplo de resposta

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

Resolução por meio de meta.token

Use este cenário se o parâmetro widgetUrl não estiver disponível.

Etapa 1. Obtenha o X-HD

  1. Crie uma tarefa enviando apenas apiGetLib.
  2. Obtenha o X-HD na resposta de getTaskResult.

Etapa 2. Obtenha o meta.token

Envie o X-HD obtido em uma solicitação ao site de destino, por exemplo, ao solicitar um código por SMS.

Se o site exigir a verificação CAPTCHA, ele retornará uma resposta semelhante a esta:

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

Etapa 3. Resolva a CAPTCHA

Crie uma nova tarefa e envie:

  • apiGetLib;
  • o meta.token obtido no parâmetro data.

Exemplo de solicitação

{
"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"
}
}

Exemplo de resposta

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

Resolução por meio de widgetUrl

Use este cenário quando o link completo do widget do Hunt CAPTCHA estiver disponível na página.

Não é necessário obter o X-HD nem o meta.token.

Como obter o widgetUrl

  1. Abra a página com o Hunt CAPTCHA.
  2. Abra o DevTools e acesse a guia Network.
  3. Execute a ação que faz o CAPTCHA aparecer.
  4. Localize a solicitação usando os termos widget ou hash.
  5. Copie o valor completo de Request URL.
  6. Envie-o em widgetUrl (dentro de metadata).


Importante:

Obtenha o widgetUrl atual na mesma sessão, imediatamente antes de criar a tarefa.

Não envie apenas o valor de hash: o serviço precisa do URL completo.

Exemplo de solicitação

{
"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"
}
}

Exemplo de resposta

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

Obter resultado da tarefa

Use o método getTaskResult para obter o fingerprint X-HD ou a solução do Hunt CAPTCHA:

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

Exemplo de solicitação

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

Exemplo de resposta

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

O valor de solution.data.token depende do cenário:

  • ao gerar o X-HD, contém o X-HD;
  • ao resolver por meio de data, contém o token de resolução do CAPTCHA;
  • ao resolver por meio de widgetUrl, contém o token de resolução do CAPTCHA.

Como trabalhar com cookies

Importante:

O site de destino pode usar cookies específicos para gerenciar a sessão. Se eles estiverem ausentes ou não forem enviados nas solicitações, o servidor poderá rejeitar a solicitação ou exigir uma nova verificação.

Exemplo de cookies obtidos do site:

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

Princípio geral de funcionamento com cookies:

  1. Primeiro, abra a página do site ou envie uma solicitação GET para a página necessária. Isso permite que o servidor inicialize a sessão do usuário e defina os cookies necessários.

  2. Na resposta, o servidor envia os cookies por meio do cabeçalho Set-Cookie. Esses cookies podem conter o identificador da sessão, parâmetros de segurança e dados da proteção antibot.

  3. Salve os cookies recebidos, pois eles serão usados para identificar o cliente nas solicitações seguintes.

  4. Ao enviar solicitações posteriores à API, devolva os cookies ao servidor no cabeçalho Cookie, para que ele reconheça que a solicitação pertence à mesma sessão.

  5. Todas as solicitações devem ser feitas na mesma sessão, com o mesmo IP (ou proxy) e User-Agent. Caso contrário, o servidor poderá considerar a solicitação suspeita e exigir uma nova verificação.

  6. Alguns cookies podem ser criados no lado do cliente, por exemplo, pelo JavaScript da página. Durante a automação ou os testes, pode ser necessário extrair esses cookies do navegador ou gerá-los de forma semelhante.

Exemplo de resolução do Hunt CAPTCHA por meio de data

Abaixo está um exemplo completo de resolução usando X-HD e meta.token. Use-o quando widgetUrl não estiver disponível.

O código mostra como:

  • obter os cookies iniciais ao abrir a página do site;
  • gerar cookies adicionais que podem ser criados no lado do cliente;
  • criar, por meio do CapMonster Cloud, um fingerprint (X-HD) usado pelo site para verificar as solicitações;
  • enviar uma solicitação à API do site para iniciar uma ação, como o envio de SMS;
  • enviar os dados recebidos ao serviço de resolução de CAPTCHA;
  • depois de obter a solução, enviar a solicitação final à API com os parâmetros necessários.
Importante:

Use cabeçalhos HTTP atualizados (saiba mais na seção sobre cabeçalhos) e um User-Agent correto.

Mostrar código (Node.js)
import { gotScraping } from "got-scraping";
import crypto from "crypto";

/* ================= CONFIG (recomendamos armazenar no .env) ================= */
// Configurações da API do CapMonster Cloud, do site e dados do usuário

const API_KEY = "YOUR_API_KEY"; // Sua chave de API do CapMonster Cloud
const SOLVER_URL = "https://api.capmonster.cloud";

const BASE_URL = "https://example.com"; // URL base do site
const API_GET_LIB =
"https://example.com/hd-api/external/apps/a1047eab1035d58682a53557e0b2a75edbfd15fd/api.js"; // api.js do site

const PHONE = "91123456789"; // Telefone para cadastro (sem o código do país)
const COUNTRY_CODE = "54"; // Código do país

const UA = "userAgentPlaceholder"; // User-Agent para as solicitações

/* ================= Configurações do proxy ================= */

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 ================= */
// Cabeçalhos para solicitações HTTP
// htmlHeaders — para solicitações GET de páginas
// apiHeaders — para a API do site

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 atual do site
"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 ================= */
// Funções auxiliares

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 ================= */
// Criação da tarefa e espera pela solução do CAPTCHA

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 ================= */
// Fluxo principal de cadastro automático com CAPTCHA

(async () => {
try {
// ---------------- STEP 1: Obter cookies ----------------
console.log("STEP 1 — Getting cookies...");

const base = await gotScraping.get(
BASE_URL + "/registration?type=phone_reg", // Substitua pela página de cadastro atual do site
{
headers: htmlHeaders,
proxyUrl: PROXY,
},
);

// Salvar os cookies recebidos do servidor
let cookies = (base.headers["set-cookie"] || [])
.map((c) => c.split(";")[0])
.join("; ");

// Gerar cookies adicionais criados no lado do cliente
const che_g = crypto.randomUUID();
const ggru = randomString();

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

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

// ---------------- STEP 2: Criar o 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: Enviar solicitação de SMS ----------------
console.log("\nSTEP 3 — Trigger SMS...");

const smsResp = await gotScraping.post(
BASE_URL + "/web-api/api/web/registration/v2/sms", // Substitua pelo endpoint atual da API do site
{
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: Resolver o CAPTCHA ----------------
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: Solicitação final ----------------
console.log("\nSTEP 5 — Sending final request...");

const finalResp = await gotScraping.post(
BASE_URL + "/api/web/registration/v2/sms", // Substitua pelo endpoint atual da API do site
{
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);
}
})();