O que é o CAPTCHA da Cloudflare e como resolvê-lo facilmente com o CapMonster Cloud
O captcha da Cloudflare desempenha um papel importante na segurança de vários sites. Embora não seja um incômodo para um usuário normal, pode ser difícil ao usar scripts, que é a sua finalidade. Neste artigo, veremos estratégias eficazes para resolver o captcha da Cloudflare, com foco nos recursos do CapMonster Cloud - um dos principais serviços para resolver automaticamente vários tipos de captchas.
Cloudflare captcha é um sistema de proteção contra solicitações automatizadas, que impede o uso indevido dos recursos do site. Para a maioria dos visitantes reais, esse captcha não cria nenhum inconveniente, pois não exige a execução de determinadas tarefas - a verificação geralmente ocorre em segundo plano (caso contrário, o máximo que você precisa fazer é clicar na janela com a inscrição "Confirme que você é humano").
Quando você tiver passado com sucesso pelo captcha da Cloudflare:

Esta mensagem poderá ser exibida se o sistema detectar sinais de solicitações automáticas:

Existem dois tipos de captcha da Cloudflare: Turnstile e Challenge. Ambos têm como objetivo detectar atividades suspeitas e determinar se um recurso da Web é visitado por um usuário real ou por um programa de computador (script).
O Cloudflare Turnstile está localizado no próprio site (o widget pode ser visto, por exemplo, abaixo do formulário de registro), e o Cloudflare Challenge primeiro exibe uma página separada "Just a moment" com uma verificação de cinco segundos e, em seguida, se for aprovado, abre o próprio site.
Um exemplo de como é uma catraca CF normal:

Acessando a página do Desafio CF:

Para ter certeza do Cloudflare Challenge, ao abrir uma página com um captcha, você pode examinar seu código em Developer Tools, veja o tráfego na Rede e veja os sinais característicos:
A primeira solicitação ao site retorna um código 403:

O formulário com id challenge-form tem um atributo de ação (não confundir com a ação dos parâmetros para captcha de catraca) contendo o parâmetro __cf_chl_f_tk=:

- Existem duas tags <script> semelhantes na página que criam um novo valor no window object:

A análise requer eficiência e continuidade na recuperação de dados, mas às vezes o processo é complicado por obstáculos como Cloudflare captcha. Essas verificações levam a atrasos e interrupções. Portanto, é necessário encontrar maneiras de superá-las e adaptar seus métodos de análise para resolver o CAPTCHA da Cloudflare, mantendo o nível necessário de precisão e confiabilidade dos dados.
Os desenvolvedores e profissionais de análise de dados estão explorando várias abordagens, entre as quais vale a pena mencionar uma ferramenta eficaz para a implementação da solução automática de captcha: o CapMonster Cloud. O serviço de nuvem facilita a solução de bloqueios em sites, o que economiza o tempo dos usuários e simplifica as tarefas automatizadas.
O CapMonster Cloud fornece uma API para resolver captchas em vários sites. Para usá-la, é necessário registrar-se, obter uma chave de API e usá-la em seu código ou programa. Embora o CAPTCHA da Cloudflare seja um obstáculo bastante sério, não é difícil resolvê-lo se você compuser corretamente a tarefa a ser enviada ao servidor e receber o resultado.
As instruções a seguir o ajudarão a evitar possíveis erros ao usar o serviço e resolver o CAPTCHA da Cloudflare.
Para resolver o captcha, você precisa passar alguns parâmetros obrigatórios na solicitação para o servidor de nuvem do Capmonster.cloud server. Para o CF Turnstile, esse parâmetro é websiteKey - chave de captcha, que tem aproximadamente o seguinte formato: 0x4AAAAAAAAAAABUYP0XeMJJF0xoy. Você pode encontrá-lo no código da página, por exemplo, na guia Rede:

