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

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

Logo of CapSolver

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

  1. Introducción a Cloudflare Turnstile
  2. Configuración del entorno de desarrollo de C#
  • Descarga e instalación de .NET
  • Configurar VS Code para el desarrollo de C#
  1. Obtén los requisitos previos para el uso de la API
  • Regístrate en CapSolver
  • Recupera SiteKey para Turnstile
  1. Uso de la API de CapSolver para obtener un token de Turnstile
  2. Ejemplo completo de código
  3. Manejo de errores y resolución de problemas
  • Errores de solicitud fallida
  1. Explicación del código
  2. 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 Copy
      dotnet add package Newtonsoft.Json

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. El siteKey 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 Copy
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 Copy
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

  1. Configuración de la tarea: En el método 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.
  2. 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.
  3. 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

Desafío de Cloudflare vs Turnstile de CapSolver
Desafío de Cloudflare frente a Turnstile: Diferencias clave y cómo identificarlas

Entienda las diferencias clave entre el desafío de Cloudflare vs Turnstile y aprenda a identificarlos para una automatización web exitosa. Obtenga consejos de expertos y un solucionador recomendado.

Cloudflare
Logo of CapSolver

Ethan Collins

10-Dec-2025

Cómo resolver Cloudflare al scraping web en 2026 | Guía paso a paso
Cómo resolver Cloudflare al hacer scraping web en 2026 | Guía paso a paso

Este artículo de blog explora técnicas efectivas para resolver estas defensas con la ayuda de CapSolver, una herramienta experta en resolver CAPTCHAs. Desde explicar los protocolos de seguridad de Cloudflare hasta proporcionar estrategias prácticas y ejemplos de código para evadir estas restricciones.

Cloudflare
Logo of CapSolver

Ethan Collins

09-Dec-2025

Cómo resolver el Captcha de Cloudflare Turnstile con NodeJS
Cómo resolver el Captcha de Cloudflare Turnstile con NodeJS

En este artículo, te mostraremos cómo resolver el captcha de cloudflare turnstile con NodeJS.

Cloudflare
Logo of CapSolver

Rajinder Singh

08-Dec-2025

Cloudflare 403 prohibido
Cómo resolver el error 403 Prohibido y 522/1020/1010/1015/1012

Cloudflare es un servicio de red de entrega de contenido (CDN) y seguridad ampliamente utilizado que ayuda a los sitios web a mitigar diversos tipos de amenazas, incluyendo ataques DDoS y bots abusivos...

Cloudflare
Logo of CapSolver

Lucas Mitchell

08-Dec-2025

Error de Cloudflare 1006, 1007, 1008
Error de Cloudflare 1006, 1007, 1008 Solución para resolver | Cómo arreglarlo

¿Tienes problemas con errores de Cloudflare 1006, 1007 o 1008? Aprende soluciones prácticas para resolver estos rechazos de acceso y mejorar tu experiencia de rastreo web.

Cloudflare
Logo of CapSolver

Ethan Collins

05-Dec-2025

Cómo identificar si la `action` es requerida para resolver Cloudflare Turnstile usando la extensión CapSolver
Cómo identificar si `action` es necesario para resolver Cloudflare Turnstile usando la extensión de CapSolver

Aprende a identificar la acción para resolver eficazmente el captcha de Cloudflare Turnstile. Sigue nuestra guía paso a paso sobre cómo usar las herramientas y técnicas de Capsolver.

Cloudflare
Logo of CapSolver

Adélia Cruz

05-Dec-2025