feat(tradein/domclick): cookie-injection MVP для обхода QRATOR-блока (#2000) #2433

Merged
lekss361 merged 1 commit from feat/tradein-domclick-cookie-injection into main 2026-07-04 17:49:40 +00:00
Owner

Summary

  • Эмпирически подтверждено вживую 2026-07-04: инъекция cookies валидной аутентифицированной test-аккаунт сессии (Sber ID) полностью обходит QRATOR reputation-блок DomClick, даже на уже подозрительном прокси-IP.
  • domclick_session_cookies (миграция 174) + app/services/domclick_session.py — зеркалит существующий cian_session.py (pgp_sym_encrypt, account_cas_id вместо account_user_id), без verify_session (требует реального browser-фетча — future enhancement).
  • POST /scrape/domclick/upload-cookies — ручная загрузка (зеркалит upload_cian_cookies).
  • POST /scrape/domclick/debug/detail-fetch — единственный сейчас живой путь прогнать связку session→cookies→fetch_detail (боевой backfill-оркестратор для DomClick ещё не смёржен, issue #2000). source="domclick" — выделенный резидентный прокси-пул (id=1), построенный и verified в этой же сессии.
  • _assert_domclick_host — SSRF-guard для *.domclick.ru поддоменов.
  • server.py/browser_fetcher.py: cookies-параметр расширяет origin-механизм (#2430) той же схемой — keyword-only, default None → byte-identical для avito/cian/yandex. Домен cookie выводится из hostname целевого URL (провайдер-агностично).

Test plan

  • test_domclick_admin_apis.py + test_domclick_session.py + test_domclick_detail.py: 60 passed
  • test_kit_browser_fetcher_proxy_pool.py + test_cian_session.py (regression): 37 passed
  • Полный tradein-mvp/browser/ suite: 85 passed, 4 pre-existing failures (verified independently against clean main — unrelated _ensure_browser(proxy_override=...) signature drift)
  • 24 файла, ссылающиеся на browser_fetcher/BrowserFetcher/fetch_detail/domclick (avito/cian/yandex/domclick): 379 passed, 0 failed
  • Полный backend suite: 2319 passed, 1 pre-existing unrelated failure (test_search_cache_hit)
  • code-reviewer: APPROVE (SSRF-guard проверен на конкретных обходных строках, cookie-шифрование/no-logging проверено, source="cian"→"domclick" исправлено по замечанию ревью)

Refs #2000 — cookie-injection снимает механизм обхода QRATOR, но боевой backfill-оркестратор (dormant-ветка feat/tradein-domclick-detail-backfill) остаётся отдельным шагом.

## Summary - Эмпирически подтверждено вживую 2026-07-04: инъекция cookies валидной аутентифицированной test-аккаунт сессии (Sber ID) полностью обходит QRATOR reputation-блок DomClick, даже на уже подозрительном прокси-IP. - `domclick_session_cookies` (миграция 174) + `app/services/domclick_session.py` — зеркалит существующий `cian_session.py` (pgp_sym_encrypt, `account_cas_id` вместо `account_user_id`), без `verify_session` (требует реального browser-фетча — future enhancement). - `POST /scrape/domclick/upload-cookies` — ручная загрузка (зеркалит `upload_cian_cookies`). - `POST /scrape/domclick/debug/detail-fetch` — единственный сейчас живой путь прогнать связку session→cookies→fetch_detail (боевой backfill-оркестратор для DomClick ещё не смёржен, issue #2000). `source="domclick"` — выделенный резидентный прокси-пул (id=1), построенный и verified в этой же сессии. - `_assert_domclick_host` — SSRF-guard для `*.domclick.ru` поддоменов. - `server.py`/`browser_fetcher.py`: `cookies`-параметр расширяет origin-механизм (#2430) той же схемой — keyword-only, default `None` → byte-identical для avito/cian/yandex. Домен cookie выводится из hostname целевого URL (провайдер-агностично). ## Test plan - [x] `test_domclick_admin_apis.py` + `test_domclick_session.py` + `test_domclick_detail.py`: 60 passed - [x] `test_kit_browser_fetcher_proxy_pool.py` + `test_cian_session.py` (regression): 37 passed - [x] Полный `tradein-mvp/browser/` suite: 85 passed, 4 pre-existing failures (verified independently against clean main — unrelated `_ensure_browser(proxy_override=...)` signature drift) - [x] 24 файла, ссылающиеся на browser_fetcher/BrowserFetcher/fetch_detail/domclick (avito/cian/yandex/domclick): 379 passed, 0 failed - [x] Полный backend suite: 2319 passed, 1 pre-existing unrelated failure (`test_search_cache_hit`) - [x] code-reviewer: ✅ APPROVE (SSRF-guard проверен на конкретных обходных строках, cookie-шифрование/no-logging проверено, source="cian"→"domclick" исправлено по замечанию ревью) Refs #2000 — cookie-injection снимает механизм обхода QRATOR, но боевой backfill-оркестратор (dormant-ветка `feat/tradein-domclick-detail-backfill`) остаётся отдельным шагом.
lekss361 added 1 commit 2026-07-04 17:46:43 +00:00
feat(tradein/domclick): cookie-injection MVP для обхода QRATOR-блока (#2000)
All checks were successful
CI / changes (pull_request) Successful in 7s
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 Trade-In / changes (pull_request) Successful in 7s
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 52s
0b9dfcc691
Эмпирически подтверждено вживую 2026-07-04: инъекция cookies валидной
аутентифицированной test-аккаунт сессии (Sber ID) полностью обходит QRATOR
reputation-блок DomClick, даже на уже подозрительном прокси-IP (проверено:
проход через camoufox context.addCookies() → 200 + полный __SSR_STATE__ на
IP, который секундами ранее отдавал anti-bot страницу без cookies).

- domclick_session_cookies (миграция 174) + app/services/domclick_session.py —
  зеркалит существующий cian_session.py (pgp_sym_encrypt, account_cas_id вместо
  account_user_id), без verify_session (DomClick-верификация требует реального
  browser-фетча, не curl_cffi — future enhancement).
- POST /scrape/domclick/upload-cookies — ручная загрузка (зеркалит upload_cian_cookies).
- POST /scrape/domclick/debug/detail-fetch — единственный сейчас живой путь
  прогнать связку session→cookies→fetch_detail (боевой backfill-оркестратор
  для DomClick ещё не смёржен). source="domclick" — выделенный резидентный
  прокси-пул (id=1, provider_affinity='domclick'), построенный и verified
  в этой же сессии, а не устаревший source="cian" из старой рекомендации.
- _assert_domclick_host — SSRF-guard для *.domclick.ru поддоменов (реальные
  карточки живут на региональных поддоменах, не на голом domclick.ru).
- server.py/browser_fetcher.py: cookies-параметр расширяет origin-механизм
  (#2430) той же схемой — keyword-only, default None → byte-identical для
  avito/cian/yandex. Домен cookie выводится из hostname целевого URL
  (провайдер-агностично), не захардкожен под domclick.
lekss361 merged commit ced616d150 into main 2026-07-04 17:49:40 +00:00
lekss361 deleted branch feat/tradein-domclick-cookie-injection 2026-07-04 17:49:41 +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#2433
No description provided.