Use Cases

Обработка CAPTCHA в собственных retail-витринах

Безопасный scope: Это руководство применимо только к собственным или явно авторизованным QA-, staging- и production-средам. Описаны сценарии диагностики, тестирования и наблюдаемости вашей собственной CAPTCHA-интеграции — не для сторонних сайтов и не для несанкционированных workflow.

Регрессия в CAPTCHA редко выглядит как упавший тест. Чаще — как просевшая конверсия корзины через неделю после релиза: порог антибота подкрутили на ступень, виджет начал появляться на шаге оплаты у части живых пользователей, и никто этого не заметил, потому что в staging CAPTCHA просто отключали. Правильный ответ здесь не «выключить», а «прогонять как обычный шаг сценария»: получить токен через API CaptchaAI, отправить его вместе с формой, проверить на своём backend и записать результат в лог.

Ниже — сценарии, порядок прогона, поля логирования и таблица типичных сбоев.


Где в retail-витрине появляется CAPTCHA

Точки срабатывания у большинства магазинов совпадают — совпадают защищаемые действия:

  • регистрация и login — защита от массового создания учётных записей;
  • поиск и фасетная фильтрация — при высокой частоте запросов с одного адреса;
  • добавление в корзину — защита от автоматических «наливов» товара;
  • checkout и оплата — самый дорогой шаг: здесь ложное срабатывание стоит реальных денег.

Первые три точки терпимы к ошибкам: пользователь повторит поиск. Четвёртая — нет, поэтому checkout-сценарий должен быть в регрессии всегда, а не только когда «трогали оплату».

Какие типы CAPTCHA закрывать тестами

В retail чаще всего встречаются reCAPTCHA v2/v3, Cloudflare Turnstile и Cloudflare Challenge, а также image/OCR-капчи с искажённым текстом — всё это CaptchaAI решает, как и GeeTest v3. А вот hCaptcha и FunCaptcha не решает, GeeTest v4 заявлен как «скоро»: если витрина стоит за одним из них, сценарий строится на мок-режиме. CaptchaFox (beta), Friendly Captcha (beta) и Lemin (beta) — бета-статус, завязывать на них релизную регрессию рано.

Сценарий за сценарием: порядок прогона

Порядок важен: каждый следующий шаг опирается на baseline из предыдущего.

  1. Baseline без CAPTCHA. Обычная сессия проходит каталог → корзину → checkout, виджет не появляется. Если появился — порог антибота слишком агрессивен, и это уже дефект.
  2. Форсированное появление на поиске. Поднимите частоту запросов до порога и зафиксируйте, на каком шаге появился виджет и какого типа.
  3. Checkout с CAPTCHA и фиктивной оплатой. Токен получен через API, форма отправлена, sandbox-платёж прошёл, заказ создан. Товары, карты и учётные записи — тестовые; реальных покупок здесь быть не должно.
  4. Checkout при смене сети. Мобильный канал, другой выходной адрес, разорванная и восстановленная сессия — частый источник «плавающих» падений.
  5. Негативный сценарий. Подставьте заведомо неверный токен и убедитесь, что backend отклоняет запрос. Тест, проходящий с невалидным токеном, не проверяет ничего.

Пятый пункт пропускают чаще всего, а ловит он худший класс дефектов — когда серверная проверка токена отключена или всегда возвращает «ок».

Интеграция CaptchaAI в QA-контур

Схема одинакова для всех типов: отправить задачу на in.php, получить ID задачи, опрашивать res.php, подставить токен в поле формы (g-recaptcha-response для reCAPTCHA, cf-turnstile-response для Turnstile) и отправить форму. Разбор по типам — в руководствах по reCAPTCHA v2 через API, Cloudflare Turnstile через API и GeeTest v3 через API; первичная настройка ключа — в быстром старте.

