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

Cloudflare Challenge

Mais sobre o tema em nosso blog
Mais sobre o tema em nosso blog
Importante:

O CapMonster Cloud pode retornar o resultado da solução como um token ou como um cookie cf_clearance. Antes de começar, analise ambas as opções e escolha a que melhor se adapta ao seu caso de uso.

Parâmetros da solicitação

Opção 1. Challenge (token)

Atenção!
  • O CapMonster Cloud, por padrão, funciona com proxies integrados — já incluídos no custo do serviço. É necessário especificar seus próprios proxies apenas nos casos em que o site não aceita o token ou quando o acesso aos serviços integrados está restrito.

  • Se o proxy utiliza autenticação por IP, é necessário adicionar o endereço 65.21.190.34 à lista de permissões (whitelist).

  • Após resolver, você receberá um token para confirmar a conclusão do captcha.

type<string>required

TurnstileTask


websiteURL<string>required

A URL da página onde o captcha será resolvido


websiteKey<string>required

Chave do site Turnstile


cloudflareTaskType<string>required

token


pageAction<string>required

O campo action encontrado na função de callback. Se estiver usando cloudflareTaskType, action geralmente é “managed” ou “non-interactive”.


userAgent<string>required

User-Agent do navegador.
Transmita apenas o UA atual do sistema operacional Windows. No momento, o válido é: userAgentPlaceholder


data<string>required

O valor do campo data, obtido de cData.


pageData<string>required

O valor de pageData, obtido de chlPageData.


apiJsUrl<string>optional

String contendo a URL do script do captcha.


proxyType<string>optional

http - proxy http/https comum;
https - tente esta opção apenas se "http" não funcionar (necessário para alguns proxies personalizados);
socks4 - proxy socks4;
socks5 - proxy socks5.


proxyAddress<string>optional

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

  • uso de proxies transparentes (que revelem o IP do cliente);
  • uso de proxies em máquinas locais.


proxyPort<integer>optional

Porta do proxy.


proxyLogin<string>optional

Login do servidor proxy.


proxyPassword<string>optional

Senha do servidor proxy.


Estes parâmetros estão no objeto passado para window.turnstile.render(el, paramsObj) ao criar o captcha. Você pode obtê-los, por exemplo, executando JavaScript antes de carregar outros scripts:

(function () {
const obj = {
render: function () {
const { action, cData, chlPageData } = arguments[1];
const params = [
["action", action],
["data", cData],
["pageData", chlPageData],
];
console.table(params)
}
};

Object.defineProperty(window, "turnstile", {
get: () => {
return obj;
},
});
})();

Quando window.turnstile.render(el, paramsObj) é chamado, o captcha é carregado na página e, após a resolução bem-sucedida, a função callback retorna as informações da solução.

window.turnstile.render(el, paramsObj):

  • el: Elemento DOM onde o captcha será inserido.
  • paramsObj: Objeto contendo informações do captcha e instruções de resolução. Geralmente inclui sitekey, action, cData, chlPageData, callback.
  • callback: Função chamada após o captcha ser resolvido com sucesso.

Atenção!
  • Use seus próprios proxies para esta tarefa.

  • Após resolver, você receberá cookies especiais para adicionar ao navegador.

Parâmetros da Requisição

type<string>required

TurnstileTask


websiteURL<string>required

A URL da página onde o captcha será resolvido


websiteKey<string>required

Chave do site Turnstile (qualquer string é aceita)


cloudflareTaskType<string>required

cf_clearance


htmlPageBase64<string>required

Página HTML codificada em Base64 do "Just a moment" exibido com resposta 403.
Exemplo para obter htmlPageBase64:

var htmlContent = document.documentElement.outerHTML;
var htmlBase64 = btoa(unescape(encodeURIComponent(htmlContent)));
console.log(htmlBase64);

userAgent<string>required

User-Agent do navegador.
Forneça apenas o UA do Windows atual: userAgentPlaceholder


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.


Método de criação da tarefa

Opção 1. Challenge (token)

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

Solicitação

{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://example.com",
"websiteKey": "0x4AAAAAAADnPIDROrmt1Wwj",
"cloudflareTaskType": "token",
"userAgent": "userAgentPlaceholder",
"pageAction": "managed",
"pageData": "HUHDWUHuhuwfiweh32..uh2uhuhyugYUG=",
"data": "874291f4retD1366"
}
}

Resposta

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

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

Requisição

