Безопасный scope: Это руководство применимо только к собственным или явно авторизованным QA-, staging- и production-средам. Описаны сценарии диагностики, тестирования и наблюдаемости вашей собственной CAPTCHA-интеграции — не для сторонних сайтов и не для несанкционированных workflow.
В собственных распределённых пайплайнах любой worker может обрабатывать любую задачу. Если CAPTCHA-состояние сессии хранится в памяти одного процесса, retry на другом узле ломает сценарий. Решение — общий store с TTL и идемпотентным ключом.
Что считать CAPTCHA-состоянием
- task_id у CaptchaAI;
- полученный токен в пределах TTL;
- результат backend верификации (pass/fail);
- метаданные: pageurl, sitekey, action.
Минимальная схема в Redis
| Ключ | Поле | TTL |
|---|---|---|
captcha:{idem} |
task_id |
5 мин |
captcha:{idem} |
token |
TTL провайдера |
captcha:{idem} |
verified |
10 мин |
Запрос с идемпотентным ключом
import json, redis
r = redis.Redis()
def get_or_solve(idem: str, sitekey: str, pageurl: str) -> str:
cached = r.get(f'captcha:{idem}:token')
if cached:
return cached.decode()
token = solve(sitekey, pageurl)
r.setex(f'captcha:{idem}:token', 110, token)
return token
Безопасные правила
- идемпотентный ключ строится по контексту запроса, не переиспользуется между разными пользователями;
- токены не сохраняются дольше TTL провайдера;
- результат backend верификации хранится отдельно от токена.
Логи и наблюдаемость
Структурированные логи помогают сравнивать поведение 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 и по среде.
Troubleshooting
| Симптом | Что сделать |
|---|---|
| Дубли CaptchaAI задач | Проверьте идемпотентный ключ |
| Токен невалиден на ретрае | Снизьте TTL ключа token |
| Redis недоступен | Откатывайтесь к локальному решению per-worker |
| Конкурентный доступ | Используйте SETNX или Lua-скрипт |
QA-чек-лист
- Запрос отправляется только на собственные или авторизованные endpoints.
- Тестовые учётные записи, события и платежи помечены как фиктивные.
- CAPTCHA-токен проверяется на собственном backend, а не доверяется клиенту.
- Логи содержат
task_id, тип CAPTCHA, время ожидания и pass/fail. - Скрипт возвращает корректный exit code, чтобы CI мог принять решение.
FAQ
Можно ли использовать этот подход на сторонних сайтах?
Нет. Описанные сценарии применимы только к собственным или явно авторизованным средам. Для чужих ресурсов запрашивайте письменное разрешение владельца.
Что делать, если CaptchaAI вернул ошибку?
Логируйте task_id, тип CAPTCHA и текст ошибки, повторите запрос с экспоненциальной задержкой и фиксируйте долю ошибок в дашборде. Постоянный рост ошибок — повод проверить sitekey и страницу.
Как сравнивать результаты между релизами?
Сохраняйте логи в одном формате и стройте отчёт по медиане, P90 и P99 на одинаковом наборе сценариев. Сравнивайте только сопоставимые выборки в собственной среде.
Безопасные связанные руководства
- Быстрый старт CaptchaAI
- QA-тестирование CAPTCHA в авторизованных средах
- Тестирование CAPTCHA API на собственных формах
- Отладка: браузерный тест падает, API проходит
- reCAPTCHA v2 через API
- Cloudflare Turnstile через API
- GeeTest v3 через API
Готовы навести порядок в распределённом CAPTCHA-пайплайне? Подключите CaptchaAI.