From 849ffb06dcb2759d922e00ce3e765303cd6cadf5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E6=A2=93=E6=9F=92?= <1787882683@qq.com> Date: Fri, 19 Dec 2025 16:51:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=9B=B4=E6=96=B0=20WebUI=20=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=E5=99=A8=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?=20IPv4=20=E5=92=8C=20IPv6=20=E5=9C=B0=E5=9D=80=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/webui/webui_server.py | 34 +++++++++++++++++++++++++------ template/bot_config_template.toml | 3 +++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/webui/webui_server.py b/src/webui/webui_server.py index bf6b404d..6e6bff0e 100644 --- a/src/webui/webui_server.py +++ b/src/webui/webui_server.py @@ -201,9 +201,21 @@ class WebUIServer: self._server = UvicornServer(config=config) logger.info("🌐 WebUI 服务器启动中...") - logger.info(f"🌐 访问地址: http://{self.host}:{self.port}") - if self.host == "0.0.0.0": - logger.info(f"本机访问请使用 http://localhost:{self.port}") + + # 根据地址类型显示正确的访问地址 + if ':' in self.host: + # IPv6 地址需要用方括号包裹 + logger.info(f"🌐 访问地址: http://[{self.host}]:{self.port}") + if self.host == "::": + logger.info(f"💡 IPv6 本机访问: http://[::1]:{self.port}") + logger.info(f"💡 IPv4 本机访问: http://127.0.0.1:{self.port}") + elif self.host == "::1": + logger.info(f"💡 仅支持 IPv6 本地访问") + else: + # IPv4 地址 + logger.info(f"🌐 访问地址: http://{self.host}:{self.port}") + if self.host == "0.0.0.0": + logger.info(f"💡 本机访问: http://localhost:{self.port} 或 http://127.0.0.1:{self.port}") try: await self._server.serve() @@ -221,14 +233,24 @@ class WebUIServer: raise def _check_port_available(self) -> bool: - """检查端口是否可用""" + """检查端口是否可用(支持 IPv4 和 IPv6)""" import socket + # 判断使用 IPv4 还是 IPv6 + if ':' in self.host: + # IPv6 地址 + family = socket.AF_INET6 + test_host = self.host if self.host != "::" else "::1" + else: + # IPv4 地址 + family = socket.AF_INET + test_host = self.host if self.host != "0.0.0.0" else "127.0.0.1" + try: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + with socket.socket(family, socket.SOCK_STREAM) as s: s.settimeout(1) # 尝试绑定端口 - s.bind((self.host if self.host != "0.0.0.0" else "127.0.0.1", self.port)) + s.bind((test_host, self.port)) return True except OSError: return False diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 50a44071..f8e3c889 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -262,6 +262,9 @@ enable = true enabled = true # 是否启用WebUI mode = "production" # 模式: development(开发) 或 production(生产) host = "127.0.0.1" # WebUI 服务器监听地址 + # IPv4: 0.0.0.0 (所有IPv4接口) / 127.0.0.1 (仅本地) + # IPv6: :: (所有接口,支持IPv4+IPv6双栈) / ::1 (仅本地IPv6) + # 推荐使用 :: 实现双栈支持 port = 8001 # WebUI 服务器端口 # 防爬虫配置