From 6fe94f7ed9d50c00f9e3442e25e1b955c6015774 Mon Sep 17 00:00:00 2001 From: Yuriy Yuriev Date: Mon, 18 May 2026 22:21:08 +0700 Subject: [PATCH] fix ip --- services/browser_service.py | 45 +++++++++++++++++++------------------ 1 file changed, 23 insertions(+), 22 deletions(-) diff --git a/services/browser_service.py b/services/browser_service.py index 282efc8..564bec3 100644 --- a/services/browser_service.py +++ b/services/browser_service.py @@ -20,11 +20,10 @@ from services.socks5_to_http_proxy import Socks5ProxyPool logger = logging.getLogger(__name__) -def _get_proxy_locale(proxy_config: dict) -> str: - """Возвращает locale без script-тега для IP прокси (ru-Cyrl-RU → ru-RU).""" +def _get_proxy_locale_by_ip(ip: str) -> str: + """Возвращает locale без script-тега для реального IP прокси (ru-Cyrl-RU → ru-RU).""" try: from camoufox.utils import get_geolocation - ip = proxy_config.get("server", "").replace("http://", "").split(":")[0] geo = get_geolocation(ip) lang = geo.locale.language region = geo.locale.region @@ -80,9 +79,12 @@ class BrowserService: if self.proxy_manager.has_proxies(): proxy = await self.proxy_manager.acquire_proxy(timeout=30) + real_proxy_ip = None if proxy and proxy.proxy_type in [ProxyType.SOCKS5, ProxyType.SOCKS4]: proxy_config = await self.socks5_pool.get_proxy_config(proxy) use_socks5 = True + # Извлекаем реальный IP прокси до туннелирования + real_proxy_ip = proxy.id.split("://")[-1].split(":")[0] logger.info(f"Using SOCKS5 tunnel for: {proxy.id}") elif proxy: proxy_config = proxy.proxy_config @@ -92,32 +94,31 @@ class BrowserService: logger.info("Direct connection") if proxy_config: - # Пробуем с geoip без ограничения OS — browserforge сам выберет совместимую + # Для SOCKS5 camoufox видит 127.0.0.1 вместо реального IP — + # делаем geoip lookup сами по реальному IP и передаём locale явно + locale = _get_proxy_locale_by_ip(real_proxy_ip) if real_proxy_ip else None + kwargs = dict( + headless=True, + geoip=True, + humanize=True, + exclude_addons=[DefaultAddons.UBO], + proxy=proxy_config, + ) + if locale: + kwargs["locale"] = locale + try: - async with AsyncCamoufox( - headless=True, - geoip=True, - humanize=True, - exclude_addons=[DefaultAddons.UBO], - proxy=proxy_config - ) as browser: + async with AsyncCamoufox(**kwargs) as browser: result = await self._browse_page( browser, url, proxy.id if proxy else "direct", reading_time ) except ValueError: - # Если geoip не может подобрать комбинацию — явно задаём locale без script-тега - geo = _get_proxy_locale(proxy_config) - logger.warning(f"geoip fingerprint failed, retrying with explicit locale: {geo}") - async with AsyncCamoufox( - headless=True, - geoip=True, - humanize=True, - locale=geo, - exclude_addons=[DefaultAddons.UBO], - proxy=proxy_config - ) as browser: + # Финальный fallback — locale en-US гарантированно есть в базе + logger.warning("geoip fingerprint failed, retrying with en-US locale") + kwargs["locale"] = "en-US" + async with AsyncCamoufox(**kwargs) as browser: result = await self._browse_page( browser, url, proxy.id if proxy else "direct",