gendesign/tradein-mvp/browser
bot-backend 957e9e8c01
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 5m8s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Successful in 1m27s
fix(#3402): капча = «Captcha…» и «Вы не робот?» (бан+ротация); «Ошибка - Циан» — только лог на цикл наблюдения
Ревью (⚠️ minor) на #3403: «Ошибка - Циан» может быть транзиентной 5xx-страницей,
отданной с кодом 200, а не отказом конкретному узлу. Цена ошибки несимметрична —
mark_banned эскалирует TTL до часов, поэтому 20-минутный сбой площадки выбил бы из
выдачи весь пул. Один список маркеров этого различить не мог: и капча, и страница
ошибки шли одним путём в BanPageDetectedError.

Проба прода 06.09.2026 09:25 UTC (одна карточка по узлам через сайдкар):
* узел 14, час назад отдававший «Captcha - база объявлений ЦИАН», вернул НАСТОЯЩУЮ
  карточку — капча снимается за 1-2 часа, то есть TTL бана по назначению;
* узел 1 отдал ТРЕТИЙ вариант отказа — `<title>Вы не робот?`, 16 КБ (час назад —
  «Ошибка - Циан», 374 КБ). Прежние маркеры его не знали вовсе: отказ уезжал наверх
  как валидный HTML ровно так же, как до #3402.

Маркеры разделены на два класса, одинаково в обоих слоях (образы backend и browser
деплоятся раздельно и расходятся на часы):
* КАПЧА — «captcha - база объявлений циан» + «вы не робот?»: безусловный отказ
  площадки, прежний путь (сайдкар → BanPageDetectedError → 403 + ban_page; kit →
  report_platform_ban + CianBlockedError). За ней нет контента, и узел, которому её
  показали, будет получать её дальше;
* «ошибка - циан» — ТОЛЬКО ЛОГ: сайдкар отдаёт HTML клиенту как есть и пишет WARNING
  «страница ошибки Циана (title=…, upstream=…) — не бан, только лог (#3402)», kit при
  провале extract_state пишет WARNING и возвращает прежний None. Ни бана, ни рапорта,
  ни исключения — решение принимаем по частоте в логах за цикл наблюдения, а не по
  догадке о природе страницы.

Нормализация заголовка прежняя (регистр/пробелы/тире). `_is_cian_refusal` →
`_is_cian_captcha` + `_log_cian_error_page`; `_refusal_title` → `_page_title` и два
кортежа маркеров рядом.

Фальсификация: «вы не робот?» убран из маркеров обоих слоёв → kit 1 failed
(«DID NOT RAISE CianBlockedError»), сайдкар 3 failed («DID NOT RAISE
BanPageDetectedError», `_is_cian_captcha` → assert False is True). Маркер возвращён,
обе сьюты зелёные: backend 5599 passed / 35 skipped, browser 246 passed.
2026-09-06 14:55:45 +05:00
..
Dockerfile fix(tradein/browser): проверка шрифтов в сборке ловила угаданный порог, а не суть 2026-08-30 01:47:42 +03:00
server.py fix(#3402): капча = «Captcha…» и «Вы не робот?» (бан+ротация); «Ошибка - Циан» — только лог на цикл наблюдения 2026-09-06 14:55:45 +05:00
test_server.py feat(tradein/browser): имитация чтения страницы человеком, целиком opt-in (#3283) (#3308) 2026-09-01 07:34:49 +00:00
test_server_anchor_origin_switch.py fix(tradein/avito): браузерный путь ходил на каждую карточку холодным (#3251) 2026-08-30 11:47:15 +03:00
test_server_anchor_search.py fix(tradein/browser): переход с Яндекса на площадку должен быть настоящим, а не заявленным 2026-08-29 23:41:56 +03:00
test_server_behaviour.py feat(tradein/browser): имитация чтения страницы человеком, целиком opt-in (#3283) (#3308) 2026-09-01 07:34:49 +00:00
test_server_challenge_reload.py feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия 2026-08-29 22:53:11 +03:00
test_server_cian_captcha.py fix(#3402): капча = «Captcha…» и «Вы не робот?» (бан+ротация); «Ошибка - Циан» — только лог на цикл наблюдения 2026-09-06 14:55:45 +05:00
test_server_cookie_domain.py test(tradein/browser): домен инжектируемых кук — регистрируемый, не хост из url 2026-08-30 01:51:02 +03:00
test_server_domclick_challenge.py fix(tradein/domclick): недосчитанная QRATOR-страница уходила наверх как контент 2026-08-29 18:31:35 +03:00
test_server_fetch_json.py fix(tradein/domclick): площадка отдаёт одну карточку на процесс браузера, а мы держали один на весь прогон (#3205) 2026-08-29 13:14:20 +03:00
test_server_fetch_mode.py fix(tradein/domclick): свип брал BFF навигацией браузера — теперь подзапросом (#3264) 2026-08-30 11:24:28 +03:00
test_server_http_status.py fix(tradein): сайдкар отдаёт подтверждённый бан площадки кодом 403, не 500 2026-09-06 01:58:02 +05:00
test_server_no_proxy_refusal.py chore(tradein): удалить мёртвые mobileproxy env-переменные и rotate-ip (#2616 шаги 2-3) (#2650) 2026-08-05 09:35:54 +00:00
test_server_pacing.py fix(tradein/domclick): площадка отдаёт одну карточку на процесс браузера, а мы держали один на весь прогон (#3205) 2026-08-29 13:14:20 +03:00
test_server_pow_challenge.py feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия 2026-08-29 22:53:11 +03:00
test_server_proxy_override.py chore(tradein): удалить мёртвые mobileproxy env-переменные и rotate-ip (#2616 шаги 2-3) (#2650) 2026-08-05 09:35:54 +00:00
test_server_recycle.py fix(tradein/domclick): перезапуск браузера на карточку уничтожал пропуск QRATOR (#3212) 2026-08-29 14:09:23 +03:00
test_server_referer.py feat(tradein/browser): ходить по Домклику как человек — с Referer и с перезагрузкой зависшего рукопожатия 2026-08-29 22:53:11 +03:00
test_server_resource_block.py feat(browser): block font/media + per-provider page pacing — снизить proxy fan-out (#1812) 2026-06-19 21:28:09 +03:00
test_server_reuse_context.py test(tradein/browser): домен инжектируемых кук — регистрируемый, не хост из url 2026-08-30 01:51:02 +03:00
test_server_smoke.py test(tradein/browser): домен инжектируемых кук — регистрируемый, не хост из url 2026-08-30 01:51:02 +03:00