fix(tradein/cian): банить узел только когда состояния НЕТ, а не по слову «captcha» (#2767) #2801

Merged
bot-backend merged 1 commit from fix/2767-ban-only-on-parse-miss into main 2026-08-09 18:04:02 +00:00

1 commit

Author SHA1 Message Date
bot-backend
876bf378e9 fix(tradein/cian): банить узел только когда состояния НЕТ, а не по слову «captcha» (#2767)
All checks were successful
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 10s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m2s
Живая регрессия предыдущего PR, поймана на проде через 17 секунд после деплоя:

    17:47:44 BrowserFetcher: lease id=9 (cian) BANNED — cian newbuilding: captcha
    17:47:44 Cian newbuilding zhk-tihiy-centr-ekb-i.cian.ru parsed: id=108855

Одна и та же страница в одну и ту же секунду: разобрана успешно И объявлена
блоком. За минуту так забанились два ЗДОРОВЫХ узла (9 и 10). Причина: обычная
карточка ЖК грузит скрипт SmartCaptcha, подстрока «captcha» на ней есть всегда.

Ошибка была в том, что признак сменил смысл при переносе. `_ANTIBOT_MARKERS`
создавался объяснять УЖЕ СЛУЧИВШИЙСЯ отказ разбора — `_describe_parse_miss`
зовётся только из ветки «состояния нет», и там подстрока действительно значит
блок. Применённый как самостоятельный детектор на каждом ответе, тот же список
означает уже другое: «страница упоминает капчу».

Разбор перенесён внутрь `async with`, бан репортится только при
`nb_state is None` И найденной подписи. Условие «нет состояния» несущее, а не
уточняющее.

Тест на здоровой карточке в текущем формате Циана, содержащей слово-ловушку:
красный на смерженном коде (report_ban called 1 times), зелёный здесь.

Refs #2767
2026-08-09 22:50:38 +05:00