fix(tradein/browser): снятый PoW-челлендж отдавался с протухшим статусом, и карточка выбрасывалась (#3283) #3306

Merged
bot-backend merged 1 commit from fix/3283e-pow-resolved-page-discarded into main 2026-08-31 14:54:00 +00:00

1 commit

Author SHA1 Message Date
bot-backend
67a136c95c fix(tradein/browser): снятый PoW-челлендж отдавался с протухшим статусом, и карточка выбрасывалась (#3283)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 11s
CI Trade-In / backend-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 / 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
Сайдкар уже пережидает челлендж QRATOR и уже его снимает, но
_last_response_status[provider] остаётся статусом challenge-страницы: он
пишется один раз, из ответа первого goto, а _wait_out_pow_challenge его не
обновляет. Наружу уходило {"html": <нормальная карточка>, "status": 439}, и
клиент avito/detail.py браковал её по одному коду, не заглянув в HTML.

Прод, прогон 5606 — одни и те же объявления:
  13:15:23 сайдкар: PoW снят за ~9000мс, догидрация  ...8242031370
  13:15:28 скрапер: BLOCKED #1  HTTP 439              ...8242031370
  13:22:33 сайдкар: PoW снят за ~3000мс, догидрация  ...8272722582
  13:22:37 скрапер: BLOCKED #11 HTTP 439              ...8272722582
Минимум 3 блока из 7 в прогоне — выброшенные страницы, уже вытащенные.

Ловить «свежий» статус нечем: PoW-страница чинит себя своим
window.location-редиректом, Response на который мы не наблюдаем, а
собственный page.reload() включается только после 8с — при снятии за 1-9с он
обычно не срабатывает вовсе. Поэтому на успешном выходе статус сбрасывается в
None («неизвестен»), а не тащится протухшим. Клиент None блоком не считает
(detail.py: `if status is not None`) и падает на html-эвристики, которые на
настоящем контенте не срабатывают.

Правка в общей функции, поэтому чинит и ветку DomClick. Провал ожидания
(ChallengeTimeoutError) остаётся отказом: сброс стоит после всех raise.

Клиента править не потребовалось — test_3044_avito_439_classified_as_block
зелёный без изменений.

Тесты сайдкара: 219 passed.
2026-08-31 17:46:45 +03:00