fix(tradein/scrapers): три прод-пути остались на chrome120, пока kit ушёл на chrome146 #3149

Merged
bot-backend merged 2 commits from fix/3148-backend-impersonate into main 2026-08-27 15:29:52 +00:00
Collaborator

Summary

#3034 поднял impersonate-профиль до chrome146 внутри scraper_kit и свёл его к одной константе. Три прод-пути бэкенда в тот периметр не входили и остались на chrome120:

Файл Что делает
app/services/cian_session.py:164 верификация куки Циана — седьмой источник эстиматора
app/services/yandex_address_backfill.py:153 бэкфилл адресов Яндекса
app/tasks/yandex_detail_backfill.py:303 detail-бэкфилл Яндекса

Сторож литерала (test_impersonate_single_source.py) сканировал только пакет, а его докстрока объявляла остальное «отдельным периметром вне scope #3034» со ссылкой на #2361 F4a — который к тому моменту закрыт. То есть исключение осталось, а адресат исключения исчез.

Почему это не косметика

Разрыв в 31 мажорную версию живёт в TLS-отпечатке (JA3/JA4), а не в строке User-Agent — сменой прокси не лечится.

Отдельно про Циан: по #2673 его оценка мертва с 29 июня, «куки протухли, ни одной новой строки 37 дней». Путь, которым проверяется живость этих куки, всё это время представлялся площадке браузером двухлетней давности. Причиной это не объявляю — но при таком отпечатке отличить «куки протухли» от «нас узнали по рукопожатию» нечем.

Тест закреплял ровно тот дефект, ради которого заводился #3034

test_cian_session.py:488 прибивал chrome120 гвоздём: подъём профиля в kit ронял бы этот тест, а «починкой» выглядел бы возврат к устаревшему профилю. Теперь тест сверяется с DEFAULT_IMPERSONATE.

