Низкая оценка reCAPTCHA v3 — это не ошибка интеграции и не сбой сети. Проверка ничего не показывает пользователю: она молча оценивает запрос числом от 0,0 до 1,0, и если оценка ниже порога сайта, форма отклоняется без сообщения. В логах остаётся пустой ответ, поэтому первая задача — понять, какой сигнал тянет score вниз.
Причин немного, и почти все воспроизводимы. Ниже — короткий список, разбор по двум группам и пример получения токена через API.
Коротко: что чаще всего роняет score
- Неверное значение
actionв запросе. - Токен, отправленный позже двух минут после генерации.
- Ключ сайта от v2, подставленный в запрос для v3.
- Выход в интернет с адреса дата-центра.
- Чистый профиль браузера без cookie Google.
- headless-режим с настройками по умолчанию.
- Серия вызовов
grecaptcha.execute()в одной сессии.
Что именно читает reCAPTCHA v3
Проверка не задаёт вопросов и не показывает картинок: она собирает сигналы и выдаёт число, которое бэкенд сайта сравнивает со своим порогом.
- траектория и скорость мыши, паузы перед действием;
- наличие и характер прокрутки страницы;
- ритм ввода с клавиатуры;
- браузерные сигналы: Canvas, WebGL, шрифты, плагины;
- cookie Google и история сессии;
- репутация IP: дата-центр или пользовательская сеть;
- время на странице до целевого действия.
Ошибки интеграции: action, токен, sitekey
Эти три причины срабатывают даже при идеальном окружении и правятся быстрее всего.
Значение action не совпадает с сайтом
Каждый вызов grecaptcha.execute() содержит строку действия — login, submit, checkout. Если в запрос к API уходит другое значение, действие внутри токена не совпадёт с ожиданием бэкенда, и проверка не пройдёт даже при высокой оценке.
Точное значение видно в исходном коде страницы или во вкладке Network в DevTools — передавайте его без изменений. Подробности: описание параметра action.
Токен отправлен позже двух минут
Срок жизни токена reCAPTCHA v3 — 2 минуты. Если между получением токена и отправкой формы проходит длинная цепочка шагов, сервер отклонит запрос независимо от score.
Запрашивайте токен перед отправкой формы, а не при загрузке страницы, и логируйте разницу во времени: в CI это самая незаметная причина плавающих падений.
В запрос ушёл ключ v2
На одной странице могут жить и v2, и v3: например, v3 на форме входа и v2 как резервная проверка. С ключом v2 вы получите корректный ответ, но не для той проверки. Берите ключ из вызова grecaptcha.execute(), а не первый data-sitekey в разметке.
Сигналы окружения: сеть, профиль, ритм запросов
Здесь оценка складывается из истории: откуда пришёл запрос, что за профиль браузера и как часто он обращается к сайту.
Адрес дата-центра и репутация IP
Google ведёт репутацию адресов. Диапазоны дата-центров и перегруженные общие адреса стабильно получают более низкую оценку, чем обычные пользовательские сети.
- Используйте авторизованный сетевой выход, согласованный с владельцем ресурса.
- Меняйте адрес между сериями запросов, а не внутри одной сессии.
Профиль без cookie Google
Профили с активными cookie Google (NID, SID, HSID) в среднем получают оценку выше. Чистый профиль автоматизации такой истории лишён.
- Прогрейте профиль: откройте сервисы Google перед переходом на целевую страницу.
- Сохраняйте профиль между запусками вместо создания нового на каждый прогон.
headless-режим с настройками по умолчанию
Браузер в headless-режиме с настройками по умолчанию отдаёт неполный набор сигналов: нулевой размер окна, нет прокрутки, пустая история. Дело не в режиме, а в бедных данных.
- Задайте реалистичный размер области просмотра и корректный user agent.
- Прогоняйте тот же сценарий в обычном окне и сравнивайте score.
Слишком частые вызовы в одной сессии
Повторные вызовы grecaptcha.execute() с одной страницы снижают оценку с каждым следующим: для модели это машинный ритм. Ставьте паузы 15–30 с между решениями и обновляйте сессии между прогонами.
Как получить токен через API CaptchaAI
CaptchaAI решает reCAPTCHA v3 в реальных браузерных средах и возвращает токен с оценкой около 0,3. Этого хватает для сайтов с порогом 0,3, но не выше: оценку выставляет модель Google, а не сервис решения.
Минимальный цикл — отправка задачи в in.php и опрос res.php до получения токена.
import requests
import time
response = requests.get("https://ocr.captchaai.com/in.php", params={
"key": "YOUR_API_KEY",
"method": "userrecaptcha",
"version": "v3",
"googlekey": "SITE_KEY",
"action": "login",
"pageurl": "https://staging.example.com/qa-login",
"json": 1
})
task_id = response.json()["request"]
for _ in range(30):
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 received: {token[:50]}...")
break
const axios = require('axios');
async function solveV3(sitekey, pageurl, action) {
const { data } = await axios.get('https://ocr.captchaai.com/in.php', {
params: {
key: 'YOUR_API_KEY', method: 'userrecaptcha', version: 'v3',
googlekey: sitekey, action, pageurl, json: 1
}
});
const taskId = data.request;
for (let i = 0; i < 30; i++) {
await new Promise(r => setTimeout(r, 5000));
const res = await axios.get('https://ocr.captchaai.com/res.php', {
params: { key: 'YOUR_API_KEY', action: 'get', id: taskId, json: 1 }
});
if (res.data.status === 1) return res.data.request;
}
throw new Error('Timeout');
}
Оба примера делают одно и то же: отправляют задачу, получают ID и опрашивают результат до готовности токена.
Сценарий: ночные прогоны распределённой команды
Ситуация, знакомая командам в Алматы, Минске и Тбилиси. Разработка идёт локально, staging-стенд поднят в европейском регионе, ночные end-to-end тесты идут с серверов CI. Локально форма входа проходит, в CI — нет: score ниже порога 0,5.
Причина составная. Локальный запуск идёт из пользовательской сети и с профиля, где есть cookie Google, а CI выходит с адреса дата-центра, поднимает чистый профиль и отправляет токен через 40 с после генерации — из-за очереди шагов в пайплайне. Правки: перенести получение токена к моменту отправки формы, закрепить авторизованный сетевой выход, сохранять профиль между запусками. Если в артефакты тестов попадают пользовательские данные, помните про 152-ФЗ «О персональных данных»: собирайте только то, что вправе обрабатывать.
Решение reCAPTCHA v3 занимает менее 4 с, поэтому нескольких потоков хватает на сотни задач в час: BASIC ($15/мес, 5 потоков) закрывает ночной прогон небольшой команды, ADVANCE ($90/мес, 50 потоков) — параллельные наборы тестов. Оплата идёт за потоки, а не за решение.
Частые вопросы
Как узнать порог score на конкретном сайте?
Снаружи — никак: порог задан на бэкенде. Оценивайте эмпирически: если токены с оценкой около 0,3 принимаются, порог не выше 0,3. Типичные значения — 0,5 по умолчанию и 0,7 для платежей.
Что означает score 0,1 и можно ли его поднять?
0,1 означает, что модель почти уверена в автоматизации. Обычно за этим стоит связка факторов: адрес дата-центра, чистый профиль, мгновенная отправка формы. Поднимать оценку нужно устранением всей связки, а не одним параметром.
Сколько потоков нужно для 500 отправок формы в час?
Поток — это одна задача в работе, а не квота решений. При времени решения менее 4 с одного потока хватает на сотни задач в час, поэтому такой объём закрывает даже BASIC ($15/мес, 5 потоков).
Почему тот же код работает локально, но падает на сервере?
Отличается не код, а окружение: тип сети, профиль браузера, наличие cookie и задержка между получением и отправкой токена. Сравните эти четыре параметра, прежде чем править логику.
Решать v3 или переключиться на резервную v2?
Многие сайты показывают задачу v2, когда оценка v3 низкая. Если v3 стабильно не проходит, решайте резервную v2: там бинарный результат pass/fail. Разница версий — в сравнении reCAPTCHA v2 и v3.