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

Huellas dactilares TLS de Cloudflare: Qu¨¦ son y c¨®mo solucionarlas
Aprenda sobre el uso de la huella digital TLS de Cloudflare para la seguridad, c¨®mo detecta y bloquea bots, y explore m¨¦todos efectivos para solucionarlo para tareas de raspado web y navegaci¨®n automatizada.

Alo¨ªsio V¨ªtor
28-Feb-2025

C¨®mo extraer datos de un sitio web protegido por Cloudflare
En esta gu¨ªa, exploraremos t¨¦cnicas ¨¦ticas y efectivas para extraer datos de sitios web protegidos por Cloudflare.

Alo¨ªsio V¨ªtor
20-Feb-2025

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