Туториалы по API

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

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

В этом руководстве рассматривается полная реализация Node.js — обнаружение Enterprise v2, отправка в CaptchaAI, опрос результата и передача токена во внутренний QA endpoint.


Что вам нужно

Требование Подробности
CaptchaAI API-ключ captchaai.com
Node.js 14+ Со встроенным fetch или node-fetch.
Ключ сайта Из URL-адреса привязки Enterprise (параметр k=).
URL страницы Полный URL-адрес, по которому отображается CAPTCHA
Действие (необязательно) Из параметра sa= в URL-адресе привязки.

Шаг 1. Определите reCAPTCHA v2 Enterprise.

Откройте DevTools и найдите запрос привязки Enterprise на вкладке «Сеть»:

https://www.google.com/recaptcha/enterprise/anchor?ar=1&k=6LdxxXXxAAAAAAcX...&sa=LOGIN&...

Ключевые показатели:

  • Исходный код скрипта включает /recaptcha/enterprise.js или /enterprise/anchor.
  • Параметр k= — это sitekey.
  • Параметр sa= (если он присутствует) является действием.

В стандартной версии 2 используется /recaptcha/api2/anchor — не добавляйте enterprise=1 для стандартной версии 2.


Шаг 2. Отправьте задачу CaptchaAI.

const API_KEY = "YOUR_API_KEY";

async function submitTask(sitekey, pageurl, action) {
  const params = new URLSearchParams({
    key: API_KEY,
    method: "userrecaptcha",
    googlekey: sitekey,
    pageurl: pageurl,
    enterprise: "1",
    json: "1",
  });

  if (action) {
    params.set("action", action);
  }

  const response = await fetch(
    `https://ocr.captchaai.com/in.php?${params}`
  );
  const data = await response.json();

  if (data.status !== 1) {
    throw new Error(`Submit failed: ${data.request}`);
  }

  console.log(`Task submitted. ID: ${data.request}`);
  return data.request;
}

Шаг 3: Опрос на результат

Подождите 20 секунд перед первым опросом, затем проверяйте каждые 5 секунд:

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function pollResult(taskId) {
  await delay(20000);

  for (let attempt = 0; attempt < 30; attempt++) {
    const params = new URLSearchParams({
      key: API_KEY,
      action: "get",
      id: taskId,
      json: "1",
    });

    const response = await fetch(
      `https://ocr.captchaai.com/res.php?${params}`
    );
    const data = await response.json();

    if (data.status === 1) {
      console.log(`Solved. Token: ${data.request.substring(0, 60)}...`);
      return {
        token: data.request,
        userAgent: data.user_agent || "",
      };
    }

    if (data.request !== "CAPCHA_NOT_READY") {
      throw new Error(`Solve failed: ${data.request}`);
    }

    console.log(`Attempt ${attempt + 1}: not ready, waiting 5s...`);
    await delay(5000);
  }

  throw new Error("Solve timed out");
}

Шаг 4. Внедрите токен

Отправьте решенный токен как g-recaptcha-response. Если API вернул user_agent, используйте его в заголовках запроса:

async function submitForm(token, userAgent) {
  const headers = { "Content-Type": "application/x-www-form-urlencoded" };

  if (userAgent) {
    headers["User-Agent"] = userAgent;
  }

  const response = await fetch("https://example.com/api/login", {
    method: "POST",
    headers,
    body: new URLSearchParams({
      username: "user",
      password: "pass",
      "g-recaptcha-response": token,
    }),
  });

  console.log(`Response status: ${response.status}`);
  return response;
}

Полный рабочий скрипт

const API_KEY = "YOUR_API_KEY";
const SITE_KEY = "6LdxxXXxAAAAAAcXxxXxxX91xxxxxxxx8xxOx7A";
const PAGE_URL = "https://https://staging.example.com/qa-login";
const ACTION = "LOGIN"; // optional — omit if not in anchor URL

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function solveRecaptchaV2Enterprise() {
  // Submit task
  const submitParams = new URLSearchParams({
    key: API_KEY,
    method: "userrecaptcha",
    googlekey: SITE_KEY,
    pageurl: PAGE_URL,
    enterprise: "1",
    action: ACTION,
    json: "1",
  });

  const submitRes = await fetch(
    `https://ocr.captchaai.com/in.php?${submitParams}`
  );
  const submitData = await submitRes.json();

  if (submitData.status !== 1) {
    throw new Error(`Submit error: ${submitData.request}`);
  }

  const taskId = submitData.request;
  console.log(`Task ID: ${taskId}`);

  // Poll for result
  await delay(20000);

  for (let i = 0; i < 30; i++) {
    const pollParams = new URLSearchParams({
      key: API_KEY,
      action: "get",
      id: taskId,
      json: "1",
    });

    const pollRes = await fetch(
      `https://ocr.captchaai.com/res.php?${pollParams}`
    );
    const pollData = await pollRes.json();

    if (pollData.status === 1) {
      return {
        token: pollData.request,
        userAgent: pollData.user_agent || "",
      };
    }

    if (pollData.request !== "CAPCHA_NOT_READY") {
      throw new Error(`Solve error: ${pollData.request}`);
    }

    await delay(5000);
  }

  throw new Error("Solve timed out");
}

(async () => {
  const { token, userAgent } = await solveRecaptchaV2Enterprise();
  console.log(`Token: ${token.substring(0, 60)}...`);
  if (userAgent) console.log(`User-Agent: ${userAgent}`);
})();

Ожидаемый результат:

Task ID: 73849562810
Token: 03AGdBq24PBCqLmOx2V4pGHJjkR2xZ1r...
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)...

Поиск неисправностей

Ошибка Причина Исправить
ERROR_WRONG_USER_KEY Неверный формат ключа API. Ключ проверки состоит из 32 символов с вашей панели управления.
ERROR_KEY_DOES_NOT_EXIST Ключ не найден Подтвердите ключ наcaptchaai.com
ERROR_ZERO_BALANCE Недостаточный баланс Пополните свой счет
ERROR_BAD_TOKEN_OR_PAGEURL Неправильный ключ сайта или URL. Извлеките правильное значение k= из URL-адреса привязки Enterprise.
ERROR_CAPTCHA_UNSOLVABLE Не удалось решить Убедитесь, что ключ сайта — Enterprise v2, повторите попытку.
Токен отклонен сайтом Несоответствие пользовательского агента Используйте user_agent из ответа на решение.

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

Как отличить Enterprise v2 от стандартной v2?

Enterprise v2 загружается из /recaptcha/enterprise/ в скрипте или URL-адресе привязки. Стандарт v2 использует /recaptcha/api2/.

Требуется ли параметр действия?

Только если URL-адрес привязки включает sa=. Если он отсутствует, исключите его из запроса CaptchaAI.

Почему целевой сайт отклоняет мой токен?

Чаще всего: несоответствие пользовательского агента. Токены Enterprise v2 привязаны к пользовательскому агенту решателя. Всегда используйте значение user_agent, возвращаемое в ответе на опрос.

Могу ли я использовать это с Puppeteer или Драматургом?

Да. Извлеките ключ сайта со страницы, решите его через API, затем введите токен в document.getElementById('g-recaptcha-response').innerHTML.

Каково типичное время решения?

15–30 секунд в зависимости от загрузки сервера.


Начните решать reCAPTCHA v2 Enterprise

Получите ключ API по адресуcaptchaai.comи добавьте enterprise=1 в ваши запросы v2.


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

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