Neste artigo, procuramos responder a todas as principais dúvidas. Para começar a resolver o problema, o primeiro passo é identificar qual sistema de proteção está sendo utilizado. Para isso, você pode consultar a lista de captchas e sistemas de proteção antibot mais populares, onde há exemplos visuais e sinais principais que ajudam a identificar rapidamente com o que você está lidando.
Se você notar que o seu site utiliza Cloudflare Turnstile, o passo seguinte é estudar com mais detalhes as suas características e o seu funcionamento. Neste mesmo artigo, você também pode conferir o guia de integração do Cloudflare Turnstile, para entender por completo como o sistema opera no seu site. Isso permitirá não apenas compreender a proteção atual, mas também planejar adequadamente a sua manutenção.
Ao testar formulários com Cloudflare Turnstile, é comum precisar confirmar se a captcha está funcionando e integrada corretamente.
Você pode testar manualmente a captcha incorporada no site.
Para resolver automaticamente use ferramentas como o CapMonster Cloud, que recebe os parâmetros da captcha, processa em seus servidores e devolve um token pronto. Basta inseri-lo no formulário para passar na verificação sem interação humana.
Trabalhar com o CapMonster Cloud via API normalmente envolve as etapas abaixo:
Na solicitação para resolver Cloudflare Turnstile, é necessário especificar os seguintes parâmetros:
type - TurnstileTask;
websiteURL - endereço da página onde o CAPTCHA está sendo resolvido;
websiteKey - chave Turnstile.
https://api.capmonster.cloud/createTask{
"clientKey": "API_KEY",
"task": {
"type": "TurnstileTask",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}{
"errorId":0,
"taskId":407533072
}https://api.capmonster.cloud/getTaskResult{
"clientKey":"API_KEY",
"taskId": 407533072
}{
"errorId": 0,
"status": "ready",
"solution": {
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36",
"token": "0.iGX3xsyFCkbGePM3jP4P4khLo6TrLukt8ZzBvwuQOvbC...f61f3082"
}
}// npm install playwright @zennolab_com/capmonstercloud-client
import { chromium } from "playwright";
import { CapMonsterCloudClientFactory, ClientOptions, TurnstileRequest } from "@zennolab_com/capmonstercloud-client";
async function main() {
// 1. Resolver Turnstile via CapMonster Cloud
const cmcClient = CapMonsterCloudClientFactory.Create(
new ClientOptions({ clientKey: 'YOUR_CAPMONSTER_API_KEY' })
);
const turnstileRequest = new TurnstileRequest({
websiteURL: 'http://tsmanaged.zlsupport.com',
websiteKey: '0x4AAAAAAABUYP0XeMJF0xoy',
});
const result = await cmcClient.Solve(turnstileRequest);
const token = result.solution.token;
console.log('Token Turnstile recebido:', token);
// 2. Iniciando Playwright
const browser = await chromium.launch({ headless: false });
const context = await browser.newContext();
const page = await context.newPage();
await page.goto('http://tsmanaged.zlsupport.com');
// 3. Preenchendo login e senha
await page.fill('#username', 'your_username');
await page.fill('#password', 'your_password');
// 4. Aguardando o aparecimento do campo de token oculto
await page.waitForSelector('#token', { state: 'attached', timeout: 60000 });
// 5. Inserindo token e tornando o campo visível
await page.evaluate((t) => {
const tokenInput = document.querySelector('#token');
if (tokenInput) {
tokenInput.type = 'text'; // tornar o campo visível
tokenInput.value = t; // inserir token
console.log('Token inserido no campo token');
} else {
console.error('Campo #token não encontrado');
}
}, token);
// 6. Verificando se o token foi realmente inserido
const checkValue = await page.$eval('#token', el => el.value);
console.log('Verificação do valor do token:', checkValue);
// 7. Enviando formulário
await page.click('button[type="submit"]');
console.log('Formulário enviado com token Turnstile');
// await browser.close();
}
main().catch(err => console.error(err));1. Vá para a página Cloudflare Turnstile, clique em Começar agora.
2. Cadastre-se no serviço.
3. Em Turnstile Widgets, clique no botão azul Add Widget.

4. Configure o Cloudflare Turnstile, especifique:
5. Após criar o widget, você receberá duas chaves—Site Key e Secret Key.

