Merge pull request #79 from d7185540/main

修复代理问题
This commit is contained in:
Chenyme authored and GitHub committed 2025-12-25 16:03:06 +08:00
commit eb5abc8b02
3 files changed
+43 -6

No files matched your search

+12 -2
View File
@@ -65,8 +65,16 @@ class ConfigManager:
toml.dump(default, f)
def _normalize_proxy(self, proxy: str) -> str:
"""标准化代理URL(socks5:// → socks5h://)"""
if proxy and proxy.startswith("socks5://"):
"""标准化代理URL(sock5/socks5 → socks5h://)"""
if not proxy:
return proxy
proxy = proxy.strip()
if proxy.startswith("sock5h://"):
proxy = proxy.replace("sock5h://", "socks5h://", 1)
if proxy.startswith("sock5://"):
proxy = proxy.replace("sock5://", "socks5://", 1)
if proxy.startswith("socks5://"):
return proxy.replace("socks5://", "socks5h://", 1)
return proxy
@@ -90,6 +98,8 @@ class ConfigManager:
if section == "grok":
if "proxy_url" in config:
config["proxy_url"] = self._normalize_proxy(config["proxy_url"])
if "cache_proxy_url" in config:
config["cache_proxy_url"] = self._normalize_proxy(config["cache_proxy_url"])
if "cf_clearance" in config:
config["cf_clearance"] = self._normalize_cf(config["cf_clearance"])
+30 -3
View File
@@ -27,8 +27,17 @@ class ProxyPool:
proxy_pool_url: 代理池API URL,返回单个代理地址
proxy_pool_interval: 代理池刷新间隔(秒)
"""
self._static_proxy = proxy_url if proxy_url else None
self._pool_url = proxy_pool_url if proxy_pool_url else None
self._static_proxy = self._normalize_proxy(proxy_url) if proxy_url else None
pool_url = proxy_pool_url.strip() if proxy_pool_url else None
if pool_url and self._looks_like_proxy_url(pool_url):
normalized_proxy = self._normalize_proxy(pool_url)
if not self._static_proxy:
self._static_proxy = normalized_proxy
logger.warning("[ProxyPool] proxy_pool_url看起来是代理地址,已作为静态代理使用,请改用proxy_url")
else:
logger.warning("[ProxyPool] proxy_pool_url看起来是代理地址,已忽略(使用proxy_url)")
pool_url = None
self._pool_url = pool_url
self._fetch_interval = proxy_pool_interval
self._enabled = bool(self._pool_url)
@@ -84,7 +93,7 @@ class ProxyPool:
async with session.get(self._pool_url) as response:
if response.status == 200:
proxy_text = await response.text()
proxy = proxy_text.strip()
proxy = self._normalize_proxy(proxy_text.strip())
# 验证代理格式
if self._validate_proxy(proxy):
@@ -129,6 +138,24 @@ class ProxyPool:
valid_protocols = ['http://', 'https://', 'socks5://', 'socks5h://']
return any(proxy.startswith(proto) for proto in valid_protocols)
def _normalize_proxy(self, proxy: str) -> str:
"""标准化代理URL(sock5/socks5 → socks5h://)"""
if not proxy:
return proxy
proxy = proxy.strip()
if proxy.startswith("sock5h://"):
proxy = proxy.replace("sock5h://", "socks5h://", 1)
if proxy.startswith("sock5://"):
proxy = proxy.replace("sock5://", "socks5://", 1)
if proxy.startswith("socks5://"):
return proxy.replace("socks5://", "socks5h://", 1)
return proxy
def _looks_like_proxy_url(self, url: str) -> bool:
"""判断URL是否像代理地址(避免误把代理池API当代理)"""
return url.startswith(("sock5://", "sock5h://", "socks5://", "socks5h://"))
def get_current_proxy(self) -> Optional[str]:
"""获取当前使用的代理(同步方法)
+1 -1
View File
@@ -71,7 +71,7 @@ class CacheService:
retry_403_count = 0
while retry_403_count <= max_403_retries:
proxy = setting.get_proxy("cache")
proxy = await setting.get_proxy_async("cache")
proxies = {"http": proxy, "https": proxy} if proxy else {}
if proxy and outer_retry == 0 and retry_403_count == 0: