
Nikolai Smirnov
Software Development Lead

Navegar por las complejidades de los desafíos de CAPTCHA puede ser una tarea formidable, especialmente cuando se trata de Turnstile de Cloudflare. Como desarrollador experimentado, me he encontrado con numerosos sistemas CAPTCHA a lo largo de los años, pero Cloudflare Turnstile presenta un desafío único debido a sus sofisticados algoritmos diseñados para frustrar los sistemas automatizados. En esta guía, te guiaré a través de cómo abordar los desafíos de CAPTCHA de Cloudflare Turnstile usando C#, brindándote información práctica y técnicas para mejorar tus esfuerzos de automatización.
Tabla de contenido
- Introducción a Cloudflare Turnstile
- Configuración del entorno de desarrollo de C#
- Descarga e instalación de .NET
- Configurar VS Code para el desarrollo de C#
- Obtén los requisitos previos para el uso de la API
- Regístrate en CapSolver
- Recupera SiteKey para Turnstile
- Uso de la API de CapSolver para obtener un token de Turnstile
- Ejemplo completo de código
- Manejo de errores y resolución de problemas
- Errores de solicitud fallida
- Explicación del código
- Conclusión
Cloudflare Turnstile es un sistema CAPTCHA avanzado diseñado para proteger los sitios web de los bots automatizados, al tiempo que garantiza una fricción mínima para los usuarios legítimos. A diferencia de los CAPTCHA tradicionales, que a menudo implican resolver acertijos o identificar objetos, Turnstile opera a través de un enfoque más matizado. Analiza el comportamiento del usuario y diversas interacciones web para determinar si el visitante es un humano o un bot.
Turnstile emplea una variedad de señales, incluidos los movimientos del mouse, los patrones de clic y los tiempos de interacción, para generar un desafío que es difícil de resolver para los sistemas automatizados. Esto lo convierte en una herramienta poderosa para la seguridad del sitio web, pero también en un obstáculo desafiante para la automatización.
Reclama tu Código de bonificación para las mejores soluciones de captcha; CapSolver: WEBS. Después de canjearlo, obtendrás un bono adicional del 5% después de cada recarga, Ilimitado

Newtonsoft.Json para manejar datos JSON.
dotnet add package Newtonsoft.Json
siteKey para el sitio web de destino es esencial. El siteKey es necesario para utilizar la API de decodificación y resolver el CAPTCHA.siteKey usando la Extensión CapSolver, que simplifica el proceso.Aquí está el código para interactuar con la API de CapSolver, solicitar la resolución de CAPTCHA y recuperar el token de Turnstile.
public static async Task<string> CallCapsolver()
{
// // Enviar solicitud GET
// var todoItem = await GetTodoItemAsync(API_URL);
// Console.WriteLine("Resultado de la solicitud GET:");
// Console.WriteLine(todoItem);
var data = new
{
clientKey = CAPSOLVER_API_KEY,
task = new
{
type = "AntiTurnstileTaskProxyLess",
websiteURL = PAGE_URL,
websiteKey = SITE_KEY,
metadata = new { action = "login" }
}
};
// Enviar solicitud POST
var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
Console.WriteLine("Resultado de la solicitud POST:");
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 se recibió ningún ID de tarea.");
return "";
}
Console.WriteLine($"ID de tarea creada: {taskId}");
while (true)
{
await Task.Delay(1000); // Dormir durante 1 segundo
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($"No se pudo obtener el resultado de la tarea: {responseString}");
return "";
}
taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
Console.WriteLine(taskResp);
var status = taskResp["status"].ToString();
if (status == "ready")
{
Console.WriteLine("Exitoso => " + responseString);
return taskResp["solution"]["token"].ToString();
}
if (status == "failed")
{
Console.WriteLine("¡Fallado! => " + 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()
{
// // Enviar solicitud GET
// var todoItem = await GetTodoItemAsync(API_URL);
// Console.WriteLine("Resultado de la solicitud GET:");
// Console.WriteLine(todoItem);
var data = new
{
clientKey = CAPSOLVER_API_KEY,
task = new
{
type = "AntiTurnstileTaskProxyLess",
websiteURL = PAGE_URL,
websiteKey = SITE_KEY,
metadata = new { action = "login" }
}
};
// Enviar solicitud POST
var response = await PostTodoItemAsync("https://api.capsolver.com/createTask", data);
Console.WriteLine("Resultado de la solicitud POST:");
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 se recibió ningún ID de tarea.");
return "";
}
Console.WriteLine($"ID de tarea creada: {taskId}");
while (true)
{
await Task.Delay(1000); // Dormir durante 1 segundo
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($"No se pudo obtener el resultado de la tarea: {responseString}");
return "";
}
taskResp = JsonConvert.DeserializeObject<JObject>(responseString);
Console.WriteLine(taskResp);
var status = taskResp["status"].ToString();
if (status == "ready")
{
Console.WriteLine("Exitoso => " + responseString);
return taskResp["solution"]["token"].ToString();
}
if (status == "failed")
{
Console.WriteLine("¡Fallado! => " + responseString);
return "";
}
}
}
public static async Task Login(string token)
{
using var httpClient = new HttpClient();
// Agregar encabezados de solicitud
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($"La solicitud falló con el código de estado {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($"La solicitud falló con el código de estado {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($"La solicitud falló con el código de estado {response.StatusCode}");
}
return response;
}
}
}
siteKey coincida con el del sitio web de destino.CallCapsolver, defines el tipo de tarea AntiTurnstileTaskProxyLess, el websiteURL y el websiteKey. Estos parámetros se envían a CapSolver para crear la tarea de resolución de CAPTCHA.getTaskResult para verificar el estado de la tarea. Si la tarea está lista, recupera la solución (el token de Turnstile); si falla, devuelve un error.Login utiliza el token recibido de CapSolver para autenticar la solicitud de inicio de sesión en el sitio web protegido por Cloudflare.Siguiendo esta guía, podrás navegar por las complejidades de resolver los desafíos de CAPTCHA de Cloudflare Turnstile usando C#. La API de CapSolver proporciona una forma confiable y eficiente de automatizar el proceso, mejorando tus capacidades de automatización. Para obtener más información y actualizaciones, visita CapSolver.
Importante: Al participar en la extracción de datos web, es crucial cumplir con las pautas legales y éticas. Siempre asegúrate de tener permiso para extraer datos del sitio web de destino y respeta el archivo
robots.txtdel sitio y los términos de servicio. CapSolver se opone firmemente al mal uso de nuestros servicios para cualquier actividad no compatible. El uso indebido de herramientas automatizadas para omitir CAPTCHA sin la autorización adecuada puede tener consecuencias legales. Asegúrate de que tus actividades de extracción de datos sean compatibles con todas las leyes y regulaciones aplicables para evitar posibles problemas.
Aprende a solucionar el error de Cloudflare 1005 acceso denegado durante el scraping de web. Descubre soluciones como proxies residenciales, fingerprinting del navegador y CapSolver para CAPTCHA. Optimiza tu extracción de datos.

Descubre cómo manejar eficazmente Cloudflare Turnstile en flujos de trabajo de IA utilizando técnicas de stealth de Playwright y CapSolver para la resolución confiable de captchas. Aprende estrategias de integración prácticas y mejores prácticas para automatización ininterrumpida.
