Как решить reCAPTCHA v3 Enterprise на C# (.NET SDK)

recaptcha v3 enterprise in c# - How to Solve reCAPTCHA v3 Enterprise in C# (.NET SDK)

Решение reCAPTCHA v3 Enterprise в C# использует тот же метод, что и любой другой тип reCAPTCHA. Нет RecaptchaEnterpriseAsync. Вы вызываете RecaptchaAsync и передайте два флага: version установлено в v3, и enterprise установлено в 1. Пропустите любой из них — и получите токен для другого продукта, который сайт отклонит.

Вот полный вызов, что action опция на самом деле делает и как определить, какой вариант перед вами.

Version и enterprise — независимые флаги

На этом почти все спотыкаются в первый раз. Enterprise — это не четвёртая версия reCAPTCHA. Это отдельный уровень продукта Google, который работает и в v2, и в v3, поэтому две настройки образуют настоящую матрицу 2×2.

Что запускает сайтПараметры, которые вы передаёте
reCAPTCHA v2 checkboxнет
reCAPTCHA v2 Enterpriseenterprise = 1
reCAPTCHA v3version = "v3"
reCAPTCHA v3 Enterpriseversion = "v3" и enterprise = 1

Передача enterprise = 1 сам по себе даёт вам решение v2 Enterprise и не сработает на странице v3. Это самая частая причина того, что токен возвращается нормально, а затем отклоняется.

Как определить, что страница использует Enterprise

Откройте исходный код страницы и посмотрите, к какому объекту обращается скрипт. Стандартная reCAPTCHA использует grecaptcha. Enterprise использует grecaptcha.enterprise.

// Enterprise pages call grecaptcha.enterprise, not grecaptcha.
// The action name you need is right here in execute().
grecaptcha.enterprise.ready(function () {
  grecaptcha.enterprise.execute("YOUR_SITEKEY", { action: "login" })
    .then(function (token) {
      // token gets posted with the form
    });
});

Ещё два признака: тег script загружает /recaptcha/enterprise.js вместо /recaptcha/api.js, а Enterprise sitekey обычно начинаются с 6L точно так же, как обычные, поэтому сам ключ ничего вам не говорит. Доверяйте скрипту, а не ключу.

Настройка

CapSkip работает на вашем собственном компьютере, поэтому запустите приложение, прежде чем всё это заработает, а затем установите SDK из NuGet:

# .NET Standard 2.0, so .NET Framework 4.6.1+, Core 2.0+
# and every modern .NET release are all supported.
dotnet add package CapSkip

Направьте клиент на порт, указанный в приложении:

using CapSkip;

var solver = new CapSkipClient(
    apiKey: "capskip",        // any string when key validation is off
    host: "127.0.0.1",
    port: 8080,
    recaptchaTimeout: 300);   // seconds; v3 rarely gets near this

Вызов v3 Enterprise

Всё, кроме sitekey и URL, помещается в словарь параметров:

using System.Collections.Generic;
using CapSkip;

var result = await solver.RecaptchaAsync(
    "YOUR_SITEKEY",
    "https://example.com/page-with-recaptcha",
    new Dictionary<string, object?>
    {
        ["version"]    = "v3",
        ["enterprise"] = 1,
        ["action"]     = "login",   // match the page exactly
    });

Console.WriteLine(result.Code);   // g-recaptcha-response token

Сигнатура — RecaptchaAsync(string sitekey, string url, Dictionary<string, object?>? options = null). Словарь допускает значения null, поэтому object? имеет значение, если в вашем проекте включены nullable reference types.

Что на самом деле делает опция action

action работает только с v3. На странице v2 он ничего не делает.

Это метка, которую страница передаёт в grecaptcha.enterprise.execute(). Google оценивает каждое действие отдельно, и бэкенд сайта обычно проверяет, что действие в ответе на верификацию совпадает с ожидаемым. Если на странице указано login и вы решаете со значением по умолчанию, ваш токен действителен, но всё равно отбрасывается. Копируйте строку дословно, включая регистр. Google ограничивает действия буквенно-цифровыми символами, слэшами и подчёркиваниями, поэтому экранировать ничего экзотического не нужно.

Ошибка происходит тихо. Никаких ошибок не возникает, потому что на стороне распознавания всё прошло правильно. Вы просто получаете токен, который эндпоинт отклоняет.

Опции минимального score не существует

Стоит сказать прямо, ведь некоторые API для распознавания это рекламируют: вы не запрашиваете у CapSkip токен с определённым баллом. Балл — это оценка Google, формируемая, когда целевой сайт проверяет токен, и ни один параметр запроса на решение не задаёт для него нижнюю границу. Если вы видели min_score поле в другом месте и искали здесь эквивалент, то вот почему вы не можете его найти.

Отправка токена

