Как повысить оценку reCAPTCHA v3: шесть работающих решений

Вы не можете задать score reCAPTCHA v3. Google назначает его для каждого запроса, и ничто в вашем коде не меняет его напрямую. Что вы можете изменить — это то, что на него влияет: как вы называете action, когда запрашиваете токен, на какой части сайта вообще работает reCAPTCHA и что ваш backend делает с результатом. Исправьте это — и распределение сдвинется.
Шесть изменений, упорядоченных по тому, насколько они обычно помогают. Сначала измерьте, потому что у половины сайтов, которые думают, что у них проблема с оценкой, на самом деле проблема с порогом.
Что на самом деле означает score
v3 возвращает число от 0.0 до 1.0 при каждой проверке. Формулировка Google: 1.0 — почти наверняка добросовестное взаимодействие, 0.0 — почти наверняка бот. Здесь нет ни checkbox, ни пазла, поэтому это число — единственный сигнал.
Из этого следуют две вещи, и обе важны:
- Оценка — на каждый запрос и на каждый action, а не на пользователя. Один и тот же посетитель может получить 0.9 на вашей главной странице и 0.3 на оформлении заказа.
- Рекомендованный Google начальный порог — 0.5. Это значение по умолчанию, от которого стоит уходить, а не цель, к которой нужно стремиться.
Если вы ещё не знаете, чем v3 отличается от версии с чекбоксом, наше пояснение о как работает reCAPTCHA описывает механику.
Измеряйте, прежде чем что-либо менять
Консоль администратора reCAPTCHA показывает распределение оценок по вашему сайту и разбивку по десяти основным действиям. Изучите её, прежде чем трогать код. Вы ищете одну из трёх форм:
- Всё на уровне 0.9, а вы всё равно блокируете людей. Проблема в вашем пороге или в логике бэкенда, а не в оценке.
- Широкий разброс с всплеском в нижней части. Это нормально. Настраивайте порог для каждого action.
- Всё в диапазоне от 0,1 до 0,3. Что-то не так на структурном уровне. Обычно дело в токене, а не в трафике.
Google также предупреждает, что в тестовой среде или сразу после установки v3 значения score отличаются от продакшена, потому что у модели ещё нет истории по сайту. Дайте ей неделю реального трафика, прежде чем делать выводы. Чтобы проверить один запрос по отдельности, наш живая тестовая страница reCAPTCHA v3 возвращает необработанную оценку для одного решения.
Исправление 1: называйте свои action и делайте это правильно
Это самый большой выигрыш, и его регулярно упускают. Google оценивает каждое действие отдельно и использует собственную историю действия как контекст. Одно универсальное действие на весь сайт означает одну смешанную историю, и каждая страница наследует худшее из неё.
// One action per meaningful event. Not one for the whole site.
grecaptcha.ready(function () {
grecaptcha.execute("YOUR_SITEKEY", { action: "login" })
.then(function (token) {
document.getElementById("recaptcha-token").value = token;
});
});Правила, которые применяет Google: действия могут содержать только буквенно-цифровые символы, слэши и подчёркивания, и они не должны быть привязаны к конкретному пользователю. Поэтому checkout/payment подойдёт, checkout_user_8842 — нет. Специфичный для пользователя action дробит историю на тысячи сегментов, ни в одном из которых нет данных, что хуже, чем вообще не задавать action.
Исправление 2: запускайте reCAPTCHA не только на форме
v3 оценивает поведение, а поведению нужна не одна точка данных. Если скрипт загружается только на странице входа, Google видит посетителя, который внезапно появляется у формы и отправляет её, — а именно так и выглядит бот.
Собственная рекомендация Google — загружать v3 по всему сайту, включая страницы без форм. На этих страницах проверять ничего не нужно. Простое выполнение скрипта даёт модели материал для работы к тому моменту, когда посетитель доходит до нужного вам действия.
Это же исправление люди случайно отменяют. Если перенести скрипт в условие, срабатывающее только на маршруте оформления заказа, ваши оценки упадут в течение нескольких дней.
Исправление 3: получайте токен при отправке, а не при загрузке страницы
Токены reCAPTCHA v3 истекают через две минуты после выдачи. Генерируйте токен в ready() при загрузке страницы, и любой посетитель, который читает вашу форму дольше этого времени, отправляет недействительный токен. В зависимости от того, как ваш бэкенд обрабатывает сбой, это воспринимается как плохая оценка или жёсткий отказ.
// Solve on submit so the token is always fresh.
form.addEventListener("submit", function (e) {
e.preventDefault();
grecaptcha.execute("YOUR_SITEKEY", { action: "login" })
.then(function (token) {
tokenField.value = token;
form.submit();
});
});Длинные формы, многошаговое оформление заказа и всё, что связано с загрузкой файлов, — вот где это бьёт сильнее всего.
Исправление 4: проверяйте на стороне сервера и также проверяйте action
Токен бесполезен, пока ваш backend не обменяет его. Этот обмен возвращает score, action и hostname, и вам следует проверять все три значения.
# Exchange the token for the score. Server side only.
curl -X POST https://www.google.com/recaptcha/api/siteverify \
-d secret=YOUR_SECRET_KEY \
-d response=THE_TOKEN_FROM_THE_PAGE
# {"success":true,"score":0.9,"action":"login","hostname":"example.com"}Если вы проверяете только success, вы вообще не используете v3. success означает, что токен разобран, а не то, что посетитель выглядел как человек. И если вы не сравниваете action с тем, что ожидал этот эндпоинт, токен, созданный на вашей малозначимой форме подписки, прекрасно работает на вашем эндпоинте входа.
Исправление 5: задайте порог для каждого действия, а не один на весь сайт
Оформление заказа и подписка на рассылку не должны иметь общий порог. Когда у вас накопится неделя данных по каждому действию, задайте для каждого то значение, где реально находится ваш трафик.
| Тип action | Разумная отправная точка | Что делать, если score ниже |
|---|---|---|
| Подписка, поиск, просмотр страницы | 0.3 | Разрешить, записать оценку в лог |
| Вход, комментирование | 0.5 | Добавьте второй фактор или галочку v2 |
| Оформление заказа, сброс пароля | 0.7 | Переход к ручной проверке |
Обратите внимание, что ни в одной из этих строк не сказано “блокировать”. Жёсткая блокировка при низкой оценке — это то, как реализации v3 отсекают реальных клиентов в корпоративных VPN и приватных браузерах. Вместо этого усильте проверку.
Исправление 6: исключите обычные факторы, снижающие оценку
Если все структурные исправления на месте, а оценки всё ещё низкие, проработайте следующее:
| Причина | Почему оценка низкая |
|---|---|
| Два скрипта reCAPTCHA на одной странице | Вторая загрузка затирает первую, и токен привязывается к неверному контексту |
| Общие или дата-центровые IP | Офисный NAT, VPN и облачный трафик — всё это несёт историю других людей |
| Агрессивные расширения приватности | Заблокированные cookie и хранилище оставляют модель без данных для чтения |
| Формы во фрейме или встроенные | Кросс-доменный контекст ослабляет сигнал |
| Несоответствие sitekey и домена | Проверьте hostname поле в ответе проверки |
Одна вещь, которая не в этом списке: скрытие значка. Это вопрос CSS и упоминания об использовании, и на скоринг это никак не влияет. Мы описали правильный способ сделать это в скрытие значка reCAPTCHA v3.
Проблема, которую не решить настройкой
Если трафик автоматизирован, он получает низкую оценку, потому что именно это v3 и создана выявлять. Никакое именование действий не спасёт headless-браузер. Для тестирования собственного сайта или для автоматизации, которую вы вправе запускать, вы получаете токен от сервиса распознавания, а не со страницы:
# pip install capskip
from capskip import CapSkip
solver = CapSkip(host="127.0.0.1", port=8080)
result = solver.recaptcha(
sitekey="YOUR_SITEKEY",
url="https://example.com/page-with-recaptcha",
version="v3",
action="login", # must match the page
)
print(result["code"]) # token, inject it and submitОбратите внимание на action снова. Здесь это так же важно, как и на вашей стороне, ровно по той же причине: бэкенд сравнивает его.
Чего вы не можете сделать — так это задать score. В запросе на решение нет параметра минимального score. Это число определяет Google в момент проверки вашего токена, поэтому сервис распознавания капчи выдаёт вам только токен и ничего больше.
Часто задаваемые вопросы
Почему моя оценка reCAPTCHA v3 всегда 0.1?
Стабильные 0.1 по всему трафику почти никогда не связаны с поведением. Проверьте, нет ли дублирующегося тега script, устаревшего токена, выданного более чем за две минуты до отправки, или sitekey, зарегистрированного на другой домен. hostname поле в ответе на проверку сразу разрешает последний.
Сколько времени нужно, чтобы изменения оценки проявились?
Несколько дней. Модель использует историю по сайту и по action, поэтому новый action начинается без контекста и стабилизируется по мере накопления трафика. Не судите об изменении по данным за один день.
Делает ли более высокий порог оценки мой сайт безопаснее?
Лишь до определённого предела, и это стоит вам реальных пользователей. Повышение порога до 0.9 на каждом эндпоинте блокирует людей с общими IP и приватными браузерами задолго до того, как остановит настойчивого злоумышленника. Задавайте порог для каждого действия и усиливайте проверку вместо прямого отклонения.
Можно ли увидеть оценку без написания серверного кода?
Да. Админ-консоль показывает распределение по вашему сайту, а наша демо-страница v3 возвращает необработанный score для одного решения, чтобы вы могли сравнить один запрос с тем, что сообщает ваш собственный endpoint.
Сводка
Задавайте по одному action на событие, подключайте v3 на всём сайте, создавайте токен в момент отправки, проверяйте на стороне сервера и сравнивайте action, затем задавайте порог для каждого endpoint, а не один глобальный. Проверяйте админ-консоль через неделю, а не в тот же день.
Чтобы разобраться в механике оценки v3 и связанных с ней опциях, смотрите Решение reCAPTCHA v3, а также собственный от Google Документация по v3 является авторитетом в вопросах порогов и именования действий. Если вы тестируете собственные формы на низкой оценке, CapSkip — это распознавание капчи который работает локально, так что вы можете генерировать токены весь день без счёта за каждое решение.