{
"clientKey":"API_KEY",
"task": {
"type":"TurnstileTask",
"websiteURL":"https://example.com",
"websiteKey":"xxxxxxxxxx",
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": "PCFET0NUWVBFIGh0...vYm9keT48L2h0bWw+",
"userAgent": "userAgentPlaceholder",
"proxyType":"http",
"proxyAddress":"8.8.8.8",
"proxyPort":8080,
"proxyLogin":"proxyLoginHere",
"proxyPassword":"proxyPasswordHere"
}
}

Resposta

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

Método de obter resultado da tarefa

Opção 1. Challenge (token)

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

Solicitação

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

Resposta

{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "userAgentPlaceholder",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}

Use o método getTaskResult para obter a solução do Challenge. Dependendo da carga do sistema, a resposta pode levar entre 5 e 20 segundos.

PropriedadeTipoDescrição
tokenStringUse este token ao chamar a função de callback
POST
https://api.capmonster.cloud/getTaskResult

Solicitação

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

Resposta

{
"errorId": 0,
"status": "ready",
"solution": {
"cf_clearance": "1tarGvbY2_ZhQdYxpSBloao.FoOn9VtcJtmb_IQ_hCE-1761217338-1.2.1.1-vyVPoLYIGX0VCJomVuLjF7n0kdM0PXaPjpDsRcohxGr7hb2CE7WfcHpmQZ70goqEjdWxPsDhSVaKNTz9opxWguiNdWEEq_.SceWXIqfP7tnEb69f3bP0mixNqcWy_5P_9INpoAEqr1k7aYU0r45PT4gPr5pwHxedVySyLRdoBXIJasdTE52YOQ3NPdGWTwQ_3h2n_wYqqIvf0kCSAvimRrmsgZxomlyejwqPI6ZHi.w"
}
}
PropriedadeTipoDescrição
cf_clearanceStringCookies especiais do Cloudflare que você pode definir no seu navegador

Como diferenciar Challenge do Turnstile

Diferenças entre Challenge e Turnstile

Os tipos de verificação da Cloudflare podem aparecer de formas diferentes.

Turnstile padrão:

Variantes estilizadas:

O Challenge está integrado de forma orgânica no próprio site.

Parece um Turnstile comum, mas na verdade é um Challenge.

Para ter certeza absoluta da presença de um Challenge, você pode abrir as ferramentas de desenvolvedor, analisar o tráfego, estudar o código da página e observar os sinais característicos:

  • A primeira requisição ao site retorna status 403:

  • O formulário com id challenge-form possui atributo action (não confundir com o action do Turnstile captcha) contendo o parâmetro __cf_chl_f_tk=:

  • A página contém duas tags <script> similares que criam novos valores no objeto window:


Como encontrar todos os parâmetros necessários para a criação da tarefa

Automaticamente

Para automatizar a extração dos parâmetros, eles podem ser obtidos via navegador (normal ou headless, por exemplo, usando Playwright) ou diretamente a partir de requisições HTTP. Como os valores dos parâmetros dinâmicos têm curta duração, recomenda-se utilizá-los imediatamente após a extração.

Importante!

Os trechos de código fornecidos são exemplos básicos para aprendizado sobre como extrair os parâmetros necessários. A implementação exata dependerá do seu site com captcha, sua estrutura e os elementos HTML e seletores utilizados.

Para a Opção 1: Challenge (token) – Node.js
import { chromium } from "playwright";

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();

let params = null;

try {
while (!params) {
await page.goto("https://example.com");

await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
const p = {
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent,
};
window.params = p;
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});

params = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.params || null), 5000);
});
});

if (!params) {
await page.waitForTimeout(3000);
}
}

console.log("Parâmetros Turnstile:", params);
} finally {
await browser.close();
}
})();
Para a Opção 2: Challenge (cookie cf_clearance) – Node.js
import { chromium } from "playwright";
import { Buffer } from "buffer";

(async () => {
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();

let websiteKey = null;

while (!websiteKey) {
await page.goto("https://example.com");

await page.evaluate(() => {
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === "render") {
return function (a, b) {
window.websiteKey = b.sitekey;
return target.render.apply(this, arguments);
};
}
return target[prop];
},
});
});

websiteKey = await page.evaluate(() => {
return new Promise((resolve) => {
setTimeout(() => resolve(window.websiteKey || null), 5000);
});
});

if (!websiteKey) {
await page.waitForTimeout(3000);
}
}

const html = await page.content();
const htmlPageBase64 = Buffer.from(html).toString("base64");

const result = {
websiteKey,
htmlPageBase64,
};

console.log(result);

await browser.close();
})();

Exemplo de implementação usando Selenium no Node.js

