feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия #3250
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#3250
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/browser-referer-on-card-nav"
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?
Откуда это
Добор карточек Домклика упирается в отказ на 11-й карточке. Прогон 5298 (после PR #3244):
attempted=13, enriched=10, blocked=3. Ручные прогоны в живом браузере — 91 и 40 карточек без единого отказа. Значит дело не в том, что площадка нас не пускает, а в том, чем машинный заход отличается от человеческого. Отличий нашлось два, и оба наши.1. Referer не отправлялся никогда
page.goto(url)в playwright по умолчанию этот заголовок не шлёт, а параметрreferer, который метод принимает, мы не передавали. Ни вbrowser/server.py, ни вbrowser_fetcher.pyсловаRefererне было вовсе — только в комментариях, которые уверяли про «органическую навигацию с реальными cookies/Referer». Комментарии врали: работал один прогрев кук.С точки зрения площадки браузер грузил выдачу, а потом десять раз подряд возникал прямо на URL карточки — ниоткуда. Человек так не ходит: он приходит из поиска или кликает из выдачи, и в обоих случаях Referer уходит.
Сайдкар теперь принимает
refererв теле/fetchи ставит его только на целевую навигацию; на origin и якорную вкладку — не ставит, туда приходят «сами». Добор Домклика передаёт страницу выдачи, чем переход и является по смыслу.2. Зависшее рукопожатие не перезагружалось
_wait_out_pow_challengeбыл построен на допущении из докстринга: «страница перезагружает СЕБЯ САМА (window.location = location.href) после решения PoW». Ручная сессия 29.08 через узел 10 (headful-камуфокс, прод-прокси, путь «яндекс-поиск → выдача → карточка») это опровергла:Сама страница не ожила. Пропуск выдался только после повторных навигаций. Пока сайдкар лишь опрашивал
content()на месте, такая страница гарантированно доживала доBROWSER_CHALLENGE_WAIT_MS, а бэкфилл засчитывал это в блоки — и банил узел на 6 часов (#3246).page.reload()не вызывался в сайдкаре нигде. Теперь послеBROWSER_CHALLENGE_RELOAD_AFTER_MS(8 с) безрезультатного опроса сайдкар перезагружает сам, не большеBROWSER_CHALLENGE_MAX_RELOADS(2) раз за фетч — ровно то действие, которым человек и вышел из этого состояния.Безопасность отката
refererв теле — поведение прежнее, байт в байт.BROWSER_CHALLENGE_RELOAD_AFTER_MS=0— прежний опрос без единой навигации.Тесты
191 passed в сайдкаре против 182 до правки: 4 на Referer (доходит до целевого
goto, не доходит до origin/якоря, отсутствие поля = прежнее поведение) и 5 на перезагрузку (зависший челлендж оживает после reload; самостоятельно ожившая страница reload не получает; вечно висящий не превышает лимит; нулевой порог отключает; упавший reload не роняет ожидание).Точечные backend-тесты домклика и
scraper_kit— 144 passed.ruff checkчист по всем затронутым файлам.Что дальше
После деплоя прогнать добор тем же батчем и сравнить с
enriched=10, blocked=3. Связано: #3244 (якорная вкладка), #3246 (бан узла там, где хватило бы сброса контекста).