Resuelve reCAPTCHA Enterprise con C#
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_KEYcon la clave de API de tu espacio de trabajo ySOLVETHREE_PROXYcon la URL de tu proxy HTTP(S). - Sustituye
accounts.example.comyloginpor tu nombre de host y la acción que utiliza la página. Usa un nombre de host parasite, 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.
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.
Fuentes y referencia de la API
Ejecuta tu primera tarea.
Empieza con $5 de crédito en tu espacio de trabajo.