Сравнения

Руководство по решению стандартного и корпоративного reCAPTCHA v3

Обе версии работают незаметно и возвращают оценку риска (от 0,0 до 1,0). Enterprise добавляет коды причин, адаптивные пороговые значения и управление проектами Google Cloud, но с точки зрения решения CaptchaAI единственная разница в параметрах — это enterprise=1. Задача состоит в том, чтобы определить, какую версию использует сайт, поскольку обе версии невидимы.


Сравнение функций

Особенность Стандарт v3 Предприятие v3
Невидимая операция Да Да
Оценка (0,0–1,0) Да Да
Параметр действия Необходимый Необходимый
JS-файл api.js?render=KEY enterprise.js?render=KEY
Выполнить функцию grecaptcha.execute() grecaptcha.enterprise.execute()
Коды причин Нет Да (АВТОМАТИЗАЦИЯ, СЛИШКОМ_МНОГО_ТРАФИКА и т. д.)
Пользовательские пороговые значения для каждого действия Нет Да (через Cloud Console)
Обнаружение утечки пароля Нет Да
Защитник аккаунта Нет Да
Конечная точка проверки siteverify (бесплатно) recaptchaenterprise.googleapis.com (оплачено)
Параметры CaptchaAI version=v3 version=v3 + enterprise=1
Типичное время решения 10-20 секунд 10-20 секунд

Как определить, какую версию использует сайт

Поскольку обе версии невидимы (нет видимого виджета), обнаружение должно полагаться на JavaScript:

Обнаружение Python:

import requests
import re

def detect_v3_type(url):
    resp = requests.get(url)
    html = resp.text

    # Check for enterprise.js
    if "enterprise.js" in html:
        version = "enterprise_v3"
        execute_fn = "grecaptcha.enterprise.execute"
    elif "recaptcha/api.js" in html and "render=" in html:
        version = "standard_v3"
        execute_fn = "grecaptcha.execute"
    else:
        return None

    # Extract sitekey from render parameter
    key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
    sitekey = key_match.group(1) if key_match else None

    # Extract action parameter
    action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
    action = action_match.group(1) if action_match else "unknown"

    return {
        "version": version,
        "sitekey": sitekey,
        "action": action,
        "execute_fn": execute_fn
    }

info = detect_v3_type("https://https://staging.example.com/qa-login")
print(info)

Обнаружение Node.js:

const axios = require("axios");

