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 = "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;
        }
    }
}

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

Cómo superar Cloudflare en 2026: Los 6 mejores métodos para una automatización ininterrumpida
Cómo superar Cloudflare en 2026: Los 6 mejores métodos para una automatización sin interrupciones

Descubre los 6 mejores métodos para resolver el Desafío 5s de Cloudflare en 2026 para el scraping de web y la automatización. Incluye estrategias detalladas, ejemplos de código y un análisis profundo de la solución CapSolver impulsada por IA.

Cloudflare
Logo of CapSolver

Aloísio Vítor

29-Oct-2025

Cómo resolver el Desafío de 5 segundos de Cloudflare: Una guía técnica para el scraping web
Cómo resolver el desafío 5s de Cloudflare: Una guía técnica para el scraping web

Aprende a resolver el desafío de 5 segundos de Cloudflare usando APIs avanzadas de resolución de CAPTCHA. Una guía paso a paso para desarrolladores sobre cómo superar los desafíos de JavaScript y gestionados de Cloudflare con CapSolver para una automatización estable de scraping web.

Cloudflare
Logo of CapSolver

Aloísio Vítor

28-Oct-2025

Cómo resolver Cloudflare Turnstile en Crawl4AI con integración de CapSolver
Cómo resolver Cloudflare Turnstile en Crawl4AI con integración de CapSolver

Una guía completa sobre la integración de Crawl4AI con CapSolver para evitar las protecciones de Cloudflare Turnstile usando métodos de API y extensión de navegador para una extracción de datos web fluida.

Cloudflare
Logo of CapSolver

Adélia Cruz

21-Oct-2025

Cómo resolver el desafío de Cloudflare en Crawl4AI con la integración de CapSolver
Cómo resolver el desafío de Cloudflare en Crawl4AI con la integración de CapSolver

Aprende a resolver el Desafío de Cloudflare en Crawl4AI usando la integración de la API de CapSolver. Este guía proporciona ejemplos de código para el scraping web efectivo y la extracción de datos.

Cloudflare
Logo of CapSolver

Adélia Cruz

21-Oct-2025

Cómo resolver el Turnstile de Cloudflare y los desafíos 5s en 2026 | Mejor solucionador de Cloudflare
Cómo resolver Cloudflare Turnstile y Challenge 5s en 2026 | Mejor Solucionador de Cloudflare

Principales casos de uso de web scraping y conoce cómo CapSolver mantiene la extracción de datos fluida e ininterrumpida.

Cloudflare
Logo of CapSolver

Adélia Cruz

17-Oct-2025

El Mejor Solucionador de CAPTCHA de Cloudflare
El Mejor Solucionador de CAPTCHA de Cloudflare | Solución Probada y Confiable

Evita ser bloqueado por los desafíos de Cloudflare. Descubre el solucionador de CAPTCHA de desafíos de Cloudflare probado e impulsado por IA, CapSolver, con una guía paso a paso de la API y ejemplos de código para automatización confiable y a gran escala.

Cloudflare
Logo of CapSolver

Aloísio Vítor

17-Oct-2025