Токен вставляется в поле, которое отправляет страница, обычно это g-recaptcha-response:

using System.Net.Http;

using var http = new HttpClient();

var form = new FormUrlEncodedContent(new[]
{
    new KeyValuePair<string, string>(
        "g-recaptcha-response", result.Code),
    new KeyValuePair<string, string>("username", "demo"),
});

var response = await http.PostAsync(
    "https://example.com/login", form);

Одно, что здесь не нужно: result.UserAgent. Оно заполняется только для Turnstile и равно null для каждого решения reCAPTCHA. Если вы скопировали хелпер из кода Turnstile, удалите этот заголовок, а не отправляйте null.

Токены reCAPTCHA тоже недолговечны. Google аннулирует их через две минуты, поэтому решайте капчу в момент, когда вы готовы к отправке, а не в начале длинного процесса.

А что насчёт v2 Enterprise?

Тот же метод, другие опции. Вставьте version и action, и добавьте datas если Google передал странице data-s значение:

var v2 = await solver.RecaptchaAsync(sitekey, pageUrl,
    new Dictionary<string, object?>
    {
        ["enterprise"] = 1,
        ["datas"]      = "YOUR_DATA_S_VALUE",
    });

data-s появляется на собственных ресурсах Google и почти нигде больше. Если вы не можете найти его на странице, значит он вам не нужен.

Обработка сбоев

Каждое исключение SDK наследуется от CapSkipError. Есть одна ловушка .NET, о которой стоит знать, прежде чем писать блоки catch.

using System;
using CapSkip;

try
{
    var result = await solver.RecaptchaAsync(sitekey, pageUrl, options);
}
catch (CapSkip.ValidationException) { /* bad parameters */ }
catch (NetworkException)            { /* CapSkip is not running */ }
catch (ApiException)                { /* API returned an error */ }
catch (CapSkip.TimeoutException)    { /* exceeded recaptchaTimeout */ }
catch (CapSkipError)                { /* anything else from the SDK */ }

TimeoutException и ValidationException существуют в обоих System и CapSkip. Когда импортированы оба пространства имён, неуточнённый catch разрешается в System тип и молча никогда не срабатывает. Уточняйте их или перехватывайте CapSkipError и изучите его.

Частые ошибки

КодПричинаИсправить
ERROR_GOOGLEKEYSitekey пуст или имеет неверный форматСчитайте его заново с «живой» страницы, а не из кешированной копии
ERROR_PAGEURLURL отсутствует или не является полным абсолютным URLУкажите схему и используйте страницу, на которой находится виджет
ERROR_BAD_PARAMETERSЗначение параметра имеет неверный типПроверить enterprise это число 1, а не строка “1”
ERROR_CAPTCHA_UNSOLVABLEРешение не удалось завершитьУбедитесь, что флаги версии совпадают со страницей, затем добавьте прокси на том же сетевом пути

Полный список параметров для каждого типа находится в Документация по API.

Часто задаваемые вопросы

Есть ли отдельный метод для Enterprise?

Нет. RecaptchaAsync обрабатывает все четыре комбинации. Enterprise — это флаг в словаре параметров, и он работает вместе с version а не заменяя его.

Что произойдёт, если я неправильно укажу имя action?

Вы получаете полностью валидный токен, который сайт отклоняет. Google возвращает action вместе со score во время проверки, и большинство бэкендов сравнивают его с тем, что ожидали. Со стороны сервиса распознавания капчи ошибки нет, потому что при решении ничего не пошло не так.

Нужен ли прокси для v3 Enterprise?

Только когда сайт чувствителен к геолокации или оценка зависит от IP запроса. Передайте ["proxy"] = new Proxy("HTTPS", "user:[email protected]:3128") в том же словаре options. Прокси поддерживаются для reCAPTCHA, Turnstile и GeeTest, но не для графических капч.

Могу ли я решать несколько страниц одновременно?

Да. Каждый метод возвращает Task, поэтому await Task.WhenAll(...) — это всё, что вам нужно. SDK экспортирует AsyncCapSkip тоже, но в .NET это просто псевдоним CapSkipClient, сохранён, чтобы код, перенесённый из Python SDK, по-прежнему компилировался. Он ничего не добавляет.

Сводка

Один метод, два флага. Установите version в v3 и enterprise в 1, скопируйте action точно со страницы, затем отправьте result.Code в течение двух минут. Здесь нет score, который нужно настраивать, поэтому, если токен отклонён, сначала проверьте action и флаги.

Остальная часть .NET API находится на Решатель капчи на C# странице, Поддержка Enterprise охватывает другие языки, а Решение reCAPTCHA v3 подробнее рассматривает оценку. CapSkip — это локальный сервис распознавания капчи, поэтому каждое из этих решений происходит на вашей собственной машине.