fix proxy

This commit is contained in:
Yuriy Yuriev
2026-05-22 01:22:56 +07:00
parent 2a6c1cd633
commit 2f18f4a5a1
3 changed files with 65 additions and 25 deletions
+38 -18
View File
@@ -69,13 +69,13 @@ class Proxy:
- http://ip:port:login:password
"""
line = line.strip()
# Определяем тип прокси по префиксу
proxy_type = default_type
if "://" in line:
protocol, rest = line.split("://", 1)
protocol = protocol.lower()
if protocol in ["socks5", "socks"]:
proxy_type = ProxyType.SOCKS5
elif protocol == "socks4":
@@ -84,23 +84,27 @@ class Proxy:
proxy_type = ProxyType.HTTP
elif protocol == "https":
proxy_type = ProxyType.HTTPS
line = rest
# Парсим части
# Поддержка формата login:pass@ip:port
login = password = None
if "@" in line:
creds, line = line.rsplit("@", 1)
if ":" in creds:
login, password = creds.split(":", 1)
# Парсим ip:port или ip:port:login:pass
parts = line.split(":")
if len(parts) == 2:
return cls(ip=parts[0], port=parts[1], proxy_type=proxy_type)
return cls(ip=parts[0], port=parts[1], proxy_type=proxy_type,
login=login, password=password)
elif len(parts) == 4:
return cls(
ip=parts[0],
port=parts[1],
login=parts[2],
password=parts[3],
proxy_type=proxy_type
)
return cls(ip=parts[0], port=parts[1],
login=parts[2], password=parts[3],
proxy_type=proxy_type)
return None
@@ -294,9 +298,12 @@ class ProxyManager:
continue
working = self._working_status.get(proxy.id, True)
scheme = proxy.proxy_type.value # socks5, http, etc.
creds = f"{proxy.login}:{proxy.password}@" if proxy.login else ""
new_line = f"{scheme}://{creds}{proxy.ip}:{proxy.port}"
scheme = proxy.proxy_type.value
# Формат совместимый с from_line: scheme://ip:port:login:pass
if proxy.login and proxy.password:
new_line = f"{scheme}://{proxy.ip}:{proxy.port}:{proxy.login}:{proxy.password}"
else:
new_line = f"{scheme}://{proxy.ip}:{proxy.port}"
if not working:
new_line = f"!{new_line}"
@@ -410,6 +417,19 @@ class ProxyManager:
loop = asyncio.get_running_loop()
await loop.run_in_executor(None, self._save_proxies_file)
def reload(self) -> int:
"""Перезагружает прокси из файла. Возвращает количество загруженных."""
self._proxies.clear()
self._working_status.clear()
self._in_use.clear()
self._usage_count.clear()
self._cooldown_until.clear()
self._used_ids.clear()
self._needs_detection.clear()
self._load_proxies()
logger.info(f"Proxies reloaded: {len(self._proxies)}")
return len(self._proxies)
def get_stats(self) -> dict:
"""Статистика прокси."""
loop = asyncio.get_running_loop()