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 resolver Cloudflare usando Python y Go en 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.

Cloudflare
Logo of CapSolver

Aloísio Vítor

05-Nov-2024

Cómo resolver captchas de Cloudflare Turnstile con Selenium
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.

Cloudflare
Logo of CapSolver

Aloísio Vítor

11-Oct-2024

Una guía para resolver los captchas de Cloudflare Turnstile en Java para la automatización web
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.

Cloudflare
Logo of CapSolver

Aloísio Vítor

08-Oct-2024

Cómo automatizar la solución de Cloudflare Turnstile para la rastreo web
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.

Cloudflare
Logo of CapSolver

Aloísio Vítor

27-Sep-2024

Cómo usar C# para resolver los desafíos de CAPTCHA de Cloudflare Turnstile
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!

Cloudflare
Logo of CapSolver

Nikolai Smirnov

17-Sep-2024

Evitar el bloqueo de Cloudflare
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.

Cloudflare
Logo of CapSolver

Ethan Collins

16-May-2023