
Adélia Cruz
Neural Network Developer

Navegar pelas complexidades dos desafios de CAPTCHA pode ser uma tarefa formidável, especialmente quando se trata do Turnstile da Cloudflare. Como um desenvolvedor experiente, encontrei inúmeros sistemas CAPTCHA ao longo dos anos, mas o Cloudflare Turnstile apresenta um desafio único devido aos seus algoritmos sofisticados projetados para frustrar sistemas automatizados. Neste guia, vou guiá-lo em como enfrentar os desafios do CAPTCHA do Cloudflare Turnstile usando C#, fornecendo-lhe insights práticos e técnicas para aprimorar seus esforços de automação.
Índice
- Introdução ao Cloudflare Turnstile
- Configurando o ambiente de desenvolvimento C#
- Baixar e instalar .NET
- Configurar o VS Code para o desenvolvimento em C#
- Obter os pré-requisitos de uso da API
- Registrar-se no CapSolver
- Recuperar a SiteKey para Turnstile
- Usando a API do CapSolver para obter um token Turnstile
- Exemplo completo de código
- Tratamento de erros e solução de problemas
- Erros de falha de solicitação
- Explicação do código
- Conclusão
O Cloudflare Turnstile é um sistema CAPTCHA avançado projetado para proteger sites de bots automatizados, garantindo ao mesmo tempo atrito mínimo para usuários legítimos. Diferentemente dos CAPTCHAs tradicionais, que geralmente envolvem a resolução de quebra-cabeças ou a identificação de objetos, o Turnstile opera por meio de uma abordagem mais sutil. Ele analisa o comportamento do usuário e várias interações da web para determinar se o visitante é um humano ou um bot.
O Turnstile emprega uma gama de sinais, incluindo movimentos do mouse, padrões de cliques e tempos de interação, para gerar um desafio que é difícil para os sistemas automatizados resolverem. Isso o torna uma ferramenta poderosa para a segurança do site, mas também um obstáculo desafiador para a automação.
Obtenha seu Código bônus para as melhores soluções de captcha; CapSolver: WEBS. Após resgatá-lo, você receberá um bônus extra de 5% após cada recarga, Ilimitado

