From 2c29151e8507fe7e6ccc368329adf27a1a0847a7 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 29 Aug 2026 21:27:12 +0300 Subject: [PATCH] =?UTF-8?q?docs(tradein/browser):=20origin=20=D1=80=D0=B0?= =?UTF-8?q?=D0=B1=D0=BE=D1=82=D0=B0=D0=B5=D1=82=20=D1=87=D0=B5=D1=80=D0=B5?= =?UTF-8?q?=D0=B7=20=D0=BA=D1=83=D0=BA=D0=B8=20=D0=BA=D0=BE=D0=BD=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82=D0=B0,=20=D0=B0=20=D0=BD=D0=B5=20?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Referer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Оба комментария про origin обещали «органическую навигацию с реальными cookies/Referer». Referer тут не при чём: playwright'овский goto() этот заголовок не шлёт вовсе, так что органической навигацией заход на origin не был никогда. Работает он через куки контекста — пропуск QRATOR, выданный на выдаче, остаётся в контексте и годится для карточки. Различие не косметическое: из «нужен Referer» следует, что origin надо переоткрывать перед каждой карточкой, а из «нужны куки» — что достаточно одного раза. Второе и делает якорная вкладка предыдущего коммита; заодно дописано, почему при reuse_context повторный заход на выдачу не нужен. --- tradein-mvp/browser/server.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/tradein-mvp/browser/server.py b/tradein-mvp/browser/server.py index 093c5612..8fd66c4e 100644 --- a/tradein-mvp/browser/server.py +++ b/tradein-mvp/browser/server.py @@ -950,9 +950,9 @@ async def fetch_handler(request: web.Request) -> web.Response: if not url: return web.json_response({"error": "missing 'url' field"}, status=400) - # origin (опционально) — same-site якорь, на который камуфокс зайдёт ПЕРЕД url - # (органическая навигация: реальные cookies/Referer вместо холодного goto, - # зеркалит /fetch-json #1917). Явного auto-derive из url здесь НЕТ (в отличие + # origin (опционально) — same-site якорь, на который камуфокс зайдёт ПЕРЕД url, + # чтобы получить пропуск QRATOR в куки контекста (Referer тут ни при чём: goto() + # его не шлёт; зеркалит /fetch-json #1917). Явного auto-derive из url здесь НЕТ (в отличие # от fetch-json) — caller не передал → остаётся None, origin-goto не выполняется, # поведение идентично прежнему (avito/cian/yandex его никогда не передают). origin: str | None = body.get("origin") @@ -1492,10 +1492,15 @@ async def _fetch_once( параллелятся — recycle через _relaunch_browser безопасен прямо здесь. origin (опционально) — same-site якорь (например SERP), на который камуфокс - заходит ПЕРЕД целевым url: органическая навигация с реальными cookies/Referer - вместо холодного прямого захода (зеркалит _fetch_json_once, #1917 — DomClick - card-fetch, эмпирически подтверждено вживую 2026-07-04). None (дефолт) → поведение - не меняется, ровно один goto(url) как раньше (avito/cian/yandex не передают origin). + заходит ПЕРЕД целевым url, чтобы получить пропуск QRATOR в контексте (зеркалит + _fetch_json_once, #1917 — DomClick card-fetch, эмпирически подтверждено вживую + 2026-07-04). Работает это через КУКИ контекста, а не через Referer: goto() + заголовок Referer не шлёт вовсе, так что «органической навигации» тут никогда не + было — ценность ровно в прогретом контексте. Поэтому при reuse_context origin + поднимается ОДИН раз в якорной вкладке (_ensure_anchor_page), а не переоткрывается + перед каждой карточкой: контекст уже прогрет, повторный заход — трата рукопожатия. + None (дефолт) → поведение не меняется, ровно один goto(url) как раньше + (avito/cian/yandex не передают origin). cookies (опционально) — dict cookie_name→value для инъекции ДО любой навигации (обход QRATOR-блока DomClick при валидной test-аккаунт сессии, эмпирически