Решение reCAPTCHA Enterprise с C#

Автор: solvethree2 мин на чтение

Вы можете обращаться к solvethree напрямую из C#. Пример ниже запрашивает токен reCAPTCHA v3 Enterprise, отслеживает задачу до завершения и останавливается при неудачном решении.

На этой странице

Перед запуском

Используйте .NET 8+. Дополнительные пакеты NuGet не нужны.

  • Создайте в консоли активный профиль сайта для целевого имени хоста. См. настройку профиля сайта.
  • Задайте для SOLVETHREE_API_KEY API-ключ вашего рабочего пространства, а для SOLVETHREE_PROXY — URL вашего HTTP(S)-прокси.
  • Замените accounts.example.com и login на своё имя хоста и действие, используемое страницей. В site укажите имя хоста без схемы и пути.

Создайте задачу и дождитесь результата

Создайте консольный проект .NET командой dotnet new console, замените содержимое Program.cs этим кодом и выполните 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>());

POST использует waitMs=0, чтобы сразу вернуть задачу. Затем каждый GET ожидает обновления до 15 секунд. Цикл продолжается при статусе pending или solving и останавливается при ready или failed.

По умолчанию запрос использует Enterprise v3. Для стандартной v3 добавьте recaptchaType: v3. Не включайте type и url в тело задачи reCAPTCHA.

Используйте токен в своём приложении

Токен находится в solution["token"]!.GetValue<string>(). ID задачи, который выводит программа, нужен для получения задачи; в поле CAPTCHA вашего приложения передавайте значение токена.

Прочитайте solution["userAgent"] и solution["secChUa"] для заголовков User-Agent и sec-ch-ua запроса к целевому приложению.

Отправьте этот запрос через тот же прокси, который использовался для решения. Затем проверьте ответ приложения: сгенерированный токен не подтверждает, что целевое приложение приняло запрос.

Если запрос завершился ошибкой

Задача с неудачным результатом содержит errorCode и error; пример останавливается и выводит их. Стоимость неудачных решений возвращается. Ошибка HTTP, например 401 или 402, — отдельная проблема запроса. Перед повторной попыткой сверьтесь со справочником ошибок API.

Сохраните requestId и точные входные данные задачи, если требуется восстановление после тайм-аута или перезапуска процесса. Если у вас есть ID задачи, опрашивайте её статус. В противном случае повторно отправьте исходные данные с тем же requestId. Простой перезапуск программы генерирует другой ID и может создать ещё одно платное решение.

Вызывающий код прекращает ожидание по истечении своего срока; уже созданная задача при этом не отменяется. Полная последовательность описана в руководстве по опросу статуса и восстановлению после тайм-аутов.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Решение reCAPTCHA Enterprise с C# · solvethree