fix some
This commit is contained in:
+29
-28
@@ -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(
|
||||
|
||||
@@ -372,20 +372,29 @@ class Socks5ProxyPool:
|
||||
async def get_proxy_config(self, socks5_proxy) -> dict:
|
||||
"""Получает или создает конфигурацию HTTP прокси для SOCKS5."""
|
||||
key = socks5_proxy.id
|
||||
|
||||
|
||||
# Быстрая проверка под lock'ом
|
||||
async with self._lock:
|
||||
if key in self._proxies:
|
||||
self._last_used[key] = asyncio.get_running_loop().time()
|
||||
return self._proxies[key].proxy_config_for_browser
|
||||
|
||||
# proxy.start() — медленная операция, запускаем вне lock'а
|
||||
proxy = Socks5ToHttpProxy(
|
||||
socks5_host=socks5_proxy.ip,
|
||||
socks5_port=int(socks5_proxy.port),
|
||||
username=socks5_proxy.login,
|
||||
password=socks5_proxy.password
|
||||
)
|
||||
await proxy.start()
|
||||
|
||||
# Добавляем под lock'ом (двойная проверка — другая задача могла успеть)
|
||||
async with self._lock:
|
||||
if key not in self._proxies:
|
||||
proxy = Socks5ToHttpProxy(
|
||||
socks5_host=socks5_proxy.ip,
|
||||
socks5_port=int(socks5_proxy.port),
|
||||
username=socks5_proxy.login,
|
||||
password=socks5_proxy.password
|
||||
)
|
||||
await proxy.start()
|
||||
self._proxies[key] = proxy
|
||||
|
||||
loop = asyncio.get_running_loop()
|
||||
self._last_used[key] = loop.time()
|
||||
else:
|
||||
await proxy.stop() # уже создан другой задачей
|
||||
self._last_used[key] = asyncio.get_running_loop().time()
|
||||
return self._proxies[key].proxy_config_for_browser
|
||||
|
||||
async def release(self, socks5_proxy):
|
||||
|
||||
Reference in New Issue
Block a user