API Tutorials

Как решить reCAPTCHA v2 Enterprise с помощью API

Если в исходнике страницы видно grecaptcha.enterprise.execute вместо привычного grecaptcha.render, значит перед вами reCAPTCHA v2 Enterprise, а не обычная v2. Решается она через CaptchaAI почти так же — запрос отличается всего одним параметром: enterprise=1.

В этом руководстве — как отличить Enterprise-виджет от стандартного, откуда взять sitekey и необязательный data-s, и рабочий код на Python и Node.js для полного цикла: отправка задачи → опрос результата → внедрение токена на странице.

Не уверены, что перед вами именно Enterprise? Сначала прочитайте как определить внедрение reCAPTCHA Enterprise.


Что нужно подготовить заранее

Требование Детали
API-ключ CaptchaAI Получите на captchaai.com/api.php
URL целевой страницы Полный адрес страницы, где отображается reCAPTCHA
Sitekey Значение атрибута data-sitekey
Признак Enterprise Подтверждается тегом скрипта enterprise.js
Значение data-s (если есть) Дополнительный токен, который требуют некоторые Enterprise-реализации

Шаг 1. Определите: Enterprise перед вами или обычная v2

Откройте исходный код страницы и поищите такие признаки:

// Enterprise script tag (NOT api.js)
// <script src="https://www.google.com/recaptcha/enterprise.js?render=SITEKEY"></script>

// Enterprise JavaScript object
// grecaptcha.enterprise.render(...)
// grecaptcha.enterprise.execute(...)

Если видите enterprise.js или grecaptcha.enterprise — это Enterprise. Если встречаются api.js и просто grecaptcha — перед вами стандартная версия.

Быстрая проверка без просмотра исходников

  • В DevTools → Network найдите запрос к enterprise.js.
  • В консоли браузера выполните typeof grecaptcha.enterprise — ответ "object" подтверждает Enterprise.

Шаг 2. Извлеките sitekey и data-s

# Sitekey: from data-sitekey attribute
# <div class="g-recaptcha" data-sitekey="6LcR_RsTAAAA..." data-s="..."></div>

# Or from enterprise.js render parameter
# https://www.google.com/recaptcha/enterprise.js?render=6LcR_RsTAAAA...

Дополнительно проверьте атрибут data-s — некоторым Enterprise-реализациям нужен второй токен сессии, без которого решение не примут.

Если data-s нет на странице

Просто не передавайте этот параметр в запросе — пустое значение CaptchaAI не требуется, а лишний ключ пользы не добавит.

Шаг 3. Отправьте запрос в CaptchaAI с enterprise=1

import requests

params = {
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "googlekey": "6LcR_RsTAAAAAFJR-JhNbC6CC42wKCbR9Hq_kVCd",
    "pageurl": "https://staging.example.com/qa-login",
    "enterprise": 1,  # Required for Enterprise
    "json": 1
}

# Include data-s if present on the page
# params["data-s"] = "data-s-value-from-page"

response = requests.get("https://ocr.captchaai.com/in.php", params=params)
data = response.json()
task_id = data["request"]
print(f"Task ID: {task_id}")
const params = new URLSearchParams({
  key: "YOUR_API_KEY",
  method: "userrecaptcha",
  googlekey: "6LcR_RsTAAAAAFJR-JhNbC6CC42wKCbR9Hq_kVCd",
  pageurl: "https://staging.example.com/qa-login",
  enterprise: 1,
  json: 1,
});

const res = await fetch(`https://ocr.captchaai.com/in.php?${params}`);
const data = await res.json();
console.log(`Task ID: ${data.request}`);

Успешный ответ in.php содержит не сам токен, а request с ID задачи — сам токен reCAPTCHA вы получите на следующем шаге, опросив res.php.

Параметр Стандартная v2 Enterprise
method userrecaptcha userrecaptcha (без изменений)
googlekey sitekey со страницы тот же sitekey со страницы
enterprise не передаётся 1
data-s обычно не требуется передайте, если атрибут есть на странице

Шаг 4. Опросите res.php до получения токена

import time

for _ in range(40):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY",
        "action": "get",
        "id": task_id,
        "json": 1
    }).json()

    if result.get("status") == 1:
        token = result["request"]
        print(f"Token: {token[:50]}...")
        break
    if result.get("request") != "CAPCHA_NOT_READY":
        raise RuntimeError(f"Error: {result['request']}")
let token;
for (let i = 0; i < 40; i++) {
  await new Promise((r) => setTimeout(r, 5000));
  const res = await fetch(
    `https://ocr.captchaai.com/res.php?${new URLSearchParams({
      key: "YOUR_API_KEY", action: "get", id: taskId, json: 1,
    })}`
  );
  const data = await res.json();
  if (data.status === 1) { token = data.request; break; }
  if (data.request !== "CAPCHA_NOT_READY") throw new Error(data.request);
}

Решение reCAPTCHA v2 Enterprise обычно укладывается в 60 секунд при высокой конкурентности запросов — так же, как у стандартной reCAPTCHA v2. Если первый прогон занимает заметно дольше, чаще всего дело в слишком редком опросе res.php, а не в самой задаче.

Шаг 5. Внедрите токен на странице

Способ внедрения не отличается от стандартной v2:

from selenium import webdriver

