fix(tradein/scraper): капча Cian и заглушки Yandex — banned, не done (#2625) #2642

Merged
bot-backend merged 1 commit from fix/tradein-captcha-banned-detect into main 2026-08-04 19:03:34 +00:00
Collaborator

Summary

#2625 [HIGH]: 41 из 68 прогонов за 2 недели забирали 0 лотов со статусом done, errors_count=0 — капча/смена вёрстки выглядела как честная пустая выдача. Деградация была невидима, а ротацию IP (#2611) нечем было триггерить. У Avito/Domclick детект есть (AvitoBlockedErrormark_banned, 0 пустых прогонов) — Cian/Yandex теперь получают тот же путь.

  • Cian: счётчики Redux-state extraction (_extract_state_tracked — единая точка SERP + total-probe). State извлёкся с offers=[] = честная пустота; None = капча/вёрстка.
  • Yandex: gate_fetch-счётчики во всех терминальных исходах; классификация на едином track-поинте ok = _extract_gate_data(payload) is not None — schema-drift «response без search.offers» тоже failure, включая _probe (full_load) и пагинацию page≥2 (закрыто по ревью; инвариант «1 запрос = 1 attempt» покрыт тестом).
  • Run-gate во всех 4 sweep/full_load: attempts>0 and failures==attempts перед mark_done → mark_banned. Частичный fail — НЕ бан (анти-флап).
  • Алерт на бизнес-результат: N=3 подряд done с total_seen=0 по источнику → тот же _alert_on_run_id-механизм (новый checker-параметр, дефолтное поведение mark_failed/banned не тронуто).
  • Byte-parity пара scrape_runs.pyorchestration/runs.py обновлена идентично (проверено diff'ом, осознанная дельта прежняя).
  • Ротация из кода НЕ вызывается (ASOCKS-токен на владельце) — banned-статус теперь достижим как триггер для #2611.

Test plan

  • 10 provider-тестов captcha-vs-empty (вкл. schema-drift, анти-флап, 1-req-1-attempt)
  • Orchestration: all-failed→banned / partial→done / honest-empty→done, все 4 функции
  • Алерт: N vs N-1, разрыв серии, mark_done-wiring
  • Полный tradein-сьют: 3252 passed, 0 failed
  • Post-deploy: дождаться живого капча-эпизода → прогон реально уходит в banned

Review

code-reviewer ⚠️: единственный minor (яндексовая асимметрия _probe/fetch_around) закрыт в этом же PR его же рецептом.

Refs #2625

## Summary **#2625 [HIGH]**: 41 из 68 прогонов за 2 недели забирали 0 лотов со статусом `done`, `errors_count=0` — капча/смена вёрстки выглядела как честная пустая выдача. Деградация была невидима, а ротацию IP (#2611) нечем было триггерить. У Avito/Domclick детект есть (`AvitoBlockedError` → `mark_banned`, 0 пустых прогонов) — Cian/Yandex теперь получают тот же путь. - **Cian**: счётчики Redux-state extraction (`_extract_state_tracked` — единая точка SERP + total-probe). State извлёкся с `offers=[]` = честная пустота; `None` = капча/вёрстка. - **Yandex**: `gate_fetch`-счётчики во всех терминальных исходах; классификация на едином track-поинте `ok = _extract_gate_data(payload) is not None` — schema-drift «response без search.offers» тоже failure, включая `_probe` (full_load) и пагинацию page≥2 (закрыто по ревью; инвариант «1 запрос = 1 attempt» покрыт тестом). - **Run-gate** во всех 4 sweep/full_load: `attempts>0 and failures==attempts` перед mark_done → `mark_banned`. Частичный fail — НЕ бан (анти-флап). - **Алерт на бизнес-результат**: N=3 подряд `done` с `total_seen=0` по источнику → тот же `_alert_on_run_id`-механизм (новый checker-параметр, дефолтное поведение mark_failed/banned не тронуто). - Byte-parity пара `scrape_runs.py` ↔ `orchestration/runs.py` обновлена идентично (проверено diff'ом, осознанная дельта прежняя). - Ротация из кода НЕ вызывается (ASOCKS-токен на владельце) — `banned`-статус теперь достижим как триггер для #2611. ## Test plan - [x] 10 provider-тестов captcha-vs-empty (вкл. schema-drift, анти-флап, 1-req-1-attempt) - [x] Orchestration: all-failed→banned / partial→done / honest-empty→done, все 4 функции - [x] Алерт: N vs N-1, разрыв серии, mark_done-wiring - [x] Полный tradein-сьют: 3252 passed, 0 failed - [ ] Post-deploy: дождаться живого капча-эпизода → прогон реально уходит в `banned` ## Review code-reviewer ⚠️→✅: единственный minor (яндексовая асимметрия `_probe`/`fetch_around`) закрыт в этом же PR его же рецептом. Refs #2625
bot-backend added 1 commit 2026-08-04 19:00:04 +00:00
fix(tradein/scraper): капча Cian и заглушки Yandex — banned, не done (#2625)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 2m41s
34fcd5eebf
41 из 68 прогонов за 2 недели забирали 0 лотов со статусом done,
errors_count=0 — капча/смена вёрстки выглядела как честная пустая выдача,
деградация была невидима, а ротацию IP (#2611) нечем было триггерить.

Cian: счётчики Redux-state extraction (_extract_state_tracked — единая
точка SERP + total-probe); Yandex: gate_fetch-счётчики во всех терминальных
исходах, ok = _extract_gate_data is not None (schema-drift 'response без
search.offers' — тоже failure, включая _probe и пагинацию page>=2).
Run-gate во всех 4 sweep/full_load: все запросы прогона провалили
экстракцию -> mark_banned (как у Avito), частичный fail не флапает.
Алерт: N=3 подряд done с нулевым результатом по источнику — тем же
_alert_on_run_id-механизмом (checker-параметр). Пара
scrape_runs.py <-> orchestration/runs.py обновлена идентично.

Refs #2625
bot-backend merged commit 86ea09f2d5 into main 2026-08-04 19:03:34 +00:00
bot-backend deleted branch fix/tradein-captcha-banned-detect 2026-08-04 19:03:34 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2642
No description provided.