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

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

Cómo automatizar la solución de desafíos de Cloudflare en Selenium
Cómo automatizar la resolución de desafíos de Cloudflare en Selenium

Dominar la estrategia definitiva para resolver desafíos de Cloudflare en Selenium. Utiliza Undetected-Chromedriver, mimetismo conductual y la API de CapSolver para una automatización web confiable.

Cloudflare
Logo of CapSolver

Adélia Cruz

04-Dec-2025

Cómo resolver el desafío de Cloudflare con Node.JS
Cómo resolver el desafío de Cloudflare con Node.js

Una mirada a por qué Cloudflare bloquea los scrapers de Node.js y cómo los desarrolladores obtienen de manera confiable el cf_clearance para flujos de trabajo de datos.

Cloudflare
Logo of CapSolver

Adélia Cruz

03-Dec-2025

Cómo resolver Cloudflare | Usando Puppeteer Node.JS
Cómo resolver Cloudflare | Usando Puppeteer Node.JS

Investigaremos cómo resolver de manera efectiva CAPTCHAs similares a Turnstile de Cloudflare utilizando Puppeteer y Node.js y la ayuda de un solver de CAPTCHA.

Cloudflare
Logo of CapSolver

Adélia Cruz

02-Dec-2025

Cómo identificar Cloudflare Turnstile | Utilizando la extensión CapSolver
Cómo identificar Cloudflare Turnstile | Al usar la extensión CapSolver

Aprende a identificar cloudflare turnstile para resolver CAPTCHAs de manera efectiva. Sigue nuestra guía paso a paso sobre el uso de las herramientas y técnicas de Capsolver.

Cloudflare
Logo of CapSolver

Adélia Cruz

19-Nov-2025

Cloudflare Turnstile y Desafío
Cómo resolver Cloudflare Turnstile y Challenge en 2024

Aproximadamente el 20% de los sitios web que requieren scraping utilizan Cloudflare, un sistema de protección anti-bot robusto que puede bloquear fácilmente tu acceso...

Cloudflare
Logo of CapSolver

Aloísio Vítor

18-Nov-2025