feat(scrapers): wire per-flat DOM.РФ catalog scraper + propagate catalog_url_hash (#2442) #2444

Merged
bot-backend merged 2 commits from feat/domrf-catalog-flats-celery-wiring into main 2026-07-05 17:00:59 +00:00
Collaborator

Summary

  • Task 1: _norm_flat (domrf_kn.py) прокидывает уже читаемый elemId в catalog_url_hash вместо жёсткого None — разблокирует источник хэшей для 983k квартир при следующем kn-sweep.
  • Task 2: новый scrape_kn_catalog_flats Celery task оборачивает scrape_catalog_batch (#2441) — batch по последнему snapshot WHERE catalog_url_hash IS NOT NULL + freshness/force. Registered в celery_app, ручной триггер POST /kn-catalog-flats.

WAF-safety (см. #2443)

DOM.РФ WAF hard-ban на VPS IP с 2026-05-24 — sibling object-level catalog scraper уже отключён по этой причине, cooldown не подтверждён 6 недель. Эта задача намеренно ships dormant, по тому же паттерну:

  • Beat-запись закомментирована (не назначается в рантайме)
  • Admin endpoint требует RBAC-авторизации (Caddy basic_auth + X-Authenticated-User=admin)
  • Browser-stack импортируется лениво внутри функции — не на старте воркера
  • code-reviewer независимо проследил все пути и подтвердил: нет способа вызвать живой запрос к ДОМ.РФ без явного ручного действия человека

Batch наполнится непустыми строками только после того, как эта задача задеплоится И пройдёт свежий kn-sweep (Task 1 разблокирует хэши только для новых snapshot). До этого — ожидаемо 0 строк, не баг.

Test plan

  • 18/18 тестов зелёные (TestCatalogUrlHash + новый test_scrape_kn_catalog_flats.py)
  • ruff чисто, psycopg CAST(:x AS type) конвенция соблюдена
  • code-reviewer: APPROVE, WAF-safety verdict отдельно проверен и подтверждён

Refs #2442, #2441, #2443, #299, #300

## Summary - **Task 1**: `_norm_flat` (domrf_kn.py) прокидывает уже читаемый `elemId` в `catalog_url_hash` вместо жёсткого `None` — разблокирует источник хэшей для 983k квартир при следующем kn-sweep. - **Task 2**: новый `scrape_kn_catalog_flats` Celery task оборачивает `scrape_catalog_batch` (#2441) — batch по последнему snapshot `WHERE catalog_url_hash IS NOT NULL` + freshness/force. Registered в celery_app, ручной триггер `POST /kn-catalog-flats`. ## WAF-safety (см. #2443) DOM.РФ WAF hard-ban на VPS IP с 2026-05-24 — sibling object-level catalog scraper уже отключён по этой причине, cooldown не подтверждён 6 недель. Эта задача **намеренно ships dormant**, по тому же паттерну: - Beat-запись закомментирована (не назначается в рантайме) - Admin endpoint требует RBAC-авторизации (Caddy basic_auth + `X-Authenticated-User=admin`) - Browser-stack импортируется лениво внутри функции — не на старте воркера - code-reviewer независимо проследил все пути и подтвердил: нет способа вызвать живой запрос к ДОМ.РФ без явного ручного действия человека Batch наполнится непустыми строками только после того, как эта задача задеплоится И пройдёт свежий kn-sweep (Task 1 разблокирует хэши только для новых snapshot). До этого — ожидаемо 0 строк, не баг. ## Test plan - [x] 18/18 тестов зелёные (`TestCatalogUrlHash` + новый `test_scrape_kn_catalog_flats.py`) - [x] ruff чисто, psycopg `CAST(:x AS type)` конвенция соблюдена - [x] code-reviewer: ✅ APPROVE, WAF-safety verdict отдельно проверен и подтверждён Refs #2442, #2441, #2443, #299, #300
bot-backend added 1 commit 2026-07-05 16:40:04 +00:00
feat(scrapers): wire per-flat DOM.РФ catalog scraper + propagate catalog_url_hash (#2442)
Some checks failed
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Failing after 1m57s
CI / backend-tests (pull_request) Successful in 14m44s
f6fb79522a
Task 1: _norm_flat теперь читает catalog_url_hash из уже доступного kn-API
elemId вместо жёсткого None (domrf_kn.py:479) — разблокирует источник
хэшей для 983k квартир при следующем kn-sweep. elemId or None корректно
нормализует и отсутствие, и пустую строку.

Task 2: новый scrape_kn_catalog_flats Celery task оборачивает уже
смерженный scrape_catalog_batch (#2441) — batch-выборка по последнему
snapshot WHERE catalog_url_hash IS NOT NULL + 30d freshness/force.
Зарегистрирован в celery_app, ручной триггер POST /kn-catalog-flats.

Beat-запись оставлена закомментированной — по образцу уже отключённого
object-level catalog scraper: DOM.РФ WAF hard-ban на VPS IP с 2026-05-24
(см. #2443), cooldown не подтверждён. Task ships полностью dormant:
beat не назначен в рантайме, admin-endpoint требует авторизации, browser-
stack импортируется лениво внутри функции (не на старте воркера), живой
fetch недостижим без непустого batch. code-reviewer отдельно проверил
WAF-safety независимо — подтверждено.

Batch наполнится непустыми строками только после того, как Task 1
задеплоится И пройдёт свежий kn-sweep — ожидаемо 0 строк первое время.

Refs #2442, #2441, #2443
Light1YT added 1 commit 2026-07-05 16:45:32 +00:00
chore(codegen): regenerate api-types.ts for /kn-catalog-flats endpoint
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Successful in 1m20s
CI / openapi-codegen-check (pull_request) Successful in 2m19s
CI / backend-tests (pull_request) Successful in 14m56s
e7608a09cf
openapi-codegen-check упал на #2444 — новый admin endpoint не был
отражён в сгенерированных типах. Пересобрано тем же рецептом, что
использует CI (dump app.openapi() + openapi-typescript + pinned
prettier).
bot-backend merged commit 5b3799a23a into main 2026-07-05 17:00:59 +00:00
bot-backend deleted branch feat/domrf-catalog-flats-celery-wiring 2026-07-05 17:00:59 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
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#2444
No description provided.