This commit is contained in:
Yuriy Yuriev
2026-05-21 22:51:09 +07:00
parent 26038c6027
commit e51437f08e
5 changed files with 66 additions and 42 deletions
+29 -28
View File
@@ -21,16 +21,9 @@ from services.socks5_to_http_proxy import Socks5ProxyPool
logger = logging.getLogger(__name__)
_current_proxy_ip: Optional[str] = None
def _get_real_ip() -> Optional[str]:
return _current_proxy_ip
def _set_real_ip(ip: Optional[str]) -> None:
global _current_proxy_ip
_current_proxy_ip = ip
import threading
threading.current_thread()._proxy_ip = ip
def _patch_camoufox():
@@ -63,7 +56,9 @@ def _patch_camoufox():
_orig_ip = _ci.public_ip
def _patched_ip(proxy_string: str = None) -> str:
ip = _get_real_ip()
# Вызывается из thread pool — используем thread-local атрибут
import threading
ip = getattr(threading.current_thread(), "_proxy_ip", None)
if ip:
logger.debug(f"public_ip() intercepted → returning {ip}")
return ip
@@ -140,24 +135,30 @@ class BrowserService:
proxy_locale = 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
real_ip = proxy.id.split("://")[-1].split(":")[0]
_set_real_ip(real_ip)
proxy_locale = _locale_for_ip(real_ip)
has_auth = bool(proxy.login and proxy.password)
logger.info(f"Using SOCKS5 tunnel for: {proxy.id} auth={'yes' if has_auth else 'NO'} locale={proxy_locale}")
elif proxy:
proxy_config = proxy.proxy_config
real_ip = proxy.id.split("://")[-1].split(":")[0]
_set_real_ip(real_ip)
proxy_locale = _locale_for_ip(real_ip)
logger.info(f"Using HTTP proxy: {proxy.id} locale={proxy_locale}")
else:
proxy_config = None
_set_real_ip(None)
logger.info("Direct connection")
try:
if proxy and proxy.proxy_type in [ProxyType.SOCKS5, ProxyType.SOCKS4]:
proxy_config = await self.socks5_pool.get_proxy_config(proxy)
use_socks5 = True
real_ip = proxy.id.split("://")[-1].split(":")[0]
_set_real_ip(real_ip)
proxy_locale = _locale_for_ip(real_ip)
has_auth = bool(proxy.login and proxy.password)
logger.info(f"Using SOCKS5 tunnel for: {proxy.id} auth={'yes' if has_auth else 'NO'} locale={proxy_locale}")
elif proxy:
proxy_config = proxy.proxy_config
real_ip = proxy.id.split("://")[-1].split(":")[0]
_set_real_ip(real_ip)
proxy_locale = _locale_for_ip(real_ip)
logger.info(f"Using HTTP proxy: {proxy.id} locale={proxy_locale}")
else:
proxy_config = None
_set_real_ip(None)
logger.info("Direct connection")
except asyncio.CancelledError:
# Гарантируем освобождение прокси даже при отмене задачи
if proxy:
await self.proxy_manager.release_proxy(proxy, success=False)
raise
if proxy_config:
camoufox_kwargs = dict(