Résoudre reCAPTCHA Enterprise avec C#

Par solvethree3 min de lecture

Vous pouvez appeler solvethree directement depuis C#. L’exemple ci-dessous demande un jeton reCAPTCHA v3 Enterprise, suit la tâche jusqu’à sa fin et s’arrête si la résolution échoue.

Sur cette page

Avant l’exécution

Utilisez .NET 8+. Aucun package NuGet supplémentaire n’est nécessaire.

  • Créez un profil de site actif pour votre nom d’hôte cible dans la console. Consultez la configuration du profil de site.
  • Définissez SOLVETHREE_API_KEY sur la clé API de votre espace de travail et SOLVETHREE_PROXY sur l’URL de votre proxy HTTP(S).
  • Remplacez accounts.example.com et login par votre nom d’hôte et l’action utilisée par la page. Pour site, utilisez un nom d’hôte, sans schéma ni chemin.

Créer la tâche et attendre le résultat

Créez un projet console .NET avec dotnet new console, remplacez Program.cs par ce code et exécutez 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>());

La requête POST utilise waitMs=0 pour renvoyer immédiatement une tâche. Chaque requête GET attend ensuite jusqu’à 15 secondes une mise à jour. La boucle continue pour pending ou solving, et s’arrête à ready ou failed.

La requête utilise Enterprise v3 par défaut. Pour la version v3 standard, ajoutez recaptchaType: v3. N’incluez pas type ni url dans le corps d’une tâche reCAPTCHA.

Utiliser le jeton dans votre application

Le jeton se trouve dans solution["token"]!.GetValue<string>(). L’identifiant de tâche affiché par le programme sert à récupérer la tâche ; utilisez la valeur du jeton dans le champ CAPTCHA de votre application.

Lisez solution["userAgent"] et solution["secChUa"] pour renseigner les en-têtes User-Agent et sec-ch-ua de la requête cible.

Envoyez cette requête via le même proxy que celui utilisé pour la résolution. Vérifiez ensuite la réponse de l’application : la génération d’un jeton ne prouve pas que la cible a accepté la requête.

Si la requête échoue

Une tâche ayant échoué contient errorCode et error ; l’exemple s’arrête et les affiche. Les résolutions échouées sont remboursées. Une erreur HTTP telle que 401 ou 402 correspond à un problème de requête distinct : consultez la référence des erreurs de l’API avant de réessayer.

Conservez le requestId et les paramètres exacts de la tâche si vous devez la récupérer après un dépassement de délai ou un redémarrage du processus. Si vous disposez de l’identifiant de tâche, interrogez-la. Sinon, renvoyez les paramètres d’origine avec le même requestId. Un simple redémarrage du programme génère un autre identifiant et peut créer une autre résolution facturable.

L’appelant cesse d’attendre une fois son délai dépassé ; cela n’annule pas une tâche déjà créée. Consultez la procédure complète d’interrogation périodique et de récupération après dépassement de délai.

Lancez votre première tâche.

Démarrez avec $5 de crédit dans votre espace de travail.

Créer un espace de travail
Résoudre reCAPTCHA Enterprise avec C# · solvethree