fix(tradein/domclick): мы считали блоком собственное недоделанное рукопожатие #3237
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#3237
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/domclick-challenge-not-a-block"
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?
Корневая причина двухнедельного
attempted=3, blocked=3, enriched=0уdomclick_detail_backfill. Мы не натыкались на защиту площадки — мы прерывали собственный обмен с ней и наказывали за это узел.Механизм
Камуфокс решает QRATOR-PoW сам. Но сайдкар отдаёт HTML после слепой паузы
BROWSER_WAIT_MS, и если PoW ещё не досчитан, наверх уезжает недоделанная страница. Парсер не находит__SSR_STATE__, ловитDOMCLICK_BLOCK_MARKERSи поднимаетDomClickBlockedError— сообщение внутри которого буквально гласит"challenge page detected".Дальше по цепочке:
blocked++,consecutive_blocks++report_ban— здоровый узел уходит в бан на двое суток за то, что показал челленджrequest_context_reset()— выбрасывается контекст, которому оставался один цикл опроса до рабочего пропускаABORTВетка ожидания
_wait_out_pow_challengeпри этом существует и исправна — её написали для Авито в #3045. Она просто не включалась для Домклика:_CHALLENGE_MARKERS(startpow, «Доступ ограничен: проверка безопасности») сняты с Авито, и на страницах Домклика их нет. Код это даже признаёт в комментарии наserver.py:1184.Замеры прода 29.08
Здоровый узел, один контекст, одна и та же карточка трижды подряд:
__SSR_STATE__, ни маркеров__SSR_STATE____SSR_STATE__Пропуск зарабатывается на первом запросе. Достаточно было его дождаться.
Различимые состояния (маркеры сняты вживую, как предписывает комментарий на
:1161):<script src="/__qrator/qauth_*.js"><title>403 | Домклик</title>, «Похоже, ваш запрос выглядит необычно»__SSR_STATE__Решение: инвертировать опознание
Опознавать челлендж положительно нельзя — у рендеренной PoW-страницы стабильных строк нет вовсе, любой такой маркер протухнет на следующей смене вёрстки. Поэтому для
provider == "domclick"положительно опознаются только два крайних состояния:__SSR_STATE__→ успех, отдаём сразу;BanPageDetectedError, ждать нечего;_wait_out_pow_challenge, без бана и без сброса контекста._wait_out_pow_challengeполучил опциональныйis_pending(дефолт — прежний_is_pow_challenge), поэтому Авито, Циан, Яндекс и generic идут по старой ветке байт-в-байт._REFUSAL_STATUSESнамеренно не тронут. Добавить туда 401 — заманчиво и неверно: с этим кодом сегодня приходят и челлендж, и отказ, и успешная страница на 842 КБ. Для Домклика статус не смотрится вовсе, решает только тело.Известный компромисс
Если Домклик переименует
__SSR_STATE__(дрейф схемы), карточка будет ждать полныеBROWSER_CHALLENGE_WAIT_MS= 30 с вместо быстрой ошибки разбора, и прогон прервётся после трёх таких. Узлы при этом не банятся:ChallengeTimeoutErrorуходит наверх иproviders/domclick/detail.py:547-555заворачивает его безmark_banned. Считаю размен приемлемым — цена дрейфа втрое меньше, чем цена нынешнего ложного бана.Тесты
Новый
tradein-mvp/browser/test_server_domclick_challenge.py— детекторы плюс 7 сценариев_fetch_once: отказ сразу, ожидание без маркеров → успех, успех сразу, отказ уже во время ожидания, исчерпание бюджета, 401 не трактуется как отказ, не-домклик провайдер не задет.test_server_reuse_context.py— два существующих теста: их fake-страница отдавала generic HTML приprovider="domclick"и под новой логикой корректно уходила в ожидание. В фикстуру добавлен__SSR_STATE__. Проверено отдельно, что это адаптация, а не маскировка: страница действительно прогоняется через новую ветку, без маркера тест падал бы по существу.Полный набор сайдкара: 174 passed. Ревью — ✅ APPROVE, критичных замечаний нет.
Приёмка после деплоя
Плановый
domclick_detail_backfill. Вcountersждёмblockedзаметно меньшеattemptedи ненулевойenriched— сейчас тамattempted=3, blocked=3, enriched=0. В логах сайдкара должно появиться «PoW-челлендж снят за ~Nмс» для домклика, чего раньше не было никогда.Оговорка: узлы пула 1/9/10/11 сегодня подпорчены диагностическими пробами, поэтому первый прогон может упереться в остаточные отказы площадки, а не в эту правку. Судить по второму.
Refs #3190, #2854, #3212, #3196, #3045.