Resuelve reCAPTCHA Enterprise con C#

Por solvethree3 min de lectura

Puedes llamar a solvethree directamente desde C#. El siguiente ejemplo solicita un token de reCAPTCHA v3 Enterprise, sigue la tarea hasta que finaliza y se detiene si la resolución falla.

En esta página

Antes de ejecutarlo

Usa .NET 8+. No se necesitan paquetes NuGet adicionales.

  • Crea un perfil de sitio activo para el nombre de host de destino en la consola. Consulta la configuración de perfiles de sitio.
  • Establece SOLVETHREE_API_KEY con la clave de API de tu espacio de trabajo y SOLVETHREE_PROXY con la URL de tu proxy HTTP(S).
  • Sustituye accounts.example.com y login por tu nombre de host y la acción que utiliza la página. Usa un nombre de host para site, sin esquema ni ruta.

Crea la tarea y espera el resultado

Crea un proyecto de consola de .NET con dotnet new console, sustituye Program.cs por este código y ejecuta dotnet run.

C# · Program.cs (.NET 8+)
using System.Net.Http.Headers;
using System.Text;
using System.Text.Json.Nodes;

var key = Environment.GetEnvironmentVariable("SOLVETHREE_API_KEY")
    ?? throw new Exception("Set SOLVETHREE_API_KEY");
var proxy = Environment.GetEnvironmentVariable("SOLVETHREE_PROXY")
    ?? throw new Exception("Set SOLVETHREE_PROXY");
using var http = new HttpClient { Timeout = TimeSpan.FromSeconds(30) };
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", key);
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(180));

async Task<JsonObject> Api(HttpMethod method, string path, JsonObject? body = null)
{
    using var request = new HttpRequestMessage(method, "https://api.solvethree.com/v1" + path);
    if (body is not null)
        request.Content = new StringContent(body.ToJsonString(), Encoding.UTF8, "application/json");
    using var response = await http.SendAsync(request, deadline.Token);
    response.EnsureSuccessStatusCode();
    return JsonNode.Parse(await response.Content.ReadAsStringAsync(deadline.Token))!.AsObject();
}

var requestId = Guid.NewGuid().ToString(); // Save with these inputs for recovery.
var input = new JsonObject {
    ["site"] = "accounts.example.com", ["action"] = "login",
    ["proxy"] = proxy, ["requestId"] = requestId
};
var task = await Api(HttpMethod.Post, "/tasks?waitMs=0", input);
while (task["status"]!.GetValue<string>() is "pending" or "solving")
{
    var id = Uri.EscapeDataString(task["id"]!.GetValue<string>());
    task = await Api(HttpMethod.Get, "/tasks/" + id + "?waitMs=15000");
    if (task["status"]!.GetValue<string>() is "pending" or "solving")
        await Task.Delay(1000, deadline.Token);
}
if (task["status"]!.GetValue<string>() != "ready")
    throw new Exception("Task failed: " + task["errorCode"]?.GetValue<string>()
        + ": " + task["error"]?.GetValue<string>());
var solution = task["solution"]!.AsObject();
// Use solution["token"], ["userAgent"] and ["secChUa"] with the original proxy.
Console.WriteLine("Ready task: " + task["id"]!.GetValue<string>());

El POST usa waitMs=0 para devolver una tarea inmediatamente. Después, cada GET espera hasta 15 segundos a que haya una actualización. El bucle continúa mientras el estado sea pending o solving y se detiene en ready o failed.

La solicitud usa Enterprise v3 de forma predeterminada. Para v3 estándar, añade recaptchaType: v3. No incluyas type ni url en el cuerpo de una tarea de reCAPTCHA.

Usa el token en tu aplicación

El token es solution["token"]!.GetValue<string>(). El ID de tarea que imprime el programa sirve para recuperar la tarea; usa el valor del token en el campo CAPTCHA de tu aplicación.

Lee solution["userAgent"] y solution["secChUa"] para las cabeceras User-Agent y sec-ch-ua de la solicitud de destino.

Envía esa solicitud a través del mismo proxy que se utilizó para la resolución. Después, comprueba la respuesta de la aplicación: que se haya generado un token no demuestra que el destino haya aceptado la solicitud.

Si la solicitud falla

Una tarea fallida incluye errorCode y error; el ejemplo se detiene y los muestra. Las resoluciones fallidas se reembolsan. Un error HTTP como 401 o 402 es un problema distinto de la solicitud: consulta la referencia de errores de la API antes de volver a intentarlo.

Conserva el requestId y los datos de entrada exactos de la tarea si necesitas recuperarla tras agotar el tiempo de espera o reiniciar el proceso. Si tienes el ID de la tarea, consúltala. De lo contrario, vuelve a enviar los datos de entrada originales con el mismo requestId. Reiniciar el programa sin más genera otro ID y puede crear otra resolución facturable.

El cliente deja de esperar cuando alcanza su límite de tiempo; eso no cancela una tarea ya creada. Consulta la recuperación tras consultas periódicas y tiempos de espera agotados para ver la secuencia completa.

Ejecuta tu primera tarea.

Empieza con $5 de crédito en tu espacio de trabajo.

Crear un espacio de trabajo
Resuelve reCAPTCHA Enterprise con C# · solvethree