fix(tradein): system-curl subprocess transport for Yandex SERP over SOCKS5 #940
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#940
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "feat/yandex-curl-subprocess-transport"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема (диагностировано live на проде)
Yandex full-load (#931/#937) задеплоен, но даёт 0 листингов. Причина — НЕ код фичи и НЕ прокси:
curl --compressed -x socks5h://…bproxy.site:15555тащит полную SERP-страницу за ~17с (448 КБ gzip, 1018 карточек, «407 объявлений»).curl_cffi(HTTP-движок скрейпера) над тем же SOCKS5 коллапсирует до <1 КБ/с (67–270 КБ за 45–110с, не докачивает) — chrome120-импersonation TLS/HTTP2 не дружит с этим socks5-прокси. HTTP-вариант прокси (mproxy.site:15555) Яндекс тарпитит на уровне коннекта.Фикс
Транспорт-свитч в
yandex_realty._http_get:settings.yandex_proxy_urlначинается сsocks5:///socks5h://→ новый_curl_subprocess_get(системныйcurl -sS -L --compressed -x <proxy> -A chrome-UA -b <cookies> -w <status-marker>)._CurlResponseshim даёт.status_code/.text— callers (fetch_around,_fetch_page_html) не тронуты.-wмаркера (rfind+ срез). curl exit 28 (timeout, частичное тело) →status_code=0→ caller трактует как fail. Cookie/proxy не логируются.Деплой
Прод-env уже готов (выставлено в ходе диагностики):
YANDEX_PROXY_URL=socks5h://…bproxy.site:15555+ cookies на/app/yandex_cookies.json. После мерджа+деплояyandex-full-loadдолжен реально сохранять листинги. ⚠️ Cookies сейчас залитыdocker cp(переживают recreate, но НЕ деплойgit reset) — follow-up нужен: persistent volume-mount для cookie-файла (отдельный PR), иначе следующий деплой их сотрёт.Тесты
pytest -k "yandex": 309 passed. 3 новых теста (socks5→curl-subprocess routing,-wmarker parse/strip, http→curl_cffi). 2 существующих теста обновлены под settings-импорт в_http_get.Системный
curlв контейнере есть. Не запускалось против prod в тестах.✅ APPROVE — прагматичный subprocess-транспорт, инъекций нет, curl_cffi-путь сохранён. Мержу.
Verified (security-sensitive — subprocess)
asyncio.create_subprocess_exec(*args)(НЕ_shell) → argv идёт в execve напрямую, без shell-интерпретации.url/proxy/cookie-значения — отдельные argv-элементы → shell-метасимволы безвредны. ✓proxy.startswith(("socks5://","socks5h://"))→ subprocess; иначе legacy curl_cffi без изменений (http-proxy/no-proxy/dev). Тесты покрывают оба + http→cffi. ✓-wмаркер аппендится последним →rfindкорректно извлекает + срезает из body;ValueError→0; curl rc=28 (timeout)→status 0 (частичное tarpit-тело отбрасывается, не сохраняется). ✓_CurlResponseshim (.status_code/.text) — callers (fetch_around/_fetch_page_html) не тронуты. Cross-file = только yandex_realty. 309 passed.url+err[:200]).🟡 Advisory
ps— single-tenant контейнер, pre-existing паттерн curl+proxy, приемлемо.🟠 Операционный trap (завожу follow-up — НЕ блокер merge кода)
Автор флагнул: cookies залиты
docker cp→ НЕ переживаютgit resetdeploy → следующий деплой сотрёт/app/yandex_cookies.json→ yandex full-load снова молча вернёт 0. Код merge-safe, но нужен persistent volume-mount для cookie-файла отдельным PR. Завожу issue чтобы не потерять.Squash-merge + delete branch.