From e103b1ad0666c7ca53dd801ec8a0ec28606c3acc Mon Sep 17 00:00:00 2001 From: K2Cr2O1 <2221577113@qq.com> Date: Sun, 15 Mar 2026 13:47:49 +0800 Subject: [PATCH] =?UTF-8?q?feat(discord):=20=E6=B7=BB=E5=8A=A0=E4=BB=A3?= =?UTF-8?q?=E7=90=86=E6=94=AF=E6=8C=81=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 Discord 适配器中添加代理支持,包括配置模型、配置文件及实际代理实现。当配置了代理时,通过环境变量设置 HTTP/HTTPS 代理进行连接,以支持在需要代理的环境中使用 Discord 服务。 --- adapters/discord_adapter.py | 39 ++++++++++++++++++++++++++++++++++++- config.toml | 2 ++ core/config_models.py | 2 ++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/adapters/discord_adapter.py b/adapters/discord_adapter.py index a0f90d8..455d9af 100644 --- a/adapters/discord_adapter.py +++ b/adapters/discord_adapter.py @@ -22,6 +22,7 @@ except ImportError: from core.utils.logger import ModuleLogger from .router import DiscordToOneBotConverter from core.managers.redis_manager import redis_manager +from core.config_loader import global_config class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): """ @@ -36,6 +37,13 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): intents = discord.Intents.default() intents.message_content = True + # 检查是否配置了代理 + self.proxy = None + self.proxy_type = "http" + if global_config.discord.proxy: + self.proxy = global_config.discord.proxy + self.proxy_type = global_config.discord.proxy_type or "http" + super().__init__(intents=intents) self.token = token self.logger = ModuleLogger("DiscordAdapter") @@ -131,6 +139,35 @@ class DiscordAdapter(discord.Client if DISCORD_AVAILABLE else object): try: self.logger.info("正在连接 Discord...") - await self.start(self.token) + + # 如果配置了代理,使用自定义的 ClientSession + if self.proxy: + import aiohttp + proxy_url = self.proxy + self.logger.info(f"[DiscordAdapter] 使用代理: {proxy_url} (类型: {self.proxy_type})") + + connector = aiohttp.TCPConnector() + session = aiohttp.ClientSession(connector=connector) + + # discord.py 2.0+ 使用 discord.Client 的 connector 参数 + # 但 discord.Client 不直接支持自定义 connector + # 需要使用 discord.AutoShardedClient 或修改内部实现 + # 这里我们使用 discord.Client 的 __init__ 传递 connector + # 但 discord.Client 的 __init__ 不支持 connector 参数 + # 所以我们需要使用 discord.Client 的 _create_http_client 方法 + + # 简单方案:使用环境变量设置代理 + import os + os.environ["HTTP_PROXY"] = proxy_url + os.environ["HTTPS_PROXY"] = proxy_url + + self.logger.info("[DiscordAdapter] 代理已设置,正在连接 Discord...") + await self.start(self.token) + + # 清理环境变量 + os.environ.pop("HTTP_PROXY", None) + os.environ.pop("HTTPS_PROXY", None) + else: + await self.start(self.token) except Exception as e: self.logger.error(f"Discord 连接失败: {e}") diff --git a/config.toml b/config.toml index 954c368..dc9381e 100644 --- a/config.toml +++ b/config.toml @@ -103,6 +103,8 @@ base_url = "http://101.36.126.55:3003" # 外部访问的 URL [discord] enabled = true token = "MTQ4MjQzODA1NzExNzYxODI4Nw.G9R6uR.ddxHn3pmUf7SyrrOBg_-_lc7Y62lsCitPxpdGM" +proxy = "http://127.0.0.1:7890" +proxy_type = "http" # 跨平台消息互通配置 [cross_platform] diff --git a/core/config_models.py b/core/config_models.py index c3fe950..e97978c 100644 --- a/core/config_models.py +++ b/core/config_models.py @@ -113,6 +113,8 @@ class DiscordModel(BaseModel): """ enabled: bool = False token: str = "" + proxy: Optional[str] = None + proxy_type: str = "http" class LoggingModel(BaseModel):