6. Conecte a parte do cliente
1) Conecte o script Turnstile
Renderização automática (o widget é criado automaticamente ao carregar a página):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>Controle programático (você mesmo cria o widget via JavaScript):
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js?render=explicit" defer></script>Importante: o script deve ser carregado do URL exato. Proxy ou cache podem causar falhas.
2) Crie um contêiner para o widget
Automático:
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>"></div>Programaticamente:
<div id="turnstile-container"></div>3) Configuração do widget
Via atributos data:
<div class="cf-turnstile"
data-sitekey="<YOUR_SITEKEY>"
data-theme="light"
data-size="normal"
data-callback="onSuccess">
</div>Via JavaScript:
const widgetId = turnstile.render("#turnstile-container", {
sitekey: "<YOUR_SITEKEY>",
theme: "light",
size: "normal",
callback: token => console.log("Token:", token)
});4) Trabalhando com tokens
const token = turnstile.getResponse(widgetId); // obter token
const isExpired = turnstile.isExpired(widgetId); // verificar expiração
turnstile.reset(widgetId); // redefinir
turnstile.remove(widgetId); // remover
turnstile.execute("#turnstile-container"); // execução manual
5) Integração com formulário
<form id="my-form" method="POST">
<input type="hidden" name="cf-turnstile-response" id="cf-turnstile-response">
<button type="submit">Enviar</button>
</form>
<script>
function onSuccess(token) {
document.getElementById("cf-turnstile-response").value = token;
}
</script>
<title>Turnstile Example</title>
<!-- Conectar script Turnstile -->
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
</head>
<body>
<h1>Exemplo de formulário com Turnstile</h1>
<form id="my-form">
<label for="username">Nome:</label>
<input type="text" name="username" id="username" required>
<!-- Contêiner para Turnstile -->
<div class="cf-turnstile" data-sitekey="<YOUR_SITEKEY>" data-callback="onTurnstileSuccess"></div>
<button type="submit">Enviar</button>
</form>
<script>
// Callback chamado após passar no CAPTCHA
function onTurnstileSuccess(token) {
console.log("Token Turnstile recebido:", token);
// Salvar token em campo oculto do formulário (opcional)
document.getElementById("cf-turnstile-token")?.remove();
const input = document.createElement("input");
input.type = "hidden";
input.name = "cf-turnstile-response";
input.id = "cf-turnstile-token";
input.value = token;
document.getElementById("my-form").appendChild(input);
}
// Envio do formulário
document.getElementById("my-form").addEventListener("submit", async (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const response = await fetch("/submit-form", {
method: "POST",
body: formData
});
const result = await response.json();
if(result.success){
alert("Formulário enviado com sucesso e token verificado!");
} else {
alert("Erro de verificação do token Turnstile. Tente novamente.");
// Redefinir widget para que o usuário possa completar o CAPTCHA novamente
turnstile.reset();
}
});
</script>
</body>
</html>
6) Configure a parte do servidor
Processo de verificação do lado do servidor:
API Siteverify:
https://challenges.cloudflare.com/turnstile/v0/siteverifyParâmetros da solicitação:
Propriedades do token:
<?php
function validateTurnstile($token, $secret, $remoteip = null) {
$url = 'https://challenges.cloudflare.com/turnstile/v0/siteverify';
$data = ['secret' => $secret, 'response' => $token];
if ($remoteip) $data['remoteip'] = $remoteip;
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded
",
'method' => 'POST',
'content' => http_build_query($data)
]
];
$response = file_get_contents($url, false, stream_context_create($options));
if ($response === FALSE) {
return ['success' => false, 'error-codes' => ['internal-error']];
}
return json_decode($response, true);
}
// Uso
$secret_key = 'YOUR_SECRET_KEY';
$token = $_POST['cf-turnstile-response'] ?? '';
$remoteip = $_SERVER['REMOTE_ADDR'];
$result = validateTurnstile($token, $secret_key, $remoteip);
if($result['success']){
echo "Formulário enviado com sucesso!";
} else {
echo "Erro de verificação: " . implode(', ', $result['error-codes']);
}
?>
Se você herdou um site que já tem um captcha ou outro sistema de proteção instalado e não tem acesso ao código, não tem problema! É bem fácil identificar qual tecnologia está sendo usada. Para verificar se tudo está funcionando corretamente, você pode usar o serviço de reconhecimento CapMonster Cloud em um ambiente de testes isolado, para garantir que o mecanismo de processamento de tokens e a lógica de verificação estejam funcionando corretamente.
No caso de Cloudflare Turnstile, basta identificar o sistema, analisar o comportamento dele e se certificar de que a proteção está funcionando corretamente. No artigo, mostramos como identificar Cloudflare Turnstile e onde encontrar instruções para a integração ou reconfiguração, para que você consiga manter a proteção com segurança e controlar o funcionamento dela.