fix(tradein): cian _cianConfig concat-формат + auth из header-frontend (#639) #819
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#819
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/639-cian-state-concat"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Фикс 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.Проверено вживую (прод, валидная сессия userId 75544897)
_RE_CIAN_PUSH= 0 матчей при 12 живых_cianConfig; concat-парсер извлекает initialState;isAuthenticated:trueв header-frontend.После merge+deploy: verify_session(валидные куки) → authenticated → scheduler перестаёт скипать → cian оживает (SERP/valuation). Затем проверить #806 (proxy) для SERP-листингов.
Refs #639, #806, #623.
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.✅ 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.startfallback черезhtml.find("[")если regex не дотянул до скобки.json/loggerимпортированы (cian_state_parser.py:7,12).extract_state— concat-first, legacy.pushfallback → обратная совместимость: 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_sessionproxies). При re-push #818 воркер ребейзит — конфликта по строкам быть не должно, но re-GET mergeable на стороне #818.Post-deploy QA:
verify_session(валидные куки)→ authenticated → scheduler перестаёт скипать cian-бэкфилл.