From 11410358990bb83834d3261322f0f6a146f0c1a9 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 29 Aug 2026 17:07:04 +0300 Subject: [PATCH] =?UTF-8?q?chore(tradein):=20=D0=B4=D0=B2=D0=B5=20=D1=80?= =?UTF-8?q?=D1=83=D1=87=D0=BA=D0=B8=20=D1=80=D0=BE=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8,=20=D0=BA=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D1=85=20=D0=BD?= =?UTF-8?q?=D0=B5=20=D0=BE=D1=81=D1=82=D0=B0=D0=BB=D0=BE=D1=81=D1=8C=20?= =?UTF-8?q?=D1=87=D0=B8=D1=82=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9,=20?= =?UTF-8?q?=D0=B8=20=D0=B2=D1=80=D1=83=D1=89=D0=B8=D0=B9=20=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=D1=80=D0=B8=D0=B9=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20=D0=BD=D0=B8=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit proxy_rotate_attempts / proxy_rotate_attempt_timeout_s тюнили ретраи changeip-GET. Сам changeip снят в #2616 шаг 2 (аккаунт mobileproxy закрыт, ссылки нет), и с тех пор ручки живут пламбингом: Settings -> property адаптера -> поле протокола ScraperConfig -> и всё. Ни одного потребителя, только четыре теста, которые заполняют их при сборке конфига. Комментарий над ними в contracts.py оправдывал их сохранение так: «оставлены как budget-верхняя-граница для app.tasks.avito_detail_backfill wait_for» — но wait_for там берёт СОСЕДНЕЕ поле, avito_proxy_rotate_settle_s (avito_detail_backfill.py:249). То есть комментарий приписывал этим двум полям работу третьего и тем самым прикрывал их мёртвость. Соседние ручки проверены и ОСТАВЛЕНЫ, они действительно читаются: * avito/cian/yandex_proxy_max_rotations — pipeline._max_rotations; * avito_proxy_rotate_settle_s — asyncio.wait_for в avito_detail_backfill. Заодно сжат комментарий в config.py: перечисление истории changeip заменено на то, что нужно знать сейчас — кто читает оставшиеся две ручки и где живая ротация (ASOCKS_API_TOKEN / proxy_rotation, #2611). ruff clean, 4974 passed / 37 skipped. --- tradein-mvp/backend/app/core/config.py | 22 ++++++++----------- .../backend/app/services/scraper_adapters.py | 8 ------- .../backend/tests/test_2686_ban_kind_split.py | 2 -- ...t_2687_pool_exhaustion_keeps_checkpoint.py | 2 -- .../test_930_scheduler_resume_checkpoint.py | 2 -- .../tests/test_scraper_kit_pipeline_parity.py | 2 -- .../scraper-kit/src/scraper_kit/contracts.py | 6 ----- 7 files changed, 9 insertions(+), 35 deletions(-) diff --git a/tradein-mvp/backend/app/core/config.py b/tradein-mvp/backend/app/core/config.py index af4081b8..64a9022f 100644 --- a/tradein-mvp/backend/app/core/config.py +++ b/tradein-mvp/backend/app/core/config.py @@ -886,21 +886,17 @@ class Settings(BaseSettings): """ return self.scraper_proxy_url_env - # ── Ban-recovery budget knobs (changeip-механизм снят #2616 шаг 2) ──────── - # Раньше эти поля тюнили retry/settle для GET-changeip mobileproxy - # (AVITO_PROXY_ROTATE_URL и т.д., см. историю выше) — сама ссылка удалена - # (закрытый аккаунт), поэтому IP-ротация сейчас всегда no-op (_rotate_ip / - # _rotate_proxy_ip возвращают False без сетевого похода). Поля оставлены: - # `*_proxy_max_rotations` продолжают гейтить бюджет попыток в ban-rotation - # state machine (scraper_kit.orchestration.pipeline._try_rotate_within_budget) - # — те же 0 попыток "успеха", что и раньше при мёртвом changeip, просто без - # затрат на HTTP; `avito_proxy_rotate_settle_s` — верхняя граница - # asyncio.wait_for в app.tasks.avito_detail_backfill (страховка от зависания). - # Живая ротация IP — ASOCKS_API_TOKEN / app.services.proxy_rotation (#2611). + # ── Ban-recovery budget knobs (changeip снят #2616 шаг 2) ──────────────── + # Живая ротация IP — ASOCKS_API_TOKEN / app.services.proxy_rotation (#2611); + # `_rotate_ip`/`_rotate_proxy_ip` остались no-op после удаления changeip-ссылки. + # Обе ручки читаются: `*_proxy_max_rotations` гейтит бюджет попыток в + # ban-rotation (scraper_kit.orchestration.pipeline._max_rotations), + # `avito_proxy_rotate_settle_s` — верхняя граница asyncio.wait_for в + # app.tasks.avito_detail_backfill. + # #3212: proxy_rotate_attempts / proxy_rotate_attempt_timeout_s удалены — + # ретраи changeip-GET, которых больше нет; ни одного читателя не осталось. avito_proxy_max_rotations: int = 4 avito_proxy_rotate_settle_s: float = 9.0 - proxy_rotate_attempt_timeout_s: float = 8.0 - proxy_rotate_attempts: int = 3 # ── ASocks pool-proxy rotation (#2600) ─────────────────────────────────── # Bearer-токен веб-кабинета ASocks для POST .../unlimited-proxy/{portId}/refresh-ip diff --git a/tradein-mvp/backend/app/services/scraper_adapters.py b/tradein-mvp/backend/app/services/scraper_adapters.py index 837da32f..44bb627c 100644 --- a/tradein-mvp/backend/app/services/scraper_adapters.py +++ b/tradein-mvp/backend/app/services/scraper_adapters.py @@ -175,14 +175,6 @@ class RealScraperConfig: def avito_proxy_rotate_settle_s(self) -> float: return _settings.avito_proxy_rotate_settle_s - @property - def proxy_rotate_attempts(self) -> int: - return _settings.proxy_rotate_attempts - - @property - def proxy_rotate_attempt_timeout_s(self) -> float: - return _settings.proxy_rotate_attempt_timeout_s - @property def cian_proxy_max_rotations(self) -> int: return _settings.cian_proxy_max_rotations diff --git a/tradein-mvp/backend/tests/test_2686_ban_kind_split.py b/tradein-mvp/backend/tests/test_2686_ban_kind_split.py index 53492581..90c52bb9 100644 --- a/tradein-mvp/backend/tests/test_2686_ban_kind_split.py +++ b/tradein-mvp/backend/tests/test_2686_ban_kind_split.py @@ -155,8 +155,6 @@ def _config() -> SimpleNamespace: avito_proxy_max_rotations=0, avito_serp_ok_not_banned=True, avito_proxy_rotate_settle_s=0.0, - proxy_rotate_attempts=1, - proxy_rotate_attempt_timeout_s=1.0, avito_full_load_price_cap=1400, avito_full_load_max_pages=100, avito_full_load_concurrency=1, diff --git a/tradein-mvp/backend/tests/test_2687_pool_exhaustion_keeps_checkpoint.py b/tradein-mvp/backend/tests/test_2687_pool_exhaustion_keeps_checkpoint.py index 6dd54899..e6a897b1 100644 --- a/tradein-mvp/backend/tests/test_2687_pool_exhaustion_keeps_checkpoint.py +++ b/tradein-mvp/backend/tests/test_2687_pool_exhaustion_keeps_checkpoint.py @@ -99,8 +99,6 @@ def _config() -> SimpleNamespace: avito_proxy_max_rotations=0, avito_serp_ok_not_banned=True, avito_proxy_rotate_settle_s=0.0, - proxy_rotate_attempts=1, - proxy_rotate_attempt_timeout_s=1.0, cian_proxy_max_rotations=0, yandex_proxy_max_rotations=0, cian_full_load_per_fetch_timeout_s=0.0, diff --git a/tradein-mvp/backend/tests/test_930_scheduler_resume_checkpoint.py b/tradein-mvp/backend/tests/test_930_scheduler_resume_checkpoint.py index cc0ba37a..060ecd0b 100644 --- a/tradein-mvp/backend/tests/test_930_scheduler_resume_checkpoint.py +++ b/tradein-mvp/backend/tests/test_930_scheduler_resume_checkpoint.py @@ -195,8 +195,6 @@ def _serp_config() -> SimpleNamespace: avito_proxy_max_rotations=0, avito_serp_ok_not_banned=True, avito_proxy_rotate_settle_s=0.0, - proxy_rotate_attempts=1, - proxy_rotate_attempt_timeout_s=1.0, scraper_skip_seen_today=False, ) diff --git a/tradein-mvp/backend/tests/test_scraper_kit_pipeline_parity.py b/tradein-mvp/backend/tests/test_scraper_kit_pipeline_parity.py index f3091685..8d3f9154 100644 --- a/tradein-mvp/backend/tests/test_scraper_kit_pipeline_parity.py +++ b/tradein-mvp/backend/tests/test_scraper_kit_pipeline_parity.py @@ -128,8 +128,6 @@ class _Scenario: avito_proxy_max_rotations=self.avito_proxy_max_rotations, avito_serp_ok_not_banned=self.avito_serp_ok_not_banned, avito_proxy_rotate_settle_s=0.0, - proxy_rotate_attempts=1, - proxy_rotate_attempt_timeout_s=1.0, cian_proxy_max_rotations=0, yandex_proxy_max_rotations=0, scraper_skip_seen_today=False, diff --git a/tradein-mvp/packages/scraper-kit/src/scraper_kit/contracts.py b/tradein-mvp/packages/scraper-kit/src/scraper_kit/contracts.py index 16f50bea..4b127fac 100644 --- a/tradein-mvp/packages/scraper-kit/src/scraper_kit/contracts.py +++ b/tradein-mvp/packages/scraper-kit/src/scraper_kit/contracts.py @@ -157,12 +157,6 @@ class ScraperConfig(Protocol): avito_serp_ok_not_banned: bool # changeip settle-пауза (секунды) после ротации IP. avito_proxy_rotate_settle_s: float - # Ретраи changeip-GET: N попыток по proxy_rotate_attempt_timeout_s каждая (#1950). - # changeip-ссылка снята (#2616 шаг 2) — эти два поля сейчас не читаются - # ban-rotation кодом (см. avito_proxy_max_rotations выше), оставлены как - # budget-верхняя-граница для app.tasks.avito_detail_backfill wait_for. - proxy_rotate_attempts: int - proxy_rotate_attempt_timeout_s: float # Cian лимит ротаций (rotate_url снят #2616 шаг 2, см. avito_proxy_max_rotations). cian_proxy_max_rotations: int # Yandex лимит ротаций (аналогично). -- 2.45.3