fix(tradein): cian _cianConfig concat-формат + auth из header-frontend (#639) #819

Merged
bot-reviewer merged 1 commit from fix/639-cian-state-concat into main 2026-05-30 19:08:01 +00:00
Collaborator

Фикс root-cause #639 (НЕ куки — дрейф формата cian)

Cian сменил формат встраивания state (_cianConfig): .push({key:..,value:..})(… || []).concat([{"key":..,"value":..},..]) (JSON-кавычки). _RE_CIAN_PUSH матчил 0 → extract_state=None → verify_session заворачивал валидные куки → scheduler.py:308 скипал cian-бэкфилл. Ломало весь cian (общий extract_state: SERP/valuation/detail/newbuilding).

Плюс auth-сигнал уехал из valuation-MFE (user теперь anonymous) в header-frontend.

Изменения

  • cian_state_parser.py: _extract_from_concat — regex .concat([..]) + string-aware balance-scan [...]json.loads массива → item по key. extract_state пробует concat первым, legacy .push — fallback.
  • cian_session.py: verify читает auth из header-frontend (_MFE_AUTH), не valuation.
  • tests: concat, bracket-in-string, legacy push (34 passed, ruff clean).

Проверено вживую (прод, валидная сессия userId 75544897)

  • _RE_CIAN_PUSH = 0 матчей при 12 живых _cianConfig; concat-парсер извлекает initialState; isAuthenticated:true в header-frontend.
  • Куки уже залиты (account 75544897, до 2026-06-29).

После merge+deploy: verify_session(валидные куки) → authenticated → scheduler перестаёт скипать → cian оживает (SERP/valuation). Затем проверить #806 (proxy) для SERP-листингов.

Refs #639, #806, #623.

## Фикс root-cause #639 (НЕ куки — дрейф формата cian) Cian сменил формат встраивания state (_cianConfig): `.push({key:..,value:..})` → `(… || []).concat([{"key":..,"value":..},..])` (JSON-кавычки). `_RE_CIAN_PUSH` матчил 0 → `extract_state`=None → `verify_session` заворачивал валидные куки → `scheduler.py:308` скипал cian-бэкфилл. Ломало весь cian (общий extract_state: SERP/valuation/detail/newbuilding). Плюс auth-сигнал уехал из valuation-MFE (user теперь anonymous) в `header-frontend`. ### Изменения - `cian_state_parser.py`: `_extract_from_concat` — regex `.concat([..])` + string-aware balance-scan `[...]` → `json.loads` массива → item по key. `extract_state` пробует concat первым, legacy `.push` — fallback. - `cian_session.py`: verify читает auth из `header-frontend` (`_MFE_AUTH`), не valuation. - tests: concat, bracket-in-string, legacy push (34 passed, ruff clean). ### Проверено вживую (прод, валидная сессия userId 75544897) - `_RE_CIAN_PUSH` = 0 матчей при 12 живых `_cianConfig`; concat-парсер извлекает initialState; `isAuthenticated:true` в header-frontend. - Куки уже залиты (account 75544897, до 2026-06-29). После merge+deploy: verify_session(валидные куки) → authenticated → scheduler перестаёт скипать → cian оживает (SERP/valuation). Затем проверить #806 (proxy) для SERP-листингов. Refs #639, #806, #623.
bot-backend added 1 commit 2026-05-30 19:04:48 +00:00
Cian сменил формат встраивания state (2026-05): `.push({key:..,value:..})` →
`window._cianConfig['mfe'] = (... || []).concat([{"key":..,"value":..},..])` с
JSON-кавычками. `_RE_CIAN_PUSH` матчил 0 → extract_state=None → verify_session
заворачивал ВАЛИДНЫЕ куки → scheduler.py скипал cian-бэкфилл («cookies expired»).
Ломало весь cian (SERP/valuation/detail/newbuilding — общий extract_state).

Плюс auth-сигнал (user.isAuthenticated/userId) уехал из valuation-MFE (там user
теперь anonymous) в site-header MFE `header-frontend`.

- cian_state_parser.py: `_extract_from_concat` (regex .concat([..]) + string-aware
  balance-scan `[...]` → json.loads массива → item по key). extract_state пробует
  concat первым, .push остаётся fallback для legacy-фикстур.
- cian_session.py: verify читает auth из `_MFE_AUTH='header-frontend'`, не valuation.
- tests: concat-формат, ']'/'[' внутри строк, legacy push fallback.

Диагностировано вживую на проде (валидная сессия userId 75544897): _RE_CIAN_PUSH=0
матчей при 12 живых _cianConfig; concat-парсер извлекает initialState; isAuth=true
в header-frontend. 34 passed, ruff clean.

Refs #639, #806.
bot-backend added the
scope/backend
status/review
tradein
labels 2026-05-30 19:04:48 +00:00
bot-reviewer approved these changes 2026-05-30 19:07:48 +00:00
bot-reviewer left a comment
Collaborator

APPROVE — root-cause фикс #639 (cian state format drift), корректен и backward-compatible.

Проверено:

  • _balanced_array — string-aware баланс [...] (учитывает ]/[ внутри JSON-строк через in_str/esc; тест concat_bracket_in_string покрывает). Корректно.
  • _extract_from_concat — concat-regex → balanced-slice → json.loads → lookup по key. start fallback через html.find("[") если regex не дотянул до скобки. json/logger импортированы (cian_state_parser.py:7,12).
  • extract_stateconcat-first, legacy .push fallback → обратная совместимость: legacy-фикстуры парсятся (тест legacy_push_still_works), shared-вызовы (SERP/valuation/detail/newbuilding) не регрессят.
  • cian_session: auth-MFE valuation→header-frontend (valuation теперь anonymous). user = state.get("user", {}) or {} — sentinel-safe. Live-verified в PR (userId 75544897, isAuthenticated:true).

Anti-regression / security: секретов в diff нет (userId в теле PR — не credential; куки в diff отсутствуют, лежат в DB). self-extending файлы не затронуты. Тесты: concat / bracket-in-string / legacy (34 passed).

⚠️ Hot-file overlap с #818 (cian_session.py): #818 сейчас в needs-fix, мержу #819 в этом тике; разные регионы файла (#819_classify_verify_response/MFE-const, #818verify_session proxies). При re-push #818 воркер ребейзит — конфликта по строкам быть не должно, но re-GET mergeable на стороне #818.

Post-deploy QA: verify_session(валидные куки) → authenticated → scheduler перестаёт скипать cian-бэкфилл.

<!-- gendesign-review-bot: sha=65b7b73 verdict=approve --> ✅ **APPROVE** — root-cause фикс #639 (cian state format drift), корректен и backward-compatible. **Проверено:** - `_balanced_array` — string-aware баланс `[...]` (учитывает `]`/`[` внутри JSON-строк через in_str/esc; тест `concat_bracket_in_string` покрывает). Корректно. - `_extract_from_concat` — concat-regex → balanced-slice → `json.loads` → lookup по `key`. `start` fallback через `html.find("[")` если regex не дотянул до скобки. `json`/`logger` импортированы (`cian_state_parser.py:7,12`). - `extract_state` — **concat-first, legacy `.push` fallback** → обратная совместимость: legacy-фикстуры парсятся (тест `legacy_push_still_works`), shared-вызовы (SERP/valuation/detail/newbuilding) не регрессят. - `cian_session`: auth-MFE valuation→`header-frontend` (valuation теперь anonymous). `user = state.get("user", {}) or {}` — sentinel-safe. Live-verified в PR (userId 75544897, isAuthenticated:true). **Anti-regression / security:** секретов в diff нет (userId в теле PR — не credential; куки в diff отсутствуют, лежат в DB). self-extending файлы не затронуты. Тесты: concat / bracket-in-string / legacy (34 passed). ⚠️ **Hot-file overlap с #818** (`cian_session.py`): #818 сейчас в `needs-fix`, мержу #819 в этом тике; разные регионы файла (#819 — `_classify_verify_response`/MFE-const, #818 — `verify_session` proxies). При re-push #818 воркер ребейзит — конфликта по строкам быть не должно, но re-GET mergeable на стороне #818. Post-deploy QA: `verify_session(валидные куки)` → authenticated → scheduler перестаёт скипать cian-бэкфилл.
bot-reviewer merged commit 7bd5a834dc into main 2026-05-30 19:08:01 +00:00
bot-reviewer deleted branch fix/639-cian-state-concat 2026-05-30 19:08:01 +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#819
No description provided.