fix(tradein-imv): harden Avito IMV anti-bot path + offline contract tests (#565) #620

Merged
Light1YT merged 1 commit from feat/tradein-avito-imv-fix into main 2026-05-28 11:29:11 +00:00
Owner

Summary

Харденинг 3-step Avito IMV flow + оффлайн контракт-тесты.

Честный диагноз (важно): живой capture с этой машины показал, что контракт step B/C НЕ менялся (geoFieldsHash, price-блок, categoryId=24 — всё валидно, A→B→C даёт recommended 7.39M). Реальная причина поломки #565 — скорее анти-бот по PROD-IP, не регрессия кода. Поэтому этот PR — resilience-харденинг, не contract-fix.

Changes

  • warm-up GET /evaluation/realty (сеет анти-бот cookies, best-effort non-fatal)
  • session зеркалит avito.py: chrome120 + 25s timeout + full fetch headers (Sec-Fetch, X-Requested-With)
  • парсинг step B/C вынесен в pure helpers → оффлайн-тестируемо
  • 2 живых фикстуры + 12 тестов

⚠️ Devops follow-up

Если #565 останется после deploy — настоящий фикс = ротация egress IP прод-воркера (отдельный devops-таск, не backend). Этот PR максимизирует шансы пробиться, но IP-бан кодом не лечится.

Tests

12 new (27 total, parse-helpers против живых JSON). Ruff clean. code-reviewer APPROVE (warm-up non-fatal, injected-session unchanged, refactor preserves shapes, graceful-None, fixtures без PII).

Closes #565.

## Summary Харденинг 3-step Avito IMV flow + оффлайн контракт-тесты. **Честный диагноз (важно):** живой capture с этой машины показал, что контракт step B/C НЕ менялся (geoFieldsHash, price-блок, categoryId=24 — всё валидно, A→B→C даёт recommended 7.39M). Реальная причина поломки #565 — скорее **анти-бот по PROD-IP**, не регрессия кода. Поэтому этот PR — resilience-харденинг, не contract-fix. ## Changes - warm-up GET /evaluation/realty (сеет анти-бот cookies, best-effort non-fatal) - session зеркалит avito.py: chrome120 + 25s timeout + full fetch headers (Sec-Fetch, X-Requested-With) - парсинг step B/C вынесен в pure helpers → оффлайн-тестируемо - 2 живых фикстуры + 12 тестов ## ⚠️ Devops follow-up Если #565 останется после deploy — настоящий фикс = ротация egress IP прод-воркера (отдельный devops-таск, не backend). Этот PR максимизирует шансы пробиться, но IP-бан кодом не лечится. ## Tests 12 new (27 total, parse-helpers против живых JSON). Ruff clean. code-reviewer ✅ APPROVE (warm-up non-fatal, injected-session unchanged, refactor preserves shapes, graceful-None, fixtures без PII). Closes #565.
Light1YT added 1 commit 2026-05-28 11:29:09 +00:00
Add warm-up GET /evaluation/realty + production browser header set (Sec-Fetch,
X-Requested-With, 25s timeout) mirroring avito.py, чтобы защитить 3-step IMV flow
от server-IP анти-бот 403. Refactor step B/C парсинга в pure helpers
(_parse_geo_position/_parse_price/_parse_placement_history/_parse_suggestions)
+ fixture-driven offline тесты из живых JSON-captures.

Честный диагноз: контракт (geoFieldsHash, price-блок, categoryId=24) НЕ менялся —
проверено живым capture'ом с этой машины (A→B→C, recommended 7.39M). Реальная
причина #565 — скорее анти-бот по PROD-IP, не код → если #565 останется после
deploy, настоящий фикс = ротация egress IP воркера (devops, отдельно).

code-reviewer:  APPROVE no critical — warm-up non-fatal, injected-session path
unchanged, refactor preserves shapes, graceful-None сохранён, fixtures без PII.
Tests: 12 new (27 total). Ruff clean.

Closes #565
Light1YT merged commit 6553e5830f into main 2026-05-28 11:29:11 +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#620
No description provided.