From b3989c683783a697dc3625295ed5ea0c1e551d0f Mon Sep 17 00:00:00 2001 From: Yuriy Yuriev Date: Mon, 18 May 2026 18:51:00 +0700 Subject: [PATCH] fix headless --- services/browser_service.py | 143 +++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 69 deletions(-) diff --git a/services/browser_service.py b/services/browser_service.py index 581249f..21a0d8d 100644 --- a/services/browser_service.py +++ b/services/browser_service.py @@ -58,72 +58,77 @@ class BrowserService: settings.DEFAULT_MAX_READING ) - proxy = None - use_socks5 = False - - try: - # Получаем прокси - if self.proxy_manager.has_proxies(): - proxy = await self.proxy_manager.acquire_proxy(timeout=30) - - # Определяем конфигурацию - if proxy and proxy.proxy_type in [ProxyType.SOCKS5, ProxyType.SOCKS4]: - # SOCKS5 через локальный HTTP туннель - proxy_config = await self.socks5_pool.get_proxy_config(proxy) - use_socks5 = True - logger.info(f"Using SOCKS5 tunnel for: {proxy.id}") - elif proxy: - # HTTP прокси напрямую - proxy_config = proxy.proxy_config - logger.info(f"Using HTTP proxy: {proxy.id}") - else: - # Прямое соединение - proxy_config = None - logger.info("Direct connection") - - # Запускаем браузер - if proxy_config: - async with AsyncCamoufox( - headless=True, - geoip=True, - humanize=True, - exclude_addons=[DefaultAddons.UBO], - proxy=proxy_config - ) as browser: - result = await self._browse_page( - browser, url, - proxy.id if proxy else "direct", - reading_time - ) - else: - async with AsyncCamoufox( - headless=False, - geoip=False, - humanize=True, - locale="ru-RU", - exclude_addons=[DefaultAddons.UBO] - ) as browser: - result = await self._browse_page( - browser, url, "direct", reading_time - ) - - # Освобождаем - if proxy: - await self.proxy_manager.release_proxy(proxy, result.success) - if use_socks5: - await self.socks5_pool.release(proxy) - - return result - - except Exception as e: - logger.error(f"Visit error: {e}", exc_info=True) - - if proxy: - await self.proxy_manager.release_proxy(proxy, success=False) - if use_socks5: - await self.socks5_pool.release(proxy) - - return VisitResult(url=url, success=False, error=str(e)) + for attempt in range(3): + proxy = None + use_socks5 = False + + try: + # Получаем прокси + if self.proxy_manager.has_proxies(): + proxy = await self.proxy_manager.acquire_proxy(timeout=30) + + # Определяем конфигурацию + if proxy and proxy.proxy_type in [ProxyType.SOCKS5, ProxyType.SOCKS4]: + proxy_config = await self.socks5_pool.get_proxy_config(proxy) + use_socks5 = True + logger.info(f"Using SOCKS5 tunnel for: {proxy.id}") + elif proxy: + proxy_config = proxy.proxy_config + logger.info(f"Using HTTP proxy: {proxy.id}") + else: + proxy_config = None + logger.info("Direct connection") + + # Запускаем браузер + if proxy_config: + async with AsyncCamoufox( + headless=True, + geoip=True, + humanize=True, + exclude_addons=[DefaultAddons.UBO], + proxy=proxy_config + ) as browser: + result = await self._browse_page( + browser, url, + proxy.id if proxy else "direct", + reading_time + ) + else: + async with AsyncCamoufox( + headless=True, + geoip=False, + humanize=True, + locale="ru-RU", + exclude_addons=[DefaultAddons.UBO] + ) as browser: + result = await self._browse_page( + browser, url, "direct", reading_time + ) + + # Освобождаем + if proxy: + await self.proxy_manager.release_proxy(proxy, result.success) + if use_socks5: + await self.socks5_pool.release(proxy) + + return result + + except ValueError as e: + logger.warning(f"Visit attempt {attempt + 1} fingerprint error, retrying with new proxy: {e}") + if proxy: + await self.proxy_manager.release_proxy(proxy, success=False) + if use_socks5: + await self.socks5_pool.release(proxy) + + except Exception as e: + logger.error(f"Visit error: {e}", exc_info=True) + if proxy: + await self.proxy_manager.release_proxy(proxy, success=False) + if use_socks5: + await self.socks5_pool.release(proxy) + return VisitResult(url=url, success=False, error=str(e)) + + return VisitResult(url=url, success=False, error="All attempts failed (geoip fingerprint error)") async def _browse_page( self, browser, url: str, proxy_info: str, reading_time: int @@ -271,15 +276,15 @@ class BrowserService: proxy_config = None browser_kwargs = { - "headless": False, + "headless": True, "geoip": True, "humanize": True, "exclude_addons": [DefaultAddons.UBO], } - + if proxy_config: browser_kwargs["proxy"] = proxy_config - + async with AsyncCamoufox(**browser_kwargs) as browser: result = await self._browse_page( browser,