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

Cloudflare Turnstile | Challenge | Waiting Room

Todos os subtipos Turnstile são suportados automaticamente: manual, não interativo e invisível. Portanto, não é necessário especificar um subtipo para um captcha padrão.

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

Antes de começar, revise todas as três opções de resolução de captcha e escolha a que melhor atende às suas necessidades.

Opção 1. Turnstile (token)

Você precisa resolver um captcha Turnstile padrão, como aqui. Note que os captchas nas páginas da Cloudflare podem parecer idênticos. Veja no final do artigo como distinguir um Turnstile padrão de um Cloudflare Challenge.

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.

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


pageAction<string>optional

O campo action encontrado na função de callback quando o captcha é carregado


data<string>optional

O valor do campo data, obtido do parâmetro cData.


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.


Opção 2. 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.

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


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.


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

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

Este é um novo mecanismo de proteção da Cloudflare: o usuário deve esperar em média ~3 minutos antes de acessar o recurso:

Você também pode identificar este tipo de Cloudflare pelo cabeçalho da página:


Parâmetros da Requisição

type<string>required

TurnstileTask


websiteURL<string>required

A URL da página contendo a verificação


websiteKey<string>required

Chave do site Cloudflare


cloudflareTaskType<string>required

wait_room


htmlPageBase64<string>required

Página HTML codificada em Base64 contendo <title>Waiting Room powered by Cloudflare</title>


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.


Exemplos de requisição

Opção 1. Turnstile (token)

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

Requisição

{
"clientKey":"API_KEY",
"task": {
"type":"TurnstileTask",
"websiteURL":"http://tsmanaged.zlsupport.com",
"websiteKey":"0x4AAAAAAABUYP0XeMJF0xoy"
}
}

Resposta

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

Opção 2. Challenge (token)

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

Requisiçã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
}

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

Requisição

{
"clientKey":"API_KEY",
"task": {
"type":"TurnstileTask",
"websiteURL":"https://example.com",
"websiteKey":"xxxxxxxxxx",
"cloudflareTaskType": "wait_room",
"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 para Obter o Resultado da Tarefa

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

PropriedadeTipoDescrição
cf_clearanceStringCookies especiais do Cloudflare que você pode configurar no navegador
tokenStringUse este token ao chamar a função de callback

Como distinguir um Turnstile padrão de um Cloudflare Challenge

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:

Exemplo de implementação usando Selenium no Node.js
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();
}
})();

Como Encontrar Todos os Parâmetros Necessários para a Criação da Tarefa

Manualmente

  1. Abra seu site onde o captcha aparece no navegador.
  2. Clique com o botão direito no elemento do captcha e selecione Inspecionar.

Opção 1.

websiteKey

Pode ser encontrado em Elements:

sitekeyTurnstile

sitekeyTurnstile1

Você também pode usar um comando no console abrindo a URL do captcha (começando com https://challenges.cloudflare.com/cdn-cgi/challenge-platform/h/g…) em uma aba separada:

console.log(window._cf_chl_opt.chlApiSitekey);

chlApiSitekey é o sitekey.

pageAction

Action e sitekey também podem ser encontrados na função callback:

callbackTurnstile

Para as Opções 2 e 3, é melhor extrair os parâmetros automaticamente:

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: Turnstile (token) – no navegador
// Função para verificar a presença de window.onloadTurnstileCallback
const checkTurnstileCallback = () => {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => reject('Tempo limite do callback'), 30000);

const interval = setInterval(() => {
if (window.onloadTurnstileCallback !== undefined) {
clearInterval(interval);
clearTimeout(timeout);

const callbackDetails = window.onloadTurnstileCallback.toString();
const sitekeyMatch = callbackDetails.match(/sitekey: ['"]([^'"]+)['"]/);
const actionMatch = callbackDetails.match(/action: ['"]([^'"]+)['"]/);

resolve({
sitekey: sitekeyMatch ? sitekeyMatch[1] : null,
action: actionMatch ? actionMatch[1] : null,
});
}
}, 500);
});
};

// Tenta encontrar qualquer elemento com data-sitekey
const turnstileElement = document.querySelector('[data-sitekey]');

if (turnstileElement) {
// Extrai o valor do atributo data-sitekey
const sitekey = turnstileElement.getAttribute("data-sitekey");
console.log("Turnstile Sitekey (do elemento):", sitekey);
} else {
console.log("Elemento Turnstile não encontrado. Verificando via callback...");

// Se o elemento não for encontrado, verifica via window.onloadTurnstileCallback
checkTurnstileCallback()
.then((data) => {
console.log("Parâmetros Turnstile (do callback):", data);
})
.catch((error) => {
console.error(error);
});
}
Para a Opção 2: 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 3: 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();
})();

Usar biblioteca SDK

Opção 1: Turnstile (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: "http://tsmanaged.zlsupport.com", // URL da página com a captcha
websiteKey: "0x4AAAAAAABUYP0XeMJF0xoy" // Substitua pelo valor correto
});

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

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

turnstileRequest = new TurnstileRequest({
websiteURL: "http://tsmanaged.zlsupport.com",
websiteKey: "0x4AAAAAAABUYP0XeMJF0xoy",
proxy,
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 (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 3: 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);
});