Cómo usar C# para resolver los desafíos de CAPTCHA de Cloudflare Turnstile

Nikolai Smirnov
Software Development Lead
17-Sep-2024

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
Comprender Cloudflare Turnstile
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.
Código de bonificació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
Configuración del entorno de desarrollo de C#
1. Descarga e instala .NET
- Visita esta página para descargar .NET.
- Sigue las instrucciones proporcionadas para tu sistema operativo para instalar .NET.
2. Configurar VS Code para el desarrollo de C#
- Instala la extensión de C# para VS Code.
- En VS Code, busca "C#" en el mercado de extensiones e instala el plugin oficial de Microsoft.
- Esta extensión proporciona funciones como IntelliSense y formato de código, lo que facilita el desarrollo de C#.

- Instala el paquete de análisis JSON
Newtonsoft.Json
para manejar datos JSON.- Puedes instalar este paquete usando NuGet con el comando:bash
dotnet add package Newtonsoft.Json
- Puedes instalar este paquete usando NuGet con el comando:
Obtén los requisitos previos para el uso de la API
1. Regístrate en CapSolver
- Crea una cuenta en CapSolver para acceder a sus servicios de API.
- Después de registrarte, recibirás una clave de API necesaria para acceder a los servicios de resolución de CAPTCHA de CapSolver.
2. Recupera SiteKey para Turnstile
- Para los desafíos de CAPTCHA de Cloudflare Turnstile, obtener el
siteKey
para el sitio web de destino es esencial. ElsiteKey
es necesario para utilizar la API de decodificación y resolver el CAPTCHA. - Puedes extraer el
siteKey
usando la Extensión CapSolver, que simplifica el proceso.
Uso de la API de CapSolver para obtener un token de Turnstile
Aquí está el código para interactuar con la API de CapSolver, solicitar la resolución de CAPTCHA y recuperar el token de Turnstile.
csharp
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 "";
}
}
}
Ejemplo completo de código
csharp
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 = "[email protected]",
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;
}
}
}
Manejo de errores y resolución de problemas
- Solicitud fallida: Si encuentras un error de "Solicitud fallida", verifica que la clave de API y la clave del sitio sean correctas.
- Asegúrate de tener una clave de API activa de tu cuenta de CapSolver.
- Verifica que el
siteKey
coincida con el del sitio web de destino.
Explicación
- Configuración de la tarea: En el método
CallCapsolver
, defines el tipo de tareaAntiTurnstileTaskProxyLess
, elwebsiteURL
y elwebsiteKey
. Estos parámetros se envían a CapSolver para crear la tarea de resolución de CAPTCHA. - Sondeo del estado de la tarea: Una vez que se crea la tarea, el código sondea el punto final
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. - Uso del token: El método
Login
utiliza el token recibido de CapSolver para autenticar la solicitud de inicio de sesión en el sitio web protegido por Cloudflare.
Conclusión
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.
Nota sobre el cumplimiento
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.txt
del 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.
Aviso de Cumplimiento: La información proporcionada en este blog es solo para fines informativos. CapSolver se compromete a cumplir con todas las leyes y regulaciones aplicables. El uso de la red de CapSolver para actividades ilegales, fraudulentas o abusivas está estrictamente prohibido y será investigado. Nuestras soluciones para la resolución de captcha mejoran la experiencia del usuario mientras garantizan un 100% de cumplimiento al ayudar a resolver las dificultades de captcha durante el rastreo de datos públicos. Fomentamos el uso responsable de nuestros servicios. Para obtener más información, visite nuestros Términos de Servicio y Política de Privacidad.
Máse

Cómo resolver Cloudflare utilizando Python y Go en 2025
Compartiré información sobre qué es Cloudflare Turnstile, utilizando Python y Go para estas tareas, si Turnstile puede detectar raspadores Python y cómo evitarlo eficazmente utilizando soluciones como CapSolver.

Aloísio Vítor
05-Nov-2024

Cómo resolver los captchas de Cloudflare Turnstile con Selenium
En este blog, discutiremos varias técnicas efectivas para superar los captchas de Cloudflare Turnstile usando Selenium.

Aloísio Vítor
11-Oct-2024

Una guía para resolver captchas de Cloudflare Turnstile en Java para la automatización web
Aprende a automatizar interacciones web en Java y a sortear el CAPTCHA Turnstile de Cloudflare con herramientas prácticas y técnicas de codificación.

Aloísio Vítor
08-Oct-2024

Cómo automatizar la resolución de Cloudflare Turnstile para la extracción web
Exploraremos estrategias para manejar el CAPTCHA de Cloudflare Turnstile en la rastreo web y discutiremos técnicas para automatizar su solución usando Puppeteer y CapSolver en Python.

Aloísio Vítor
27-Sep-2024

Cómo usar C# para resolver los desafíos de CAPTCHA de Cloudflare Turnstile
Sabrás cómo resolver fácilmente el desafío CAPTCHA de Cloudflare Turnstile usando C# y quieres saber los detalles específicos? ¡Vamos!

Nikolai Smirnov
17-Sep-2024

Evadir el bloqueo de Cloudflare
Aprende a resolver el Desafío de Cloudflare con Capsolver: requisitos clave, uso de proxy y pasos detallados para una solución eficiente.

Ethan Collins
16-May-2023