From fe93743ff75aa178eb044a6d77b8c55c8b9d8bfc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=83=AD=E9=B9=8F?= Date: Sat, 18 Oct 2025 15:42:34 +0800 Subject: [PATCH 1/2] =?UTF-8?q?QQ=E5=AE=98=E6=96=B9=E6=9C=BA=E5=99=A8?= =?UTF-8?q?=E4=BA=BA=E5=A2=9E=E5=8A=A0=E6=B2=99=E7=AE=B1=E6=A8=A1=E5=BC=8F?= =?UTF-8?q?=E9=80=89=E9=A1=B9,=E8=AE=A9=E6=9C=AC=E5=9C=B0=E9=83=A8?= =?UTF-8?q?=E7=BD=B2=E8=83=BD=E8=B7=B3=E8=BF=87IP=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- astrbot/core/config/default.py | 1 + .../qqofficial_webhook/qo_webhook_server.py | 15 +++++---------- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/astrbot/core/config/default.py b/astrbot/core/config/default.py index b160b3008..a4743ba9e 100644 --- a/astrbot/core/config/default.py +++ b/astrbot/core/config/default.py @@ -162,6 +162,7 @@ "enable": False, "appid": "", "secret": "", + "is_sandbox": False, "callback_server_host": "0.0.0.0", "port": 6196, }, diff --git a/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py b/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py index bc1e4b170..4d38b639d 100644 --- a/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py +++ b/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py @@ -15,19 +15,18 @@ def __init__(self, config: dict, event_queue: asyncio.Queue, botpy_client: Clien self.appid = config["appid"] self.secret = config["secret"] self.port = config.get("port", 6196) + self.is_sandbox = config.get("is_sandbox", False) self.callback_server_host = config.get("callback_server_host", "0.0.0.0") if isinstance(self.port, str): self.port = int(self.port) - self.http: BotHttp = BotHttp(timeout=300) + self.http: BotHttp = BotHttp(timeout=300, is_sandbox=self.is_sandbox) self.api: BotAPI = BotAPI(http=self.http) self.token = Token(self.appid, self.secret) self.server = quart.Quart(__name__) - self.server.add_url_rule( - "/astrbot-qo-webhook/callback", view_func=self.callback, methods=["POST"] - ) + self.server.add_url_rule("/astrbot-qo-webhook/callback", view_func=self.callback, methods=["POST"]) self.client = botpy_client self.event_queue = event_queue self.shutdown_event = asyncio.Event() @@ -60,9 +59,7 @@ async def repeat_seed(self, bot_secret: str, target_size: int = 32) -> bytes: async def webhook_validation(self, validation_payload: dict): seed = await self.repeat_seed(self.secret) private_key = ed25519.Ed25519PrivateKey.from_private_bytes(seed) - msg = validation_payload.get("event_ts", "") + validation_payload.get( - "plain_token", "" - ) + msg = validation_payload.get("event_ts", "") + validation_payload.get("plain_token", "") # sign signature = private_key.sign(msg.encode()).hex() response = { @@ -97,9 +94,7 @@ async def callback(self): return {"opcode": 12} async def start_polling(self): - logger.info( - f"将在 {self.callback_server_host}:{self.port} 端口启动 QQ 官方机器人 webhook 适配器。" - ) + logger.info(f"将在 {self.callback_server_host}:{self.port} 端口启动 QQ 官方机器人 webhook 适配器。") await self.server.run_task( host=self.callback_server_host, port=self.port, From c5dcbc74c2b11e81c05f374a3e868bafd0e045e7 Mon Sep 17 00:00:00 2001 From: Soulter <905617992@qq.com> Date: Sun, 19 Oct 2025 20:07:42 +0800 Subject: [PATCH 2/2] chore: ruff format --- .../sources/qqofficial_webhook/qo_webhook_server.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py b/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py index 4d38b639d..4a2eae747 100644 --- a/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py +++ b/astrbot/core/platform/sources/qqofficial_webhook/qo_webhook_server.py @@ -26,7 +26,9 @@ def __init__(self, config: dict, event_queue: asyncio.Queue, botpy_client: Clien self.token = Token(self.appid, self.secret) self.server = quart.Quart(__name__) - self.server.add_url_rule("/astrbot-qo-webhook/callback", view_func=self.callback, methods=["POST"]) + self.server.add_url_rule( + "/astrbot-qo-webhook/callback", view_func=self.callback, methods=["POST"] + ) self.client = botpy_client self.event_queue = event_queue self.shutdown_event = asyncio.Event() @@ -59,7 +61,9 @@ async def repeat_seed(self, bot_secret: str, target_size: int = 32) -> bytes: async def webhook_validation(self, validation_payload: dict): seed = await self.repeat_seed(self.secret) private_key = ed25519.Ed25519PrivateKey.from_private_bytes(seed) - msg = validation_payload.get("event_ts", "") + validation_payload.get("plain_token", "") + msg = validation_payload.get("event_ts", "") + validation_payload.get( + "plain_token", "" + ) # sign signature = private_key.sign(msg.encode()).hex() response = { @@ -94,7 +98,9 @@ async def callback(self): return {"opcode": 12} async def start_polling(self): - logger.info(f"将在 {self.callback_server_host}:{self.port} 端口启动 QQ 官方机器人 webhook 适配器。") + logger.info( + f"将在 {self.callback_server_host}:{self.port} 端口启动 QQ 官方机器人 webhook 适配器。" + ) await self.server.run_task( host=self.callback_server_host, port=self.port,