fix(tradein/domclick): одна карточка на процесс браузера — перезапускать camoufox после каждой страницы (#3205) #3206
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#3206
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3205-domclick-recycle"
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?
Closes #3205.
Причина
ДомКлик режет не IP, не сессию и не челлендж. Он отдаёт ровно одну карточку на запущенный экземпляр браузера; вторая и далее получают страницу отказа. Прод держал один браузер на весь прогон — отсюда «примерно одна карточка за прогон» все эти месяцы.
Замеры (прод-сервер, 2026-08-29)
Три независимых запуска camoufox через прод-прокси, идём до первого отказа:
Прокси и прямой выход неразличимы — дело не в точке выхода. Цена перезапуска — 0.6 с.
Свежего контекста не хватает. В контрольном замере каждая карточка бралась через
browser.new_page(), то есть в новом изолированном контексте, — и всё равно отказ со второй. Признак живёт на уровне процесса: camoufox генерирует отпечаток при запуске, а не при создании контекста. Значитreset_contextиз #3118 эту задачу не решает в принципе.Что сделано
PROVIDERSпополнился"domclick"(плюс host-detectdomclick.ru → domclick). Раньше он проваливался вgeneric, деля браузер и счётчик страниц с прочим трафиком, — при пороге перезапуска 1 это было бы просто неверно. Устаревший комментарий в_resolve_provider(«generic-путь эквивалентен») переписан._resolve_recycle_pages+BROWSER_RECYCLE_PAGES_{PROVIDER}, по образцуBROWSER_BLOCK_IMAGES_{PROVIDER}(#3185) иBROWSER_MIN_PAGE_INTERVAL_S_{PROVIDER}. Приоритет: per-provider env → глобальный env → код-дефолт per-provider → 15. Невалидное значение — фолбэк, а не падение;<1приводится к 1.domclick = 1, остальным прежние 15. Авито и Циан не трогаем: у них узор другой, менять его без своего замера нельзя.Отдельно: починены ~24 холостых охранника в тестах
По набору стояло
monkeypatch.setattr(server, "BROWSER_RECYCLE_PAGES", 10_000)— так тесты запрещали перезапуск браузера. После перехода на словарь этот патч перестал влиять на что-либо: сравнения читают_RECYCLE_PAGES_BY_PROVIDER. Набор оставался зелёным только потому, что ни один тест не делает 15 страниц подряд, — защита держалась на совпадении.Теперь патчится
_RECYCLE_PAGES_BY_PROVIDER, а сама глобальная константа убрана, чтобы её не патчили снова (env-имяBROWSER_RECYCLE_PAGESпродолжает читаться внутри резолвера как один из уровней приоритета).Проверено мутацией: при
_RECYCLE_PAGES_DEFAULT_FALLBACK = 1падают ровно три теста, которые сам этот дефолт и проверяют, а остальные 155 удерживаются — значит охранники работают, а не просто присутствуют.Проверка
tradein-mvp/browser: 158 passed (было 149; +8 новых на_resolve_recycle_pages, +1 на host-detect)Ожидаемый эффект
domclick_detail_backfill(ближайший прогон — сегодня 17:47 UTC) перестаёт упираться в потолок одной карточки. За 14 дней у него 14 прогонов из 14 вbannedпри нуле обогащений; ограничением станет темп, а не отпечаток браузера.Что этим опровергнуто
Четыре гипотезы, каждая закрыта замером: протухший
qrator_jsid2(по ней был собран и задеплоен #3193 — не изменил ничего); «camoufox не проходит JS-челлендж» (челленджа в отказе нет вовсе); «выходим через забракованный узел пула» (все четыре узла дают тот же отказ); «виновата сохранённая сессия» (401 одинаково с 16 куками и анонимно).