fix proxy
This commit is contained in:
+38
-18
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user