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.
Связанные руководства
- Как решить reCAPTCHA v2 Enterprise с помощью API
- Решите reCAPTCHA v2 Enterprise с помощью Python
- Распространенные ошибки и исправления reCAPTCHA v2 Enterprise
- Как определить внедрение reCAPTCHA Enterprise