From b61123d7a626ad7f8751c993908c58b5bc0518e5 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 22 Aug 2026 00:11:59 +0300 Subject: [PATCH] =?UTF-8?q?fix(tradein/avito):=20detail=5Fbackfill=20?= =?UTF-8?q?=D1=85=D0=BE=D0=B4=D0=B8=D0=BB=20curl'=D0=BE=D0=BC,=20=D0=BA?= =?UTF-8?q?=D0=BE=D1=82=D0=BE=D1=80=D1=8B=D0=B9=20=D0=BD=D0=B5=20=D1=80?= =?UTF-8?q?=D0=B5=D1=88=D0=B0=D0=B5=D1=82=20PoW-=D1=87=D0=B5=D0=BB=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B4=D0=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Замер на проде 2026-08-21: Авито за QRATOR отдаёт JavaScript proof-of-work челлендж (startPow → кука pow_solved → self-reload через window.location). curl_cffi не исполняет JS и пройти его не может в принципе. Что это давало в цифрах (counters прогонов avito_detail_backfill): run 4508: enriched 3 / attempted 46 run 4394: enriched 2 / attempted 47 run 4348: enriched 4 / attempted 53 ~6% успеха. Браузерный путь на том же проде — ~74% (17/23 в инлайн-обогащении свипа, 2/3 в точечной проверке после #3048). То есть задание работало почти вхолостую, а поля дома, которые чинил #3048, до карточек просто не доходили. Исходное обоснование AVITO_DETAIL_BACKFILL_USE_CURL=true (browser открывает десятки коннектов и превышает cap прокси-аккаунта auv) больше не действует: браузер сериализован BROWSER_CONCURRENCY=1 и ходит через тот же backconnect SCRAPER_PROXY_URL, что и curl-путь. Переключение сделано в docker-compose.prod.yml (environment перекрывает env_file), а не правкой рантайм-env на хосте — чтобы изменение осталось в репозитории и пережило deploy без дрейфа конфигурации. Дефолт в config.py оставлен True: другие окружения не трогаем вслепую, но устаревшее обоснование там помечено. --- tradein-mvp/backend/app/core/config.py | 9 +++++++++ tradein-mvp/docker-compose.prod.yml | 12 ++++++++++++ 2 files changed, 21 insertions(+) diff --git a/tradein-mvp/backend/app/core/config.py b/tradein-mvp/backend/app/core/config.py index 42067d74..2c035f89 100644 --- a/tradein-mvp/backend/app/core/config.py +++ b/tradein-mvp/backend/app/core/config.py @@ -964,6 +964,15 @@ class Settings(BaseSettings): # True (дефолт) = curl_cffi через settings.scraper_proxy_url (backconnect mproxy). # False = старое browser-поведение (BrowserFetcher/auv, как scraper_fetch_mode). # ENV: AVITO_DETAIL_BACKFILL_USE_CURL. + # + # ⚠️ Обоснование выше УСТАРЕЛО для Авито (замер 2026-08-21). Авито за QRATOR + # отдаёт JS proof-of-work челлендж, который curl_cffi не решает: прогоны + # 4348/4394/4508 — 3-4 обогащённых из 46-53 попыток (~6%) против ~74% на + # браузерном пути. Опасение «browser превышает cap прокси-аккаунта auv» снято: + # браузер сериализован BROWSER_CONCURRENCY=1 и ходит через тот же backconnect. + # Прод переведён на браузер через docker-compose.prod.yml (environment + # перекрывает env_file). Дефолт оставлен True, чтобы не менять поведение + # других окружений вслепую. avito_detail_backfill_use_curl: bool = Field( default=True, validation_alias="AVITO_DETAIL_BACKFILL_USE_CURL" ) diff --git a/tradein-mvp/docker-compose.prod.yml b/tradein-mvp/docker-compose.prod.yml index 2f9914bd..a2fb8211 100644 --- a/tradein-mvp/docker-compose.prod.yml +++ b/tradein-mvp/docker-compose.prod.yml @@ -336,6 +336,18 @@ services: USE_KIT_SCHEDULER: "true" USE_PROXY_POOL_CURL: "true" USE_PROXY_POOL_BROWSER: "true" + # Транспорт detail_backfill: браузер, НЕ curl (замер 2026-08-21). + # Авито за QRATOR отдаёт JavaScript proof-of-work челлендж (startPow → + # кука pow_solved → self-reload). curl_cffi его не решает в принципе: + # прогоны 4348/4394/4508 дали 3-4 обогащённых из 46-53 попыток (~6%). + # Браузерный путь (camoufox + ожидание челленджа, #3045/#3046) на том же + # проде даёт ~74% (17/23 в свипе, 2/3 в точечной проверке). + # Исходное обоснование use_curl=True (browser открывает десятки коннектов + # и превышает cap прокси-аккаунта auv) больше не действует: браузер + # сериализован BROWSER_CONCURRENCY=1 и ходит через тот же backconnect + # SCRAPER_PROXY_URL, что и curl-путь. + # environment: перекрывает env_file — значение из runtime-env игнорируется. + AVITO_DETAIL_BACKFILL_USE_CURL: "false" depends_on: postgres: condition: service_healthy