feat(tradein/scrapers): хранилище авторизованной сессии Яндекс.Недвижимости #3195
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
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
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#3195
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/3192-yandex-session-store"
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?
Часть 1 из #3192 — только хранилище. Проброс кук в провайдер и извлечение телефонов — следующим PR.
Мотив (измерено, не предположение)
Прод-сайдкар, две карточки, один тракт с куками и без:
"phoneNumbers""phones":["+7…у автора"encryptedPhones""redirectId"Структура, появляющаяся только с куками:
encryptedPhonesодинаков в обоих режимах — зашифрованные токены отдаются всегда, различие не в них.listings.phones(jsonb) существует в схеме и пуст у всех 51 251 активного объявления по всем четырём источникам.Что в PR
274_yandex_session_cookies.sql— форма 1:1 с работающими027_cian_session_cookies.sqlи174_domclick_session_cookies.sql.services/yandex_session.py—save/load/mark_invalid/expires_at,pgp_sym_encrypt.admin.py—POST /scrape/yandex/upload-cookies,GET /scrape/yandex/session-status.Два отличия от образцов, оба намеренные
1. Хранится полный CDP-объект куки, не плоский
dict[name→value]. У Яндекса куки на трёх доменах (.yandex.ru,.passport.yandex.ru,.realty.yandex.ru) и дублируют имена (pi×4,yashr×4) — плоский словарь их схлопывает. Сайдкар сегодня принимает только плоский формат (server.py:1197-1203фабрикует домен из URL); когда контракт починят, хранилище уже готово.2. Набор сохраняется целиком, минус аналитика (
_ym_*,yabs-*,_yasc*). Список критичных кук — только проверка, что дамп похож на авторизованную сессию, не фильтр сохранения. Замер сделан на полном наборе 44 кук, какая существенна — неизвестно; сужение до allowlist сломало бы измеренное. Защищено комментариями и тестом.Безопасность
Проверено ревью построчно: значений кук нет ни в одном
logger.*,raiseилиreturn; в сообщении валидации печатается только имя куки. Роуты закрыты на двух уровнях — Caddy basic_auth снаружи иrbac_guardвнутри (role=adminдля/api/v1/admin/*,rbac.py:55).Отдельно и вне этого PR: ревью нашло, что ключ шифрования и сами куки уезжают в GlitchTip через текст исключения SQLAlchemy (bind-параметры попадают в
StatementError). Дефект семейный — у Циана и Домклика то же самое. Заведён #3194, лечится глобально одной строкой вapp/core/db.py.Тесты
49 зелёных: 19 сервисных + 8 роутных + 22 соседних (cian/domclick — регрессий от правки
admin.pyнет).ruff format --check— чисто.Test plan
GET /scrape/yandex/session-statusотвечаетhasSession: falseupload-cookiesи убедиться, чтоload_sessionвозвращает полный наборRefs #3192