Тарификация здесь работает в пользу QA: CaptchaAI считает потоки, а не отдельные решения, поэтому счёт за ночную регрессию не зависит от числа прогонов. Команде из трёх QA-инженеров с несколькими джобами в CI обычно хватает BASIC ($15/мес, 5 потоков); матрице браузеров с десятками одновременных сессий ближе STANDARD ($30/мес, 15 потоков) или ADVANCE ($90/мес, 50 потоков). Параллелизм ограничен числом потоков. Цены указаны в USD — в таком виде их и закладывайте в смету, будь то команда в Москве, Алматы или Минске.

Логи и наблюдаемость

Структурированные логи помогают сравнивать поведение CAPTCHA между релизами и быстро находить регрессии в собственных формах:

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 и по среде.

Смотрите не на среднее, а на P90 и P99: именно хвост распределения превращается в брошенные корзины — и сравнивайте только сопоставимые выборки, один набор сценариев в одной среде.

Если в логи попадают данные тестовых пользователей, применяйте к staging тот же режим обращения с персональными данными, что и к production: для команд в РФ это привычная логика 152-ФЗ «О персональных данных», для распределённых — осмотрительность в духе GDPR. Правило простое: храните только поля, нужные для разбора сбоя.

Разбор частых сбоев

Симптом Вероятная причина Что сделать
CAPTCHA появляется в каждой сессии Сессионные cookies не переживают редирект Проверьте cookie jar и обработку редиректов между шагами
Токен получен, но форма отклонена Токен не доехал до нужного поля или истёк Сверьте имя поля и отправляйте форму сразу после получения токена
Sandbox-платёж не проходит Перепутан или просрочен тестовый ключ платёжного провайдера Сверьте sandbox-токен и режим окружения
Корзина теряется между шагами Разъезжается storage или домен сессии Проверьте сохранение состояния между переходами
Поиск отвечает медленно под нагрузкой Слишком высокий параллелизм QA-джоб Снизьте число одновременных сессий до числа доступных потоков
Тест зелёный с неверным токеном Backend не валидирует токен Включите серверную проверку — это дефект, а не особенность теста

QA-чек-лист перед релизом

  • Запрос отправляется только на собственные или авторизованные endpoints.
  • Тестовые учётные записи, события и платежи помечены как фиктивные.
  • CAPTCHA-токен проверяется на собственном backend, а не доверяется клиенту.
  • Логи содержат task_id, тип CAPTCHA, время ожидания и pass/fail.
  • Негативный сценарий с невалидным токеном присутствует в наборе.
  • Скрипт возвращает корректный exit code, чтобы CI мог принять решение.

FAQ

Нужно ли гонять реальное решение CAPTCHA в CI на каждый коммит?

Нет. На каждый коммит достаточно мока: он быстрее и не расходует потоки. Реальное решение через API оставьте для ночной регрессии и pre-release прогона, где проверяется связка «виджет → токен → серверная валидация».

Сколько потоков нужно для ночной регрессии витрины?

Считайте по пиковому числу одновременных сценариев, а не по общему числу тестов. Пять параллельных джоб — это пять потоков в пике, то есть BASIC ($15/мес, 5 потоков). Матрица из нескольких браузеров и мобильных профилей быстро упирается в 15 потоков (STANDARD, $30/мес).

Что делать, если тест падает только на мобильном профиле?

Почти всегда дело в тайм-аутах: на нестабильном канале ожидание токена и отправка формы занимают дольше, и токен успевает устареть. Увеличьте окно ожидания, добавьте экспоненциальную задержку между повторами и отправляйте форму сразу после получения токена.

Можно ли применять эти сценарии к чужому интернет-магазину?

Нет. Всё описанное относится только к собственной витрине или к среде, на которую у вас есть письменное разрешение владельца — это обязательное условие, а не формальность.

Как отличить регрессию интеграции от изменений на стороне провайдера CAPTCHA?

Сравните два ряда в дашборде: долю неуспешных проверок токена на своём backend и время получения токена от API. Выросло только время — вероятны внешние условия; выросла доля отклонённых токенов при стабильном времени — ищите изменение в форме или в серверной валидации.

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

Возьмите API-ключ CaptchaAI и прогоните первый checkout-сценарий с CAPTCHA в своём staging — начните здесь.

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