From eea213549de5224872d6219cc66bfef8801d8892 Mon Sep 17 00:00:00 2001 From: AliveGh0st <1724728802@qq.com> Date: Tue, 22 Apr 2025 13:43:53 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E2=9C=A8=20feat:=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?SOCKS=E4=BB=A3=E7=90=86=E5=B9=B6=E4=BF=AE=E6=94=B9=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E7=8E=AF=E5=A2=83=E5=8F=98=E9=87=8F=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/default.py | 8 +-- astrbot/core/core_lifecycle.py | 58 +++++++++++++++++-- .../core/provider/sources/openai_source.py | 2 +- pyproject.toml | 1 + requirements.txt | 3 +- 5 files changed, 62 insertions(+), 10 deletions(-) diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index b2f4d80fd..0e6a6cdc9 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -88,7 +88,7 @@ "t2i_word_threshold": 150, "t2i_strategy": "remote", "t2i_endpoint": "", - "http_proxy": "", + "proxy": "", "dashboard": { "enable": True, "username": "astrbot", @@ -1216,10 +1216,10 @@ "items": {"type": "string"}, "hint": "管理员 ID 列表,管理员可以使用一些特权命令,如 `update`, `plugin` 等。ID 可以通过 `/sid` 指令获得。回车添加,可添加多个。", }, - "http_proxy": { - "description": "HTTP 代理", + "proxy": { + "description": "网络代理", "type": "string", - "hint": "启用后,会以添加环境变量的方式设置代理。格式为 `http://ip:port`", + "hint": "启用后,会以添加环境变量的方式设置代理。支持HTTP和SOCKS代理,格式为 `http://ip:port` 或 `socks5://ip:port`", }, "timezone": { "description": "时区", diff --git a/astrbot/core/core_lifecycle.py b/astrbot/core/core_lifecycle.py index 9dc03d4af..896c65ca3 100644 --- a/astrbot/core/core_lifecycle.py +++ b/astrbot/core/core_lifecycle.py @@ -14,6 +14,11 @@ import time import threading import os +import socket +try: + import socks # PySocks提供的SOCKS代理功能 +except ImportError: + socks = None # 如果未安装PySocks,则设为None from .event_bus import EventBus from . import astrbot_config from asyncio import Queue @@ -47,10 +52,55 @@ def __init__(self, log_broker: LogBroker, db: BaseDatabase): self.astrbot_config = astrbot_config # 初始化配置 self.db = db # 初始化数据库 - # 根据环境变量设置代理 - os.environ["https_proxy"] = self.astrbot_config["http_proxy"] - os.environ["http_proxy"] = self.astrbot_config["http_proxy"] - os.environ["no_proxy"] = "localhost" + # 根据配置设置代理 + proxy = self.astrbot_config["proxy"] + if proxy: + # 检查是否是SOCKS代理 + if proxy.startswith('socks'): + if socks is None: + logger.warning("检测到SOCKS代理配置,但未正确安装PySocks。请使用 pip install pysocks") + else: + # 使用PySocks设置SOCKS代理 + try: + proxy_parts = proxy.split('://') + if len(proxy_parts) != 2: + logger.error(f"代理URL格式错误: {proxy}") + else: + proxy_type_str, proxy_addr = proxy_parts + # 确定代理类型 + if proxy_type_str == 'socks5': + proxy_type = socks.SOCKS5 + elif proxy_type_str == 'socks4': + proxy_type = socks.SOCKS4 + else: + proxy_type = socks.SOCKS5 + logger.warning(f"未知的SOCKS类型: {proxy_type_str},默认使用SOCKS5") + + # 解析代理地址和端口 + if ':' in proxy_addr: + proxy_host, proxy_port_str = proxy_addr.split(':') + try: + proxy_port = int(proxy_port_str) + # 设置默认socket为SOCKS代理 + socks.set_default_proxy(proxy_type, proxy_host, proxy_port) + socket.socket = socks.socksocket + + # 同时设置环境变量以支持不使用PySocks的库 + os.environ["ALL_PROXY"] = proxy + except ValueError: + logger.error(f"代理端口无效: {proxy_port_str}") + else: + logger.error(f"代理地址格式错误: {proxy_addr}") + except Exception as e: + logger.error(f"设置SOCKS代理时出错: {e}") + else: + # HTTP代理设置 + os.environ["HTTP_PROXY"] = proxy + os.environ["HTTPS_PROXY"] = proxy + os.environ["http_proxy"] = proxy + os.environ["https_proxy"] = proxy + # 设置不使用代理的本地地址 + os.environ["no_proxy"] = "localhost,127.0.0.1,::1" async def initialize(self): """ diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index f4e02b5f5..dfda78db0 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -327,7 +327,7 @@ async def _handle_api_error( logger.error("疑似该模型不支持函数调用工具调用。请输入 /tool off_all") if "Connection error." in str(e): - proxy = os.environ.get("http_proxy", None) + proxy = os.environ.get("proxy", None) if proxy: logger.error( f"可能为代理原因,请检查代理是否正常。当前代理: {proxy}" diff --git a/pyproject.toml b/pyproject.toml index 615a51c0c..a08ca7d84 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,6 +38,7 @@ dependencies = [ "silk-python>=0.2.6", "telegramify-markdown>=0.5.0", "wechatpy>=1.8.18", + "pysocks>=1.7.1", # 添加PySocks依赖,用于SOCKS代理支持 ] [tool.ruff] diff --git a/requirements.txt b/requirements.txt index 2e0ab1ccc..df21ad166 100644 --- a/requirements.txt +++ b/requirements.txt @@ -30,4 +30,5 @@ mcp certifi pip telegramify-markdown -google-genai \ No newline at end of file +google-genai +pysocks \ No newline at end of file From 85f02f1fc354b41e7feb28f5df1a06768e8dc92e Mon Sep 17 00:00:00 2001 From: AliveGh0st <1724728802@qq.com> Date: Fri, 25 Apr 2025 09:41:23 +0800 Subject: [PATCH 2/8] =?UTF-8?q?feat:=20=E6=B7=BB=E5=8A=A0proxy=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E5=99=A8=E5=B7=A5=E5=85=B7=E7=B1=BB=E4=BB=A5=E6=94=AF?= =?UTF-8?q?=E6=8C=81HTTP=E5=92=8CSOCKS=E4=BB=A3=E7=90=86=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/core_lifecycle.py | 64 ++---------- astrbot/core/utils/proxy_manager.py | 149 ++++++++++++++++++++++++++++ astrbot/dashboard/server.py | 9 +- pyproject.toml | 3 +- requirements.txt | 3 +- 5 files changed, 169 insertions(+), 59 deletions(-) create mode 100644 astrbot/core/utils/proxy_manager.py diff --git a/astrbot/core/core_lifecycle.py b/astrbot/core/core_lifecycle.py index 896c65ca3..25ddcd538 100644 --- a/astrbot/core/core_lifecycle.py +++ b/astrbot/core/core_lifecycle.py @@ -14,11 +14,7 @@ import time import threading import os -import socket -try: - import socks # PySocks提供的SOCKS代理功能 -except ImportError: - socks = None # 如果未安装PySocks,则设为None +from astrbot.core.utils.proxy_manager import ProxyManager from .event_bus import EventBus from . import astrbot_config from asyncio import Queue @@ -51,56 +47,16 @@ def __init__(self, log_broker: LogBroker, db: BaseDatabase): self.log_broker = log_broker # 初始化日志代理 self.astrbot_config = astrbot_config # 初始化配置 self.db = db # 初始化数据库 - - # 根据配置设置代理 - proxy = self.astrbot_config["proxy"] - if proxy: - # 检查是否是SOCKS代理 - if proxy.startswith('socks'): - if socks is None: - logger.warning("检测到SOCKS代理配置,但未正确安装PySocks。请使用 pip install pysocks") - else: - # 使用PySocks设置SOCKS代理 - try: - proxy_parts = proxy.split('://') - if len(proxy_parts) != 2: - logger.error(f"代理URL格式错误: {proxy}") - else: - proxy_type_str, proxy_addr = proxy_parts - # 确定代理类型 - if proxy_type_str == 'socks5': - proxy_type = socks.SOCKS5 - elif proxy_type_str == 'socks4': - proxy_type = socks.SOCKS4 - else: - proxy_type = socks.SOCKS5 - logger.warning(f"未知的SOCKS类型: {proxy_type_str},默认使用SOCKS5") - - # 解析代理地址和端口 - if ':' in proxy_addr: - proxy_host, proxy_port_str = proxy_addr.split(':') - try: - proxy_port = int(proxy_port_str) - # 设置默认socket为SOCKS代理 - socks.set_default_proxy(proxy_type, proxy_host, proxy_port) - socket.socket = socks.socksocket - - # 同时设置环境变量以支持不使用PySocks的库 - os.environ["ALL_PROXY"] = proxy - except ValueError: - logger.error(f"代理端口无效: {proxy_port_str}") - else: - logger.error(f"代理地址格式错误: {proxy_addr}") - except Exception as e: - logger.error(f"设置SOCKS代理时出错: {e}") - else: - # HTTP代理设置 - os.environ["HTTP_PROXY"] = proxy - os.environ["HTTPS_PROXY"] = proxy - os.environ["http_proxy"] = proxy - os.environ["https_proxy"] = proxy + + # 初始化代理管理器 + self.proxy_manager = ProxyManager() + + # 从配置中获取代理设置并应用 + proxy_url = self.astrbot_config["proxy"] + self.proxy_manager.setup_proxy(proxy_url) + # 设置不使用代理的本地地址 - os.environ["no_proxy"] = "localhost,127.0.0.1,::1" + self.proxy_manager.setup_no_proxy_hosts() async def initialize(self): """ diff --git a/astrbot/core/utils/proxy_manager.py b/astrbot/core/utils/proxy_manager.py new file mode 100644 index 000000000..3a03ab039 --- /dev/null +++ b/astrbot/core/utils/proxy_manager.py @@ -0,0 +1,149 @@ +import os +import socket +import logging +from typing import Optional + +logger = logging.getLogger("astrbot") + +try: + import socks # PySocks提供的SOCKS代理功能 +except ImportError: + socks = None # 如果未安装PySocks,则设为None + +class ProxyManager: + """代理管理类,负责处理HTTP和SOCKS代理的设置和清除""" + + def __init__(self): + # 保存原始socket类,用于本地连接检测和恢复 + self.original_socket = socket.socket + # 记录当前代理状态 + self.current_proxy = None + self.is_socks_proxy = False + + def setup_proxy(self, proxy_url: Optional[str]) -> bool: + """ + 根据提供的代理URL设置代理 + + Args: + proxy_url: 代理URL,格式为 'http://host:port' 或 'socks5://host:port' + 如果为None或空字符串,则清除代理 + + Returns: + bool: 代理设置是否成功 + """ + # 首先清除所有现有代理设置 + self.clear_proxy() + + # 如果没有提供代理URL,直接返回True + if not proxy_url: + logger.info("未配置代理,使用直接连接") + return True + + self.current_proxy = proxy_url + + # 检查是否是SOCKS代理 + if proxy_url.startswith('socks'): + return self._setup_socks_proxy(proxy_url) + else: + return self._setup_http_proxy(proxy_url) + + def _setup_socks_proxy(self, proxy_url: str) -> bool: + """设置SOCKS代理""" + if socks is None: + logger.warning("检测到SOCKS代理配置,但未正确安装PySocks。请使用 pip install pysocks") + return False + + try: + proxy_parts = proxy_url.split('://') + if len(proxy_parts) != 2: + logger.error(f"代理URL格式错误: {proxy_url}") + return False + + proxy_type_str, proxy_addr = proxy_parts + # 确定代理类型 + if proxy_type_str == 'socks5': + proxy_type = socks.SOCKS5 + elif proxy_type_str == 'socks4': + proxy_type = socks.SOCKS4 + else: + proxy_type = socks.SOCKS5 + logger.warning(f"未知的SOCKS类型: {proxy_type_str},默认使用SOCKS5") + + # 解析代理地址和端口 + if ':' in proxy_addr: + proxy_host, proxy_port_str = proxy_addr.split(':') + try: + proxy_port = int(proxy_port_str) + # 设置默认socket为SOCKS代理 + socks.set_default_proxy(proxy_type, proxy_host, proxy_port) + socket.socket = socks.socksocket + self.is_socks_proxy = True + + # 同时设置环境变量以支持不使用PySocks的库 + os.environ["ALL_PROXY"] = proxy_url + logger.info(f"已设置SOCKS{proxy_type_str[-1]}代理: {proxy_host}:{proxy_port}") + return True + except ValueError: + logger.error(f"代理端口无效: {proxy_port_str}") + return False + else: + logger.error(f"代理地址格式错误: {proxy_addr}") + return False + except Exception as e: + logger.error(f"设置SOCKS代理时出错: {e}") + return False + + def _setup_http_proxy(self, proxy_url: str) -> bool: + """设置HTTP代理""" + try: + # HTTP代理设置 + os.environ["HTTP_PROXY"] = proxy_url + os.environ["HTTPS_PROXY"] = proxy_url + os.environ["http_proxy"] = proxy_url + os.environ["https_proxy"] = proxy_url + logger.info(f"已设置HTTP/HTTPS代理: {proxy_url}") + return True + except Exception as e: + logger.error(f"设置HTTP代理时出错: {e}") + return False + + def clear_proxy(self) -> None: + """清除所有代理设置""" + # 清除环境变量 + self._clear_proxy_env() + + # 如果之前设置了SOCKS代理,恢复原始socket + if self.is_socks_proxy: + socket.socket = self.original_socket + self.is_socks_proxy = False + logger.info("已清除SOCKS代理设置") + + self.current_proxy = None + + def _clear_proxy_env(self) -> None: + """清除所有代理相关的环境变量""" + proxy_env_vars = [ + "HTTP_PROXY", "HTTPS_PROXY", "http_proxy", "https_proxy", "ALL_PROXY" + ] + for var in proxy_env_vars: + if var in os.environ: + del os.environ[var] + + def get_current_proxy(self) -> Optional[str]: + """获取当前使用的代理URL""" + return self.current_proxy + + def is_using_proxy(self) -> bool: + """检查是否正在使用代理""" + return self.current_proxy is not None + + def setup_no_proxy_hosts(self, hosts: list = None) -> None: + """设置不使用代理的主机列表""" + if hosts is None: + hosts = ["localhost", "127.0.0.1", "::1", "0.0.0.0"] + + os.environ["no_proxy"] = ",".join(hosts) + + def get_direct_socket(self): + """返回未经代理的原始socket类,用于本地连接检测""" + return self.original_socket \ No newline at end of file diff --git a/astrbot/dashboard/server.py b/astrbot/dashboard/server.py index 5d1310807..fd1eff3cc 100644 --- a/astrbot/dashboard/server.py +++ b/astrbot/dashboard/server.py @@ -87,13 +87,16 @@ def check_port_in_use(self, port: int) -> bool: 跨平台检测端口是否被占用 """ try: - # 创建 IPv4 TCP Socket - sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # 获取未经socks代理的socket类 + direct_socket = self.core_lifecycle.proxy_manager.get_direct_socket() + + # 创建不受代理影响的原始socket + sock = direct_socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) - # 设置超时时间 sock.settimeout(2) result = sock.connect_ex(("127.0.0.1", port)) sock.close() + # result 为 0 表示端口被占用 return result == 0 except Exception as e: diff --git a/pyproject.toml b/pyproject.toml index a08ca7d84..947c59d30 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ dependencies = [ "docstring-parser>=0.16", "google-genai>=1.10.0", "googlesearch-python>=1.3.0", + "httpx[socks]>=0.28.1", "lark-oapi>=1.4.12", "lxml-html-clean>=0.4.1", "mcp>=1.5.0", @@ -38,7 +39,7 @@ dependencies = [ "silk-python>=0.2.6", "telegramify-markdown>=0.5.0", "wechatpy>=1.8.18", - "pysocks>=1.7.1", # 添加PySocks依赖,用于SOCKS代理支持 + "pysocks>=1.7.1", ] [tool.ruff] diff --git a/requirements.txt b/requirements.txt index df21ad166..5d6756eb2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -31,4 +31,5 @@ certifi pip telegramify-markdown google-genai -pysocks \ No newline at end of file +pysocks +httpx[socks] \ No newline at end of file From 63202759d1c74eb47f871f130116dcbfac91bbd8 Mon Sep 17 00:00:00 2001 From: Rising <1724728802@qq.com> Date: Fri, 25 Apr 2025 10:34:54 +0800 Subject: [PATCH 3/8] Update astrbot/core/provider/sources/openai_source.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 眼花了以为是self.astrbot_config["proxy"] Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- astrbot/core/provider/sources/openai_source.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astrbot/core/provider/sources/openai_source.py b/astrbot/core/provider/sources/openai_source.py index 023e984cd..5399fbc32 100644 --- a/astrbot/core/provider/sources/openai_source.py +++ b/astrbot/core/provider/sources/openai_source.py @@ -327,7 +327,7 @@ async def _handle_api_error( logger.error("疑似该模型不支持函数调用工具调用。请输入 /tool off_all") if "Connection error." in str(e): - proxy = os.environ.get("proxy", None) + proxy = os.environ.get("http_proxy", None) if proxy: logger.error( f"可能为代理原因,请检查代理是否正常。当前代理: {proxy}" From 31c9dce696214f3fc05f7fd22e658f5781022e14 Mon Sep 17 00:00:00 2001 From: Rising <1724728802@qq.com> Date: Fri, 25 Apr 2025 10:35:56 +0800 Subject: [PATCH 4/8] Update astrbot/core/utils/proxy_manager.py Co-authored-by: sourcery-ai[bot] <58596630+sourcery-ai[bot]@users.noreply.github.com> --- astrbot/core/utils/proxy_manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/astrbot/core/utils/proxy_manager.py b/astrbot/core/utils/proxy_manager.py index 3a03ab039..dddb0f042 100644 --- a/astrbot/core/utils/proxy_manager.py +++ b/astrbot/core/utils/proxy_manager.py @@ -42,7 +42,7 @@ def setup_proxy(self, proxy_url: Optional[str]) -> bool: self.current_proxy = proxy_url # 检查是否是SOCKS代理 - if proxy_url.startswith('socks'): + if proxy_url.lower().startswith('socks'): return self._setup_socks_proxy(proxy_url) else: return self._setup_http_proxy(proxy_url) From cf5c40618e409463261fff6eeb81df6a9adb869c Mon Sep 17 00:00:00 2001 From: AliveGh0st <1724728802@qq.com> Date: Sat, 26 Apr 2025 00:12:00 +0800 Subject: [PATCH 5/8] =?UTF-8?q?fix:=20=E7=A7=BB=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E7=9A=84logging=E5=AF=BC=E5=85=A5=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E4=BB=A3=E7=A0=81=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/utils/proxy_manager.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/astrbot/core/utils/proxy_manager.py b/astrbot/core/utils/proxy_manager.py index dddb0f042..acfe7a576 100644 --- a/astrbot/core/utils/proxy_manager.py +++ b/astrbot/core/utils/proxy_manager.py @@ -1,9 +1,7 @@ import os import socket -import logging from typing import Optional - -logger = logging.getLogger("astrbot") +from astrbot.core import logger try: import socks # PySocks提供的SOCKS代理功能 From 35722fd3f98deb3780892086a527d28840b154ee Mon Sep 17 00:00:00 2001 From: AliveGh0st <1724728802@qq.com> Date: Sun, 27 Apr 2025 08:39:53 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=F0=9F=90=9Bfix:=20=E5=85=BC=E5=AE=B9?= =?UTF-8?q?=E6=97=A7=E7=89=88=E6=9C=AC=20http=5Fproxy=20=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/core_lifecycle.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/astrbot/core/core_lifecycle.py b/astrbot/core/core_lifecycle.py index 25ddcd538..a865828a4 100644 --- a/astrbot/core/core_lifecycle.py +++ b/astrbot/core/core_lifecycle.py @@ -51,8 +51,13 @@ def __init__(self, log_broker: LogBroker, db: BaseDatabase): # 初始化代理管理器 self.proxy_manager = ProxyManager() - # 从配置中获取代理设置并应用 - proxy_url = self.astrbot_config["proxy"] + # 从配置中获取代理设置并应用,优先使用新的 proxy 字段,如果为空则尝试使用旧的 http_proxy 字段 + proxy_url = self.astrbot_config.get("proxy", "") + if not proxy_url: + # 兼容旧版本的 http_proxy 配置 + proxy_url = self.astrbot_config.get("http_proxy", "") + if proxy_url: + logger.warning(f"检测到旧版本代理配置(http_proxy),已自动兼容。建议更新配置文件,重新设置网络代理(proxy)以适应新版本。") self.proxy_manager.setup_proxy(proxy_url) # 设置不使用代理的本地地址 From df270797b8da8863d1c1acb6d5f8baa6f333e370 Mon Sep 17 00:00:00 2001 From: AliveGh0st <1724728802@qq.com> Date: Sun, 27 Apr 2025 11:52:45 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=F0=9F=90=9Bfix:=20=E4=BF=9D=E7=95=99http?= =?UTF-8?q?=5Fproxy=E9=85=8D=E7=BD=AE=E5=B9=B6=E6=B7=BB=E5=8A=A0=E5=B0=86?= =?UTF-8?q?=E4=BA=8E=E4=B8=8B=E7=89=88=E6=9C=AC=E5=BC=83=E7=94=A8=E7=9A=84?= =?UTF-8?q?=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/default.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index b37c59c3f..63406dfde 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -1234,6 +1234,12 @@ "items": {"type": "string"}, "hint": "管理员 ID 列表,管理员可以使用一些特权命令,如 `update`, `plugin` 等。ID 可以通过 `/sid` 指令获得。回车添加,可添加多个。", }, + "http_proxy": { + "description": "HTTP 代理", + "type": "string", + "obvious_hint": True, + "hint": "该配置将在下版本弃用,请配置`网络代理(proxy)`。启用后,会以添加环境变量的方式设置代理。格式为 `http://ip:port`", + }, "proxy": { "description": "网络代理", "type": "string", From 8ed937b983912cea71de16d986c9e1bfa8ab7e1c Mon Sep 17 00:00:00 2001 From: AliveGh0st <1724728802@qq.com> Date: Tue, 29 Apr 2025 17:05:11 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E2=9C=A8feat:=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=AF=B9socks=E4=BB=A3=E7=90=86=E5=9C=B0=E5=9D=80=E4=B8=AD?= =?UTF-8?q?=E5=8C=85=E5=90=AB=E8=AE=A4=E8=AF=81=E7=9A=84=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/utils/proxy_manager.py | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/astrbot/core/utils/proxy_manager.py b/astrbot/core/utils/proxy_manager.py index acfe7a576..832e14f0b 100644 --- a/astrbot/core/utils/proxy_manager.py +++ b/astrbot/core/utils/proxy_manager.py @@ -67,13 +67,32 @@ def _setup_socks_proxy(self, proxy_url: str) -> bool: proxy_type = socks.SOCKS5 logger.warning(f"未知的SOCKS类型: {proxy_type_str},默认使用SOCKS5") + # 解析用户名密码和代理地址 + username = None + password = None + if '@' in proxy_addr: + auth_info, proxy_addr = proxy_addr.split('@') + if ':' in auth_info: + username, password = auth_info.split(':', 1) + logger.debug(f"检测到代理认证信息,用户名: {username}") + else: + username = auth_info + password = None + logger.debug(f"检测到代理认证信息,仅用户名: {username}") + # 解析代理地址和端口 if ':' in proxy_addr: proxy_host, proxy_port_str = proxy_addr.split(':') try: proxy_port = int(proxy_port_str) # 设置默认socket为SOCKS代理 - socks.set_default_proxy(proxy_type, proxy_host, proxy_port) + socks.set_default_proxy( + proxy_type, + proxy_host, + proxy_port, + username=username, + password=password + ) socket.socket = socks.socksocket self.is_socks_proxy = True