Что ещё в диффе

  • Сторож расширен на backend/app/ — без этого периметр возвращается молча, что уже один раз и произошло.
  • Намеренно НЕ входят tests/fixtures/** (номер профиля — часть записи о том, чем снят фикстур-HTML) и tradein-mvp/scripts/** (разовые инструменты вне прод-путей). Исключения теперь описаны в докстроке сторожа, а не подразумеваются.
  • Исторические замеры в комментариях сохранены как замеры: «curl_cffi с kit-профилем (на момент замера — Chrome 120)» вместо переписывания истории.

Test plan

  • Сканер сторожа на дереве: ноль нарушителей (scraper_kit + backend/app)
  • Детектор краснеет на подсаженном литерале
  • Все изменённые модули компилируются (py_compile)
  • CI: test_impersonate_single_source.py + test_cian_session.py (локально не гоняются — нет зависимостей conftest, matplotlib)
  • После деплоя — проверка в контейнере, что cian_session строит сессию с chrome146

Refs #3148

## Summary #3034 поднял impersonate-профиль до `chrome146` **внутри `scraper_kit`** и свёл его к одной константе. Три прод-пути бэкенда в тот периметр не входили и остались на `chrome120`: | Файл | Что делает | |---|---| | `app/services/cian_session.py:164` | верификация куки Циана — седьмой источник эстиматора | | `app/services/yandex_address_backfill.py:153` | бэкфилл адресов Яндекса | | `app/tasks/yandex_detail_backfill.py:303` | detail-бэкфилл Яндекса | Сторож литерала (`test_impersonate_single_source.py`) сканировал только пакет, а его докстрока объявляла остальное «отдельным периметром вне scope #3034» со ссылкой на #2361 F4a — **который к тому моменту закрыт**. То есть исключение осталось, а адресат исключения исчез. ## Почему это не косметика Разрыв в 31 мажорную версию живёт в **TLS-отпечатке** (JA3/JA4), а не в строке User-Agent — сменой прокси не лечится. Отдельно про Циан: по #2673 его оценка мертва с 29 июня, «куки протухли, ни одной новой строки 37 дней». Путь, которым проверяется живость этих куки, всё это время представлялся площадке браузером двухлетней давности. Причиной это не объявляю — но при таком отпечатке отличить «куки протухли» от «нас узнали по рукопожатию» нечем. ## Тест закреплял ровно тот дефект, ради которого заводился #3034 `test_cian_session.py:488` прибивал `chrome120` гвоздём: подъём профиля в kit ронял бы этот тест, а «починкой» выглядел бы возврат к устаревшему профилю. Теперь тест сверяется с `DEFAULT_IMPERSONATE`. ## Что ещё в диффе - **Сторож расширен на `backend/app/`** — без этого периметр возвращается молча, что уже один раз и произошло. - Намеренно НЕ входят `tests/fixtures/**` (номер профиля — часть записи о том, чем снят фикстур-HTML) и `tradein-mvp/scripts/**` (разовые инструменты вне прод-путей). Исключения теперь описаны в докстроке сторожа, а не подразумеваются. - Исторические замеры в комментариях сохранены **как замеры**: «curl_cffi с kit-профилем (на момент замера — Chrome 120)» вместо переписывания истории. ## Test plan - [x] Сканер сторожа на дереве: **ноль нарушителей** (`scraper_kit` + `backend/app`) - [x] Детектор краснеет на подсаженном литерале - [x] Все изменённые модули компилируются (`py_compile`) - [ ] CI: `test_impersonate_single_source.py` + `test_cian_session.py` (локально не гоняются — нет зависимостей conftest, `matplotlib`) - [ ] После деплоя — проверка в контейнере, что `cian_session` строит сессию с `chrome146` Refs #3148
bot-backend added 1 commit 2026-08-27 15:18:40 +00:00
fix(tradein/scrapers): три прод-пути остались на chrome120, пока kit ушёл на chrome146
Some checks failed
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 10s
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 / backend-tests (pull_request) Failing after 1m3s
cf3d4850e2
#3034 свёл impersonate к единственной константе внутри scraper_kit и поднял
профиль до chrome146. Сторож литерала сканирует только пакет, а его докстрока
объявила остальное «отдельным периметром вне scope», сославшись на #2361 F4a.
Периметр не спящий — он ходит в сеть каждый день, а #2361 к тому моменту был
закрыт, то есть отсылка вела в никуда.

На chrome120 оставались:

  app/services/cian_session.py:164        верификация куки Циана
  app/services/yandex_address_backfill.py:153   бэкфилл адресов
  app/tasks/yandex_detail_backfill.py:303       detail-бэкфилл

Разрыв в 31 мажорную версию живёт в TLS-отпечатке (JA3/JA4), а не в строке
User-Agent, поэтому сменой прокси он не лечится.

ПРО ЦИАН ОТДЕЛЬНО. По #2673 оценка Циана мертва с 29 июня — «куки протухли,
ни одной новой строки 37 дней». Путь, которым проверяется живость этих куки,
всё это время представлялся площадке браузером двухлетней давности. Причину
этим не объявляю: утверждаю, что при таком отпечатке отличить «куки протухли»
от «нас узнали по рукопожатию» нечем.

ТЕСТ ЗАКРЕПЛЯЛ ДЕФЕКТ. test_cian_session прибивал chrome120 гвоздём: подъём
профиля в kit ронял бы этот тест, а «починкой» выглядел бы возврат к
устаревшему профилю. Теперь тест сверяется с DEFAULT_IMPERSONATE.

Сторож литерала расширен на backend/app — без этого периметр возвращается
молча, что уже один раз и произошло. Намеренно НЕ входят tests/fixtures/**
(номер профиля там — часть записи о том, чем снят фикстур-HTML) и scripts/**
(разовые инструменты, в прод-путях не участвуют).

Исторические замеры в комментариях сохранены как замеры: «curl_cffi с
kit-профилем (на момент замера — Chrome 120)» вместо переписывания истории.

Проверено: сканер сторожа на дереве даёт ноль нарушителей, на подсаженном
литерале краснеет; все изменённые модули компилируются.

Refs #3148
bot-backend added 1 commit 2026-08-27 15:24:16 +00:00
style(tradein): уложить перенесённые строки в лимит 100 символов
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 10s
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 / 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 4m48s
dd3a79b475
Ruff E501 на трёх строках, которые удлинились от замены литерала на
`DEFAULT_IMPERSONATE` в докстроках. Абзацы перевёрстаны целиком, а не
разорваны по месту переполнения — рваный перенос читался бы как опечатка.

Прогон: `ruff check app tests` — All checks passed.

Refs #3148
bot-backend merged commit 37cb61da85 into main 2026-08-27 15:29:52 +00:00
bot-backend deleted branch fix/3148-backend-impersonate 2026-08-27 15:29:52 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#3149
No description provided.