Newtonsoft.Json para lidar com dados JSON.
dotnet add package Newtonsoft.Json
siteKey para o site de destino é essencial. A siteKey é necessária para usar a API de decodificação e resolver o CAPTCHA.siteKey usando a Extensão CapSolver, que simplifica o processo.Aqui está o código para interagir com a API do CapSolver, solicitar a resolução de CAPTCHA e recuperar o token Turnstile.
public static async Task<string> CallCapsolver()
{
// // Send GET request
// var todoItem = await GetTodoItemAsync(API_URL);
// Console.WriteLine("GET Request Result:");
// Console.WriteLine(todoItem);
var data = new
{
clientKey = CAPSOLVER_API_KEY,
task = new
{
type = "AntiTurnstileTaskProxyLess",
websiteURL = PAGE_URL,
websiteKey = SITE_KEY,
metadata = new { action = "login" }
}
};
// Send POST request
var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
Console.WriteLine("POST Request Result:");
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
JObject taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
var taskId = taskResp["taskId"].ToString();
if (string.IsNullOrEmpty(taskId))
{
Console.WriteLine("No task ID received.");
return "";
}
Console.WriteLine($"Created task ID: {taskId}");
while (true)
{
await Task.Delay(1000); // Sleep for 1 second
var resultData = new
{
clientKey = CAPSOLVER_API_KEY,
taskId = taskId
};
// content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json");
// response = await httpClient.PostAsync(uri, content);
response = await PostTodoItemAsync("https://api.capsolver.com/getTaskResult", resultData);
responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine($"Failed to get task result: {responseString}");
return "";
}
taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
Console.WriteLine(taskResp);
var status = taskResp["status"].ToString();
if (status == "ready")
{
Console.WriteLine("Successfully => " + responseString);
return taskResp["solution"]["token"].ToString();
}
if (status == "failed")
{
Console.WriteLine("Failed! => " + responseString);
return "";
}
}
}
using System;
using System.Net.Http;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace HttpExample
{
public class Program
{
private const string CAPSOLVER_API_KEY = "CAI-xxxxxxxxxxxxxxxxxxx";
private const string PAGE_URL = "https://dash.cloudflare.com/login";
private const string SITE_KEY = "0x4AAAAAAAJel0iaAR3mgkjp";
public static async Task Main(string[] args)
{
var token = await CallCapsolver();
Console.WriteLine($"token: {token}");
await Login(token);
}
public static async Task<string> CallCapsolver()
{
// // Send GET request
// var todoItem = await GetTodoItemAsync(API_URL);
// Console.WriteLine("GET Request Result:");
// Console.WriteLine(todoItem);
var data = new
{
clientKey = CAPSOLVER_API_KEY,
task = new
{
type = "AntiTurnstileTaskProxyLess",
websiteURL = PAGE_URL,
websiteKey = SITE_KEY,
metadata = new { action = "login" }
}
};
// Send POST request
var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
Console.WriteLine("POST Request Result:");
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
JObject taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
var taskId = taskResp["taskId"].ToString();
if (string.IsNullOrEmpty(taskId))
{
Console.WriteLine("No task ID received.");
return "";
}
Console.WriteLine($"Created task ID: {taskId}");
while (true)
{
await Task.Delay(1000); // Sleep for 1 second
var resultData = new
{
clientKey = CAPSOLVER_API_KEY,
taskId = taskId
};
// content = new StringContent(JsonConvert.SerializeObject(data), System.Text.Encoding.UTF8, "application/json");
// response = await httpClient.PostAsync(uri, content);
response = await PostTodoItemAsync("https://api.capsolver.com/getTaskResult", resultData);
responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
if (!response.IsSuccessStatusCode)
{
Console.WriteLine($"Failed to get task result: {responseString}");
return "";
}
taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
Console.WriteLine(taskResp);
var status = taskResp["status"].ToString();
if (status == "ready")
{
Console.WriteLine("Successfully => " + responseString);
return taskResp["solution"]["token"].ToString();
}
if (status == "failed")
{
Console.WriteLine("Failed! => " + responseString);
return "";
}
}
}
public static async Task Login(string token)
{
using var httpClient = new HttpClient();
// Add request headers
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Cookie", $"cf_clearance={token}");
httpClient.DefaultRequestHeaders.TryAddWithoutValidation("Host", "dash.cloudflare.com");
var data = new {
cf_challenge_response = token,
email = "1111111@gmail.com",
password = "123456",
};
var json = JsonConvert.SerializeObject(data);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://dash.cloudflare.com/api/v4/login", content);
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Request failed with status code {response.StatusCode}");
}
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
private static async Task<HttpResponseMessage> GetTodoItemAsync(string url)
{
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync(url);
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Request failed with status code {response.StatusCode}");
}
// var responseString = await response.Content.ReadAsStringAsync();
return response;
}
private static async Task<HttpResponseMessage> PostTodoItemAsync(string url, object item)
{
using var httpClient = new HttpClient();
var json = JsonConvert.SerializeObject(item);
var content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync(url, content);
if (!response.IsSuccessStatusCode)
{
throw new Exception($"Request failed with status code {response.StatusCode}");
}
return response;
}
}
}
siteKey corresponde à do site de destino.CallCapsolver, você define o tipo de tarefa AntiTurnstileTaskProxyLess, o websiteURL e websiteKey. Esses parâmetros são enviados ao CapSolver para criar a tarefa de resolução de CAPTCHA.getTaskResult para verificar o status da tarefa. Se a tarefa estiver pronta, ela recupera a solução (o token Turnstile); se falhar, ele retorna um erro.Login usa o token recebido do CapSolver para autenticar a solicitação de login no site protegido pelo Cloudflare.Seguindo este guia, você poderá navegar pelas complexidades da resolução dos desafios do Cloudflare Turnstile CAPTCHA usando C#. A API do CapSolver fornece uma maneira confiável e eficiente de automatizar o processo, melhorando suas capacidades de automação. Para obter mais informações e atualizações, visite CapSolver.
Importante: Ao se envolver em web scraping, é fundamental aderir às diretrizes legais e éticas. Sempre certifique-se de ter permissão para raspar o site de destino e respeite o arquivo
robots.txte os termos de serviço do site. O CapSolver se opõe firmemente ao uso indevido de nossos serviços para qualquer atividade não compatível. O uso indevido de ferramentas automatizadas para contornar CAPTCHAs sem autorização adequada pode levar a consequências legais. Certifique-se de que suas atividades de scraping estejam em conformidade com todas as leis e regulamentações aplicáveis para evitar problemas potenciais.
Entenda as principais diferenças entre Cloudflare Challenge vs Turnstile e aprenda a identificá-los para automação web bem-sucedida. Obtenha dicas de especialistas e um solucionador recomendado.

Aprenda a corrigir o Erro 1005 do Cloudflare acesso negado durante o web scraping. Descubra soluções como proxies residenciais, fingerprinting de navegador e CapSolver para CAPTCHA. Otimize sua extração de dados.
