Безопасный scope: методика ниже рассчитана на ваши собственные или явно авторизованные QA-, staging- и production-среды. Речь о диагностике и наблюдаемости вашей собственной CAPTCHA-интеграции — не о сторонних сайтах и не о несанкционированных сценариях.
Токен CAPTCHA привязан к контексту сессии, а не к вашей ноде. Если страница открылась через один исходящий IP, а запрос к решателю и отправка формы ушли с другого, проверка на backend закономерно не проходит. Внешне это выглядит как «плавающий» баг: локально всё работает, в CI падает раз в несколько прогонов, стек-трейса нет.
Ниже — методика для распределённого backend: какие метрики снимать, какие четыре сценария прогонять, как собрать воспроизводимый стенд и что логировать, чтобы отличить сетевую проблему от ошибки интеграции.
Почему ротация исходящих IP ломает CAPTCHA-сессию
Приложение редко ходит наружу с одного адреса: балансировщик распределяет запросы между зонами, Kubernetes перезапускает под и меняет NAT-шлюз, региональные узлы разнесены ради задержки. Для CAPTCHA-провайдера это выглядит как смена участника диалога в середине разговора:
- Разрыв контекста. Страница с
sitekeyзагружена из одной подсети, токен предъявляется из другой — оценка сессии пересчитывается. - Геонесогласованность. Форма, рассчитанная на локальную аудиторию, открывается с адреса другого континента: сценарий проверки становится жёстче, время решения растёт.
- Гонка параллельных нод. Несколько воркеров запрашивают токен для одного
pageurlодновременно, и их поведение сливается в один паттерн. - TTL пула адресов. Долгий многошаговый сценарий переживает срок жизни исходящего адреса и заканчивается уже с другого IP.
Вывод для проектирования: получение и предъявление токена должны укладываться в один сетевой контекст.
Что измерять при смене исходящего IP
Четыре метрики закрывают почти всю диагностику:
- Доля невалидных токенов — сколько попыток отклонил ваш backend после смены исходящего адреса.
- Время решения по регионам — медиана, P90 и P99 отдельно для каждого узла.
- Доля «двух IP в одной сессии» — процент сессий, где загрузка страницы и отправка формы ушли с разных адресов.
- Стабильность по типам CAPTCHA — reCAPTCHA v2, reCAPTCHA v3 и Cloudflare Turnstile ведут себя по-разному, усреднять их бессмысленно.
Четыре QA-сценария ротации IP для распределённых нод
Каждый следующий сценарий сравнивается с baseline.
- Baseline. Все запросы уходят с одного исходящего IP — эталонные значения задержки и доли успеха.
- Разрыв сессии. Страница загружается с узла A, токен запрашивается и отправляется с узла B.
- Параллельная нагрузка. Несколько нод одновременно работают с одним
sitekeyи однимpageurl. - Перезапуск в середине. Нода перезапускается между загрузкой формы и отправкой токена.
Сценарии 2 и 4 обычно и дают тот нестабильный отказ, который не воспроизводится локально.
Пример: две ноды, два региона, один sitekey
Типичная конфигурация для команды, работающей на РФ- и СНГ-аудиторию: один узел во франкфуртском регионе, второй — в казахстанском, трафик балансируется по задержке. На staging-форме с reCAPTCHA v2 baseline с одного узла даёт ровную картину. Как только балансировщик отдаёт загрузку страницы европейскому узлу, а отправку формы — центральноазиатскому, доля отклонённых токенов заметно растёт, хотя ни код, ни sitekey не менялись.
Правка тут архитектурная: привяжите весь CAPTCHA-сценарий — загрузку страницы, запрос токена и отправку формы — к одному узлу через affinity балансировщика. После этого прогоните те же четыре сценария ещё раз и сравните P90.
Тарификация CaptchaAI считается по одновременным потокам, а не по числу решений, поэтому стоимость стенда предсказуема в USD. Для двух-трёх параллельных нод хватает BASIC ($15/мес, 5 потоков), для CI с десятками прогонов — STANDARD ($30/мес, 15 потоков) или ADVANCE ($90/мес, 50 потоков).
Воспроизводимый стенд: CaptchaAI и собственные staging-формы
Стенд имеет смысл только детерминированный: один sitekey, один pageurl, фиксированный список узлов и повторов. Меняется ровно одна переменная — исходящий IP.
Закладывайте в матрицу сценариев только те типы, которые действительно поддерживаются: reCAPTCHA v2 и v3, Cloudflare Turnstile и Cloudflare Challenge, GeeTest v3, image/OCR. hCaptcha и FunCaptcha CaptchaAI не решает, поддержка GeeTest v4 заявлена как «скоро» и в план тестирования пока не идёт; CaptchaFox, Friendly Captcha и Lemin доступны в статусе beta, поэтому их результаты не стоит смешивать с GA-типами в одном отчёте.
Если интеграции ещё нет, начните с быстрого старта CaptchaAI, а затем возьмите готовые схемы вызовов для нужного типа: reCAPTCHA v2 через API, Cloudflare Turnstile через API, GeeTest v3 через API.
Структурированные логи: что писать по каждой попытке
Без единого формата логов сравнивать релизы невозможно. Минимальный вариант умещается в несколько строк:
import json, time, logging
log = logging.getLogger('captcha-qa')
def record(event: str, **fields) -> None:
payload = {'ts': time.time(), 'event': event, **fields}
log.info(json.dumps(payload, ensure_ascii=False))
Обязательные поля каждой попытки: slug, captcha_type, task_id, wait_seconds, verify_status, env. Этого достаточно, чтобы построить дашборд медианы, P90 и P99 в разрезе типа CAPTCHA и среды. Добавьте идентификатор узла — и тот же дашборд начнёт показывать разницу между регионами.
При этом персональные данные тестовых пользователей в логи попадать не должны: пишите только то, что вы вправе обрабатывать, — для контура в РФ ориентир 152-ФЗ «О персональных данных», для трансграничных проектов — GDPR-подобная дисциплина минимизации.
Диагностика: симптомы и что проверить
| Симптом | Что проверить |
|---|---|
| Токен невалиден после переключения ноды | Привяжите весь сценарий к одному узлу через affinity |
| Высокая задержка на одном регионе | Сетевой маршрут и загрузку самого узла |
| Разная картина на соседних нодах | DNS-резолв и фактический исходящий IP каждой ноды |
| Backend не принимает корректный токен | Значения pageurl и secret на стороне проверки |
| Отказ воспроизводится только в CI | Число параллельных потоков и таймауты пайплайна |
Если браузерный тест падает, а прямой вызов API проходит, дело почти всегда в окружении браузера — разбор такого случая есть в материале про расхождение браузерного и API-теста.
Чек-лист перед прогоном в CI
- Запросы уходят только на собственные или явно авторизованные endpoints.
- Тестовые учётные записи, события и платежи помечены как фиктивные.
- Токен проверяется на вашем backend, а не принимается на доверии от клиента.
- Логи содержат
task_id, тип CAPTCHA, время ожидания, идентификатор узла и результат. - Скрипт возвращает корректный exit code, чтобы CI мог принять решение автоматически.
Частые вопросы
Почему токен, полученный на одной ноде, не проходит на другой?
Потому что проверка учитывает контекст сессии, включая сетевой. Держите загрузку страницы, запрос токена и отправку формы в пределах одного узла; менять узел безопасно между сценариями, а не внутри одного.
Сколько потоков нужно для параллельного прогона?
Считайте по числу одновременно выполняющихся сценариев, а не по числу решений в сутки: ограничивает именно параллелизм. Пять потоков закрывают небольшой стенд, десятки параллельных job в CI требуют более старшего тарифа.
Как отличить сетевую проблему от ошибки интеграции?
Сравните baseline и сценарий с разрывом сессии на одном и том же наборе данных. Если baseline ровный, а падения появляются только при смене узла — проблема сетевая. Если baseline тоже нестабилен, проверяйте sitekey, pageurl и логику проверки на backend.
Что делать, если API вернул ошибку?
Зафиксируйте task_id, тип CAPTCHA и текст ошибки, повторите запрос с экспоненциальной задержкой и выведите долю ошибок на дашборд. Устойчивый рост — повод перепроверить sitekey и страницу, а не наращивать число повторов.
Можно ли применять эти сценарии к чужим сайтам?
Нет. Методика рассчитана на ваши собственные или письменно авторизованные среды. Для чужого ресурса нужно разрешение владельца — без него прогон недопустим.
Смежные руководства
- Быстрый старт CaptchaAI
- QA-тестирование CAPTCHA в авторизованных средах
- Тестирование CAPTCHA API на собственных формах
- Отладка: браузерный тест падает, вызов API проходит
- reCAPTCHA v2 через API
- Cloudflare Turnstile через API
- GeeTest v3 через API
Хотите увидеть реальную картину по своим формам? Подключите CaptchaAI и снимите baseline до следующего релиза.