Mostrar código
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');

(async function example() {
const options = new chrome.Options();
options.addArguments('--auto-open-devtools-for-tabs')

const driver = new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();

try {
driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
let p = {
type: "TurnstileTask",
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
}

console.log(JSON.stringify(p))
window.params = p;
window.turnstileCallback = b.callback;
return target.render.apply(this, arguments);
}
}
return target[prop];
}
});
`)

driver.get('SITE WITH CAPTCHA');

const params = await driver.executeScript(`
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(window.params)
}, 2000)
})
`);

if (params) {
const data = {
clientKey: 'API KEY',
task: {
type: 'TurnstileTask',
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
data: params.data,
action: params.action
}
}

const createResult = await fetch('https://api.capmonster.cloud/createTask', {
method: 'post',
body: JSON.stringify(data)
});

const createTaskResult = await createResult.json()

if (createTaskResult.taskId) {
const asyncDelay = (timeout) =>
new Promise(resolve => {
setTimeout(() => {
resolve();
}, timeout);
});

const getTaskResult = async (taskId) => {
const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
method: 'post',
body: JSON.stringify({
"clientKey":"API KEY",
"taskId": createTaskResult.taskId
})
});
const taskResponse = await taskResult.json();
if (taskResponse.status === 'processing') {
await asyncDelay(5000);
return await getTaskResult(taskId)
}
return taskResponse;
}

const taskRes = await getTaskResult(createTaskResult.taskId)

if (taskRes.solution) {
await driver.executeScript(`
window.turnstileCallback(${taskRes.solution.token});
`);
}
}

}

//FAÇA ALGO
} finally {
await driver.quit();
}
})();

Usar biblioteca SDK

Opção 1: Challenge (token)
// https://github.com/ZennoLab/capmonstercloud-client-js

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

const API_KEY = "YOUR_API_KEY"; // Insira sua chave de API do CapMonster Cloud

document.addEventListener("DOMContentLoaded", async () => {
const client = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: API_KEY })
);

// Exemplo básico sem proxy
// O CapMonster Cloud usa automaticamente seus próprios proxies
let turnstileRequest = new TurnstileRequest({
websiteURL: "https://example.com", // URL da página com a captcha
websiteKey: "0x4AAAAAAABUYP0XeMJF0xoy", // Substitua pelo valor correto
data: "YOUR_DATA_HERE",
pageAction: "managed",
cloudflareTaskType: "token",
pageData: "YOUR_PAGE_DATA_HERE",
userAgent: "userAgentPlaceholder"
});

// Exemplo de uso do seu próprio proxy
// Descomente este bloco se quiser usar um proxy personalizado

/*
const proxy = {
proxyType: "http",
proxyAddress: "123.45.67.89",
proxyPort: 8080,
proxyLogin: "username",
proxyPassword: "password"
};

turnstileRequest = new TurnstileRequest({
websiteURL: "https://example.com",
websiteKey: "0x4AAAAAAABUYP0XeMJF0xoy",
proxy,
data: "YOUR_DATA_HERE",
pageAction: "managed",
cloudflareTaskType: "token",
pageData: "YOUR_PAGE_DATA_HERE",
userAgent: "userAgentPlaceholder"
});
*/

// Se necessário, você pode verificar o saldo
const balance = await client.getBalance();
console.log("Balance:", balance);

const result = await client.Solve(turnstileRequest);
console.log("Solution:", result);
});
Opção 2: Challenge (cookie cf_clearance)
// https://github.com/ZennoLab/capmonstercloud-client-js

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

document.addEventListener("DOMContentLoaded", async () => {
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_API_KEY' }) // Insira sua chave de API do CapMonster Cloud
);

// Se necessário, você pode verificar o saldo
const balance = await cmcClient.getBalance();
console.log('Balance:', balance);

const proxy = {
proxyType: "http",
proxyAddress: '123.45.67.89',
proxyPort: 8080,
proxyLogin: 'username',
proxyPassword: 'password'
};

// O Cloudflare cf_clearance só pode ser resolvido usando seu próprio proxy
const turnstileRequest = new TurnstileRequest({
websiteURL: 'https://example.com/',
websiteKey: '0x4AAAAAAABUY0VLtOUMAHxE',
cloudflareTaskType: 'cf_clearance',
proxy,
htmlPageBase64: 'PGh0bW...h0bWw+',
userAgent: 'userAgentPlaceholder'
});

// Envio da tarefa para resolução
const result = await cmcClient.Solve(turnstileRequest);
console.log('Solution:', result.solution);
});