async function detectV3Type(url) {
  const { data: html } = await axios.get(url);

  let version, executeFn;
  if (html.includes("enterprise.js")) {
    version = "enterprise_v3";
    executeFn = "grecaptcha.enterprise.execute";
  } else if (html.includes("recaptcha/api.js") && html.includes("render=")) {
    version = "standard_v3";
    executeFn = "grecaptcha.execute";
  } else {
    return null;
  }

  const keyMatch = html.match(/render[=:]\s*['"]?([A-Za-z0-9_-]{40})/);
  const actionMatch = html.match(/action['"]?\s*[:=]\s*['"](\w+)/);

  return {
    version,
    sitekey: keyMatch?.[1] || null,
    action: actionMatch?.[1] || "unknown",
    executeFn,
  };
}

Быстрая проверка в консоли браузера:

// Paste in DevTools console
if (document.querySelector('script[src*="enterprise.js"]')) {
  console.log("Enterprise v3");
  console.log("Execute:", typeof grecaptcha?.enterprise?.execute);
} else if (document.querySelector('script[src*="api.js"][src*="render="]')) {
  console.log("Standard v3");
  console.log("Execute:", typeof grecaptcha?.execute);
}

Решение с помощью CaptchaAI

Стандарт v3

import requests
import time

# Submit
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "googlekey": sitekey,
    "action": "login",
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

# Poll
for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Предприятие v3

import requests
import time

# Submit — add enterprise=1
resp = requests.get("https://ocr.captchaai.com/in.php", params={
    "key": "YOUR_API_KEY",
    "method": "userrecaptcha",
    "version": "v3",
    "enterprise": 1,  # Required for Enterprise
    "googlekey": sitekey,
    "action": "login",
    "pageurl": page_url
})
task_id = resp.text.split("|")[1]

# Polling is identical to standard
for _ in range(60):
    time.sleep(5)
    result = requests.get("https://ocr.captchaai.com/res.php", params={
        "key": "YOUR_API_KEY", "action": "get", "id": task_id
    })
    if result.text.startswith("OK|"):
        token = result.text.split("|")[1]
        break

Универсальный решатель с автоопределением

import requests
import time
import re

class RecaptchaV3Solver:
    def __init__(self, api_key):
        self.api_key = api_key

    def detect_and_solve(self, page_url, action=None):
        """Auto-detect standard vs enterprise and solve."""
        html = requests.get(page_url).text

        is_enterprise = "enterprise.js" in html
        key_match = re.search(r'render[=:]\s*["\']?([A-Za-z0-9_-]{40})', html)
        if not key_match:
            raise Exception("No v3 sitekey found")
        sitekey = key_match.group(1)

        if not action:
            action_match = re.search(r'action["\']?\s*[:=]\s*["\'](\w+)', html)
            action = action_match.group(1) if action_match else "verify"

        params = {
            "key": self.api_key,
            "method": "userrecaptcha",
            "version": "v3",
            "googlekey": sitekey,
            "action": action,
            "pageurl": page_url
        }
        if is_enterprise:
            params["enterprise"] = 1

        resp = requests.get("https://ocr.captchaai.com/in.php", params=params)
        if not resp.text.startswith("OK|"):
            raise Exception(f"Submit failed: {resp.text}")

        task_id = resp.text.split("|")[1]
        for _ in range(60):
            time.sleep(5)
            result = requests.get("https://ocr.captchaai.com/res.php", params={
                "key": self.api_key, "action": "get", "id": task_id
            })
            if result.text.startswith("OK|"):
                return result.text.split("|")[1]
            if result.text != "CAPCHA_NOT_READY":
                raise Exception(f"Solve failed: {result.text}")

        raise Exception("Timed out")

solver = RecaptchaV3Solver("YOUR_API_KEY")
token = solver.detect_and_solve("https://https://staging.example.com/qa-login", action="login")
print(f"Token: {token[:40]}...")

Распространенные ошибки

Ошибка Результат Исправить
Использование enterprise=1 в стандартной версии v3 Токен может быть недействительным. Прежде чем добавлять флаг, проверьте наличие enterprise.js.
Пропуск enterprise=1 в Enterprise v3 Токен отклонен серверной частью Всегда добавляйте, когда присутствует enterprise.js.
Неправильный параметр action Низкий балл, токен отклонен Извлеките точную строку действия из JavaScript страницы.
Пропуск version=v3 Решатель рассматривает это как v2 Всегда включайте version=v3 для reCAPTCHA на основе оценок.
Использование v2 sitekey для решения v3 ERROR_WRONG_GOOGLEKEY Ключи сайта v3 берутся из параметра render=KEY.

Извлечение параметра действия

Параметр action важен для версии 3 — как стандартной, так и корпоративной. Если вы отправите неправильное действие, оценка будет низкой, и токен может быть отклонен.

import re

def find_v3_actions(html):
    """Extract all action parameters from page JavaScript."""
    # Look for grecaptcha.execute(key, {action: '...'})
    pattern = r"(?:grecaptcha\.(?:enterprise\.)?execute|action)\s*[(:]\s*['\"](\w+)"
    actions = re.findall(pattern, html)
    return list(set(actions))

# Common actions: "login", "submit", "register", "checkout", "homepage"

передача токена во внутренний QA endpoint

Один и тот же подход для обеих версий:

# For browser-based workflows (Selenium)
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)

# For pure HTTP workflows
requests.post(page_url, data={
    "g-recaptcha-response": token,
    "username": "user",
    "password": "pass"
})
// Puppeteer
await page.evaluate((tok) => {
  document.getElementById("g-recaptcha-response").value = tok;
}, token);

// Pure HTTP (axios)
await axios.post(pageUrl, new URLSearchParams({
  "g-recaptcha-response": token,
  username: "user",
  password: "pass",
}));

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

Дает ли Enterprise v3 разные оценки?

Модель оценки аналогична, но Enterprise может использовать дополнительные сигналы и пользовательские пороговые значения. CaptchaAI обрабатывает оба одинаково — возвращаемый токен работает независимо от того, какую модель использует Google.

Как обнаружить Enterprise v3 на странице?

Найдите enterprise.js вместо api.js в теге скрипта и grecaptcha.enterprise.execute() в JavaScript. Оба невидимы, поэтому визуальной разницы нет.

Является ли решение Enterprise v3 более дорогим?

Проверьте текущие цены CaptchaAI. Цены на корпоративные решения могут отличаться, но усилия по интеграции API идентичны стандартным.

Что делать, если я не могу найти параметр действия?

Попробуйте общие значения: "verify", "submit", "homepage", "login". Если токен по-прежнему отклонен, используйте DevTools браузера для поиска execute( в скриптах страницы и найдите точную строку действия.

Может ли сайт переключаться между стандартным и корпоративным режимом без предварительного уведомления?

Да. Сайты могут перейти на версию Enterprise в любое время. Настройте свое обнаружение так, чтобы оно запускалось при каждой загрузке страницы, а не жестко программируйте версию.


Связанные руководства

  • reCAPTCHA v3 Enterprise против Стандарта— альтернативный угол сравнения
  • reCAPTCHA Enterprise против Standard — Полное руководство— охватывает все версии
  • Как решить reCAPTCHA v3 с помощью API— стандартное руководство v3
  • Как решить reCAPTCHA v3 Enterprise с помощью API— руководство по корпоративной версии 3
  • Описание параметра действия reCAPTCHA v3— глубокое погружение в параметр действия

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

Приведет ли использование неправильного корпоративного флага к сбоям?

Часто да. Сайты, использующие Enterprise, проверяют токены с помощью Enterprise API, который ожидает токены Enterprise. Стандартные токены могут не пройти проверку, и наоборот.

Как программно обнаружить Enterprise v3?

Найдите источник страницы для enterprise.js:

page_source = driver.page_source
is_enterprise = "enterprise.js" in page_source

Есть ли разница в производительности?

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


Связанные руководства

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