Сравнения

Отличия стандартного и корпоративного решателя reCAPTCHA v2

В обеих версиях присутствует один и тот же флажок «Я не робот» и проблемы с сеткой изображений. Разница заключается в серверной части: Enterprise добавляет коды причин, пользовательские правила и интеграцию с Google Cloud. Единственным изменением для решения проблемы является добавление enterprise=1 к вашему запросу CaptchaAI, но определение того, какую версию использует сайт, — это та часть, в которой разработчики ошибаются чаще всего.


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

Особенность Стандарт v2 Предприятие v2
Виджет флажка Да — идентичный внешний вид Да — идентичный внешний вид
Проблемы с имиджем Сетки 3×3 или 4×4 Сетки 3×3 или 4×4
JS-файл api.js enterprise.js
Выполнить функцию grecaptcha.execute() grecaptcha.enterprise.execute()
API проверки siteverify (бесплатно) recaptchaenterprise.googleapis.com (оплачено)
Коды причин Нет Да (АВТОМАТИЗАЦИЯ, СЛИШКОМ_МНОГО_ТРАФИКА и т. д.)
Пользовательские правила Нет Да (пороговые значения для каждого действия)
Облачная консоль Google Нет Да (управление на основе проектов)
Обнаружение утечки пароля Нет Да
Формат токена Та же структура Та же структура
Параметр CaptchaAI enterprise=1
Типичное время решения 10-30 секунд 10-30 секунд

Как обнаружить Enterprise v2

Ключевое различие заключается в том, какой файл JavaScript загружается на странице:

Проверьте тег сценария:

<!-- Standard v2 -->
<script src="https://www.google.com/recaptcha/api.js"></script>

<!-- Enterprise v2 -->
<script src="https://www.google.com/recaptcha/enterprise.js"></script>

Автоматическое обнаружение (Python):

import requests
from bs4 import BeautifulSoup

def detect_recaptcha_version(url):
    resp = requests.get(url)
    soup = BeautifulSoup(resp.text, "html.parser")

    enterprise_script = soup.find("script", src=lambda s: s and "enterprise.js" in s)
    standard_script = soup.find("script", src=lambda s: s and "recaptcha/api.js" in s)

    widget = soup.find(class_="g-recaptcha")
    sitekey = widget["data-sitekey"] if widget else None

    if enterprise_script:
        return {"version": "enterprise_v2", "sitekey": sitekey}
    elif standard_script:
        return {"version": "standard_v2", "sitekey": sitekey}
    return None

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

Автоматическое обнаружение (Node.js):

const axios = require("axios");
const cheerio = require("cheerio");

async function detectRecaptchaVersion(url) {
  const { data } = await axios.get(url);
  const $ = cheerio.load(data);

  const hasEnterprise = $('script[src*="enterprise.js"]').length > 0;
  const hasStandard = $('script[src*="recaptcha/api.js"]').length > 0;
  const sitekey = $(".g-recaptcha").attr("data-sitekey");

  if (hasEnterprise) return { version: "enterprise_v2", sitekey };
  if (hasStandard) return { version: "standard_v2", sitekey };
  return null;
}

Проверка консоли браузера:

// Quick check in DevTools
if (document.querySelector('script[src*="enterprise.js"]')) {
  console.log("Enterprise v2");
} else if (document.querySelector('script[src*="recaptcha/api.js"]')) {
  console.log("Standard v2");
}

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

Стандарт v2

import requests
import time

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

# Poll for token
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

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

import requests
import time

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

# Polling is identical
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
from bs4 import BeautifulSoup

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

    def detect_and_solve(self, page_url, page_html=None):
        if not page_html:
            page_html = requests.get(page_url).text

        soup = BeautifulSoup(page_html, "html.parser")
        is_enterprise = bool(soup.find("script", src=lambda s: s and "enterprise.js" in s))
        widget = soup.find(class_="g-recaptcha")
        sitekey = widget["data-sitekey"] if widget else None

        if not sitekey:
            raise Exception("No reCAPTCHA sitekey found on page")

        params = {
            "key": self.api_key,
            "method": "userrecaptcha",
            "googlekey": sitekey,
            "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 {
                    "token": result.text.split("|")[1],
                    "is_enterprise": is_enterprise,
                    "sitekey": sitekey
                }
            if result.text != "CAPCHA_NOT_READY":
                raise Exception(f"Solve failed: {result.text}")

        raise Exception("Solve timed out")


solver = RecaptchaV2Solver("YOUR_API_KEY")
result = solver.detect_and_solve("https://https://staging.example.com/qa-login")
print(f"Enterprise: {result['is_enterprise']}, Token: {result['token'][:40]}...")

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

Ошибка Что происходит Исправить
Использование enterprise=1 в стандартной версии v2 Может возвращать недействительные токены Прежде чем добавлять флаг, проверьте наличие enterprise.js.
Пропуск enterprise=1 в Enterprise v2 Токен может быть отклонен серверной частью сайта Всегда добавляйте enterprise=1, если присутствует enterprise.js.
Использование неправильного ключа сайта ERROR_WRONG_GOOGLEKEY Выдержка из data-sitekey об элементе .g-recaptcha.
Путаница v2 Enterprise с v3 Enterprise Неправильные параметры решения v2 имеет флажок; v3 невидим со счетом

передача токена во внутренний QA endpoint — одинаково для обоих

# Selenium injection — works for both standard and enterprise
driver.execute_script(
    f'document.getElementById("g-recaptcha-response").value = "{token}";'
)

# If the page uses a callback function
callback = driver.find_element("css selector", ".g-recaptcha").get_attribute("data-callback")
if callback:
    driver.execute_script(f'{callback}("{token}");')
// Puppeteer injection — works for both
await page.evaluate((token) => {
  document.getElementById("g-recaptcha-response").value = token;
  // Find and call callback if present
  const widget = document.querySelector(".g-recaptcha");
  const cb = widget?.getAttribute("data-callback");
  if (cb && typeof window[cb] === "function") {
    window[cb](token);
  }
}, token);

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

Труднее ли решить Enterprise v2?

Нет. Механика испытаний идентична — тот же флажок, те же сетки изображений. Enterprise добавляет серверную аналитику (коды причин, пользовательские пороговые значения), но не меняет сложность задачи для решателя.

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

Почти. Единственная разница в параметрах — enterprise=1. Используйте описанный выше подход автоматического обнаружения, чтобы создать одну кодовую базу, которая обрабатывает оба. Обнаружение, опрос и передача токена во внутренний QA endpoint идентичны.

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

Нет. Коды причин возвращаются Google на серверную часть веб-сайта во время проверки. Они невидимы для решателя CAPTCHA. Интеграция CaptchaAI не требует внесения изменений в коды причин.

Стоит ли решение Enterprise v2 дороже?

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

Как узнать, правильно ли сработало обнаружение?

Если вы отправите enterprise=1 для стандартного сайта, решение может быть успешным, но токен может быть отклонен целевым сайтом. Если вы опустите его для корпоративного сайта, может произойти то же самое. Всегда проверяйте, сначала проверяя URL-адрес сценария.


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

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