driver = webdriver.Chrome()
driver.get("https://staging.example.com/qa-login")

# Inject token into hidden field
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").innerHTML = "{token}";'
)

# Check for callback
callback = driver.execute_script(
    'var el = document.querySelector(".g-recaptcha"); '
    'return el ? el.getAttribute("data-callback") : null;'
)
if callback:
    driver.execute_script(f'{callback}("{token}");')
else:
    driver.find_element("css selector", "form").submit()

Если после отправки токена целевая страница по-прежнему показывает CAPTCHA, проверьте по порядку:

  1. Включён ли enterprise=1 в запросе.
  2. Совпадает ли sitekey с атрибутом data-sitekey на странице.
  3. Передан ли data-s, если он присутствует в разметке.
  4. Не истекли ли ~2 минуты жизни токена с момента получения от res.php.

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

Нужен ли отдельный API-ключ для Enterprise?

Нет — используется тот же API-ключ CaptchaAI и тот же баланс потоков, что и для обычной reCAPTCHA v2. Меняется только один параметр запроса: enterprise=1.

Чем reCAPTCHA v2 Enterprise отличается от v3 Enterprise?

v2 Enterprise — тот же чекбокс-виджет, что и в обычной v2, но токен проверяется через Enterprise API Google вместо публичного siteverify. v3 Enterprise работает без виджета и возвращает числовой score вместо токена подтверждения. CaptchaAI решает оба варианта, но структура запроса и обработка результата у них разные.

Работает ли тот же подход для invisible-варианта Enterprise?

Да. reCAPTCHA v2 Invisible Enterprise отправляется в CaptchaAI тем же методом userrecaptcha с параметром enterprise=1 — чекбокс не показывается, но sitekey и логика решения не меняются.

Нужно ли менять способ внедрения токена для Enterprise?

Нет. Запись токена в скрытое поле g-recaptcha-response и вызов callback-функции, если она есть, — идентичны стандартной v2 (см. шаг 5 выше). Enterprise влияет на то, как токен запрашивается и проверяется, а не на то, как он передаётся на странице.

Можно ли использовать токен reCAPTCHA v2 Enterprise повторно?

Нет. Как и в стандартной v2, токен Enterprise одноразовый и действует примерно 2 минуты — используйте его сразу после получения от res.php.

Отличается ли цена CaptchaAI для Enterprise?

Нет отдельного тарифа под Enterprise — тарификация CaptchaAI единая для всех вариантов reCAPTCHA, по числу потоков в долларах. Актуальные цены и лимиты потоков уточняйте на captchaai.com, условия могут обновляться.


Готовый код целиком

Ниже — самодостаточная функция: отправка задачи, опрос и обработка ошибок в одном месте. Такую обёртку удобно вставить прямо в воркер или CI-скрипт.

import requests
import time

def solve_recaptcha_v2_enterprise(api_key, sitekey, page_url, data_s=None):
    params = {
        "key": api_key, "method": "userrecaptcha",
        "googlekey": sitekey, "pageurl": page_url,
        "enterprise": 1, "json": 1
    }
    if data_s:
        params["data-s"] = data_s

    submit = requests.get("https://ocr.captchaai.com/in.php", params=params).json()
    if submit.get("status") != 1:
        raise RuntimeError(f"Submit error: {submit.get('request')}")

    task_id = submit["request"]

    for _ in range(40):
        time.sleep(5)
        result = requests.get("https://ocr.captchaai.com/res.php", params={
            "key": api_key, "action": "get", "id": task_id, "json": 1
        }).json()
        if result.get("status") == 1:
            return result["request"]
        if result.get("request") != "CAPCHA_NOT_READY":
            raise RuntimeError(f"Solve error: {result.get('request')}")

    raise TimeoutError("Solve timed out after 200s")

# Usage
token = solve_recaptcha_v2_enterprise("YOUR_API_KEY", "6LcR_RsTAAAA...", "https://staging.example.com/qa-login")
print(f"Solved: {token[:50]}...")

Нужен полный проект с обработкой ошибок?

Нужен целиком рабочий проект — с настройкой окружения, повторными попытками и обработкой ошибок из коробки?

  1. Склонируйте репозиторий с примерами.
  2. Задайте переменную окружения со своим API-ключом CaptchaAI.
  3. Запустите скрипт для reCAPTCHA v2 Enterprise — enterprise=1 там уже включён.

Смотрите полный пример на GitHub →


Пример: сколько потоков закладывать под Enterprise

Сценарий: QA-автотесты логина в CI

Частый сценарий — QA-команда гоняет автотесты логина через staging-окружение с reCAPTCHA v2 Enterprise (см. staging.example.com/qa-login в примерах выше). Для одного CI-пайплайна хватает тарифа BASIC ($15/мес, 5 потоков). Для параллельных прогонов в нескольких окружениях логичнее взять ADVANCE ($90/мес, 50 потоков) — иначе задачи встанут в очередь. Помесячная оплата в долларах не зависит от количества перезапусков из-за нестабильных тестов, так что бюджет предсказуем даже при частых ретраях в CI.


Готовы подключить Enterprise?

Получите API-ключ на captchaai.com/api.php, добавьте enterprise=1 к своему рабочему коду решения reCAPTCHA v2 — и Enterprise-виджет решается тем же пайплайном.


Связанные материалы

Комментарии для этой статьи отключены.