Para resolver o Cloudflare Challenge, você precisa passar parâmetros adicionais além disso (se estiver trabalhando por meio de um navegador, precisará obter um token captcha):
- pageAction
- data
- pageData
- userAgent
Todos esses parâmetros não precisam ser pesquisados manualmente, eles podem ser capturados usando o código Javascript antes de a página ser carregada:
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
if (prop === 'render') {
return function(a, b) {
let p = {
type: "TurnstileTaskProxyless",
websiteKey: b.sitekey,
websiteURL: window.location.href,
dados: b.cData,
pagedata: b.chlPageData,
ação: 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];
}
});
Os dados recebidos são usados para criar e enviar a tarefa para o servidor em nuvem do Capmonster.cloud server (um exemplo de um script completo para resolver esse tipo de captcha será descrito abaixo).
Se você trabalha com solicitações e precisa de cookies cf_clearance, também precisa especificar os parâmetros de seus proxies e htmlPageBase64 - página html codificada em base64 "Just a moment" que é fornecida com o código 403 ao acessar um site com essa proteção.
Código de exemplo para obter a string htmlPageBase64: var htmlContent = document.documentElement.outerHTML; var htmlBase64 = btoa(unescape(encodeURIComponent(htmlContent))); console.log(htmlBase64); |
Catraca:
Exemplo de solicitação:
https://api.capmonster.cloud/createTask
{
"clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
"task":
{
"type": "TurnstileTaskProxyless",
"websiteURL": "http://tsmanaged.zlsupport.com",
"websiteKey": "0x4AAAAAAABUYP0XeMJF0xoy"
}
}
Exemplo de resposta:
{
"errorId":0,
"taskId":407533072
}
Desafio (para obter o token):
Exemplo de solicitação:
https://api.capmonster.cloud/createTask
{
"clientKey": "dce6bcbb1a728ea8d871de6d169a2057",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://site.com",
"websiteKey": "0x4AAAAAAADnPIDROrmt1Wwj",
"cloudflareTaskType": "token",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/124.0.0.0 Safari/537.36",
"pageAction": "managed",
"pageData": "HUHDWUHuhuwfiweh32..uh2uhuhyugYUG=",
"data": "874291f4retD1366"
}
}
Desafio (lidar com solicitações quando os cookies cf_clearance são necessários):
Exemplo de solicitação:
https://api.capmonster.cloud/createTask
{
"clientKey":"dce6bcbb1a728ea8d871de6d169a2057",
"task": {
"type": "TurnstileTask",
"websiteURL": "https://nowsecure.nl",
"websiteKey": "xxxxxxxxxxxx",
"cloudflareTaskType": "cf_clearance",
"htmlPageBase64": "PCFET0NUWVBFIGh0...vYm9keT48L2h0bWw+",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, como Gecko) Chrome/124.0.0.0 Safari/537.36",
"proxyType": "http",
"proxyAddress":"8.8.8.8",
"proxyPort":8080,
"proxyLogin": "proxyLoginHere",
"proxyPassword": "proxyPasswordHere"
}
}
Obtendo o resultado:
Use o getTaskResult method to get the captcha solution. Dependendo da carga do sistema, você obterá uma resposta após um tempo que varia de 5 a 20 s.
// Antes de tudo, importar todos os complementos necessários:
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
(função assíncrona example() {
// Criação de uma instância do driver do navegador Chrome usando o Selenium WebDriver
const options = new chrome.Options();
options.addArguments('--auto-open-devtools-for-tabs');
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
try {
// Navegação para a página em que você precisa resolver o desafio do Cloudflare
await driver.get('https://your_site_with_captcha.com');
// Implementação do JavaScript para configurar o objeto proxy window.turnstile
aguarde driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
se (prop === 'render') {
return function(a, b) {
// Obtendo parâmetros para a tarefa TurnstileTaskProxyless
let p = {
type: "TurnstileTaskProxyless",
websiteKey: b.sitekey,
websiteURL: window.location.href,
data: b.cData,
pagedata: b.chlPageData,
action: b.action,
userAgent: navigator.userAgent
};
// Exportação dos parâmetros para o console
console.log(JSON.stringify(p));
window.params = p;
window.turnstileCallback = b.callback;
return target.render.apply(this, arguments);
}
}
return target[prop];
}
});
`);
// Executando JavaScript com expectativa de término após 5 segundos
const params = await driver.executeAsyncScript(`
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params);
}, 5000);
`);
// Exportação dos parâmetros obtidos para o console
console.log('Params:', params);
if (params) {
// Geração de dados para criação de tarefas no serviço CapMonster
const data = {
clientKey: 'your_API',
task: {
type: 'TurnstileTaskProxyless',
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
data: params.data,
action: params.action,
cloudflareTaskType: "token",
pageAction: "managed",
pageData: params.pagedata
}
};
// Exportação de dados para criação de tarefas para o console
console.log('Dados:', dados);
// Envio de uma solicitação para criar uma tarefa no CapMonster.cloud
const createResult = await fetch('https://api.capmonster.cloud/createTask', {
method: 'post',
body: JSON.stringify(data)
});
// Obter os resultados da criação de tarefas
const createTaskResult = await createResult.json();
console.log('Resultado da criação da tarefa:', createTaskResult);
if (createTaskResult.taskId) {
const asyncDelay = (timeout) =>
nova Promise(resolve => {
setTimeout(() => {
resolve();
}, timeout);
});
// Uma função para obter o resultado de uma tarefa com conclusão pendente
const getTaskResult = async (taskId) => {
const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
method: 'post',
body: JSON.stringify({
"clientKey": "sua_API",
"taskId": taskId
})
});
const taskResponse = await taskResult.json();
console.log('Resposta da tarefa:', taskResponse);
se (taskResponse.status === 'processing') {
aguarde asyncDelay(5000);
return await getTaskResult(taskId);
}
return taskResponse;
};
// Obtendo o resultado da execução da tarefa do serviço CapMonster.cloud
const taskRes = await getTaskResult(createTaskResult.taskId);
console.log('Resultado da tarefa:', taskRes);
if (taskRes.solution) {
// Exportação do token da solução no console
console.log('Token da solução:', taskRes.solution.token);
// Criação de uma função de retorno de chamada para passar o token da solução
await driver.executeScript(`
window.turnstileCallback('${taskRes.solution.token}');
`);
}
}
}
} finally {
await driver.quit();
}
})();
Às vezes, a captura dos parâmetros por alguns motivos não pode ser feita imediatamente; nesse caso, você pode tentar adicionar o recarregamento da página de captcha até que os parâmetros sejam recuperados:
const { Builder } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
(função assíncrona example() {
const options = new chrome.Options();
options.addArguments('--auto-open-devtools-for-tabs');
const driver = await new Builder()
.forBrowser('chrome')
.setChromeOptions(options)
.build();
let params = null;
try {
while (!params) {
await driver.get('https://your_site_with_captcha.com/');
aguarde driver.executeScript(`
window.turnstile = new Proxy(window.turnstile, {
get(target, prop) {
se (prop === 'render') {
return function(a, b) {
let p = {
type: "TurnstileTaskProxyless",
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];
}
});
`);
params = await driver.executeAsyncScript(`
const callback = arguments[arguments.length - 1];
setTimeout(() => {
callback(window.params);
}, 5000);
`);
se (!params) {
console.log('Parâmetros não obtidos, recarregando a página...');
await driver.sleep(3000);
}
}
console.log('Params:', params);
const data = {
clientKey: 'your_API_key',
task: {
type: 'TurnstileTaskProxyless',
websiteURL: params.websiteURL,
websiteKey: params.websiteKey,
data: params.data,
action: params.action,
cloudflareTaskType: "token",
pageAction: "managed",
pageData: params.pagedata
}
};
console.log('Dados:', dados);
const createResult = await fetch('https://api.capmonster.cloud/createTask', {
method: 'post',
body: JSON.stringify(data)
});
const createTaskResult = await createResult.json();
console.log('Resultado da tarefa de criação:', createTaskResult);
if (createTaskResult.taskId) {
const asyncDelay = (timeout) =>
nova Promise(resolve => {
setTimeout(() => {
resolve();
}, timeout);
});
const getTaskResult = async (taskId) => {
const taskResult = await fetch('https://api.capmonster.cloud/getTaskResult', {
method: 'post',
body: JSON.stringify({
"clientKey": "your_API_key",
"taskId": taskId
})
});
const taskResponse = await taskResult.json();
console.log('Resposta da tarefa:', taskResponse);
se (taskResponse.status === 'processing') {
aguarde asyncDelay(5000);
return await getTaskResult(taskId);
}
return taskResponse;
};
const taskRes = await getTaskResult(createTaskResult.taskId);
console.log('Resultado da tarefa:', taskRes);
if (taskRes.solution) {
console.log('Token da solução:', taskRes.solution.token);
aguarde driver.executeScript(`
window.turnstileCallback('${taskRes.solution.token}');
`);
}
}
} finally {
await driver.quit();
}
})();
Captcha, desenvolvido pela Cloudflare, é uma tecnologia sofisticada e robusta que protege os sites contra vários tipos de atividades mal-intencionadas, incluindo spam, ataques DDoS e outras formas de ataques automatizados. No entanto, para algumas tarefas, pode ser necessário resolver essa proteção, como na automatização de processos ou na integração com outros aplicativos.
CapMonster Cloudo serviço oferece uma solução para essas situações, permitindo que você resolva facilmente o captcha. Para fazer isso, você precisa se familiarizar com o processo de formando uma solicitação para resolver o captcha, enviando-a ao servidor de serviço e recebendo o resultado.
As instruções e os exemplos detalhados apresentados neste artigo podem ser um recurso útil para aprender a resolver o captcha e otimizá-lo em seu projeto. A compreensão dos aspectos básicos e práticos desse processo o ajudará a lidar com sucesso com a tarefa de travessia de captcha, minimizando possíveis dificuldades e erros na implementação.
Note: Gostaríamos de lembrá-lo de que o produto é usado para automatizar testes em seus próprios sites e em sites aos quais você tem acesso legal.