From 3a8dc433ade0148145ab4fa7b7a7c42588bfe147 Mon Sep 17 00:00:00 2001 From: Eric-Terminal <121368508+Eric-Terminal@users.noreply.github.com> Date: Sun, 19 Oct 2025 14:25:37 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D(=E8=81=8A=E5=A4=A9):=20?= =?UTF-8?q?=E4=B8=BA=20message=5Fprocess=20=E5=A2=9E=E5=8A=A0=20message=5F?= =?UTF-8?q?info=20=E9=98=B2=E5=BE=A1=E6=80=A7=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit message_process 方法在收到没有 'message_info' 字段的 payload(例如来自 Napcat 的握手/心跳控制消息)时,会因 KeyError 而失败。 此更改增加了防御性检查,在处理前验证 'message_info' 的存在和类型。如果缺失,则记录并跳过该 payload,防止主处理循环崩溃。 --- src/chat/message_receive/bot.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/src/chat/message_receive/bot.py b/src/chat/message_receive/bot.py index 609585d98..fe9896445 100644 --- a/src/chat/message_receive/bot.py +++ b/src/chat/message_receive/bot.py @@ -379,19 +379,31 @@ class ChatBot: # 确保所有任务已启动 await self._ensure_started() - platform = message_data["message_info"].get("platform") + # 控制握手等消息可能缺少 message_info,这里直接跳过避免 KeyError + if not isinstance(message_data, dict): + logger.warning(f"收到无法解析的消息类型: {type(message_data)},已跳过") + return + message_info = message_data.get("message_info") + if not isinstance(message_info, dict): + logger.debug( + "收到缺少 message_info 的消息,已跳过。可用字段: %s", + ", ".join(message_data.keys()), + ) + return + + platform = message_info.get("platform") if platform == "amaidesu_default": await self.do_s4u(message_data) return - if message_data["message_info"].get("group_info") is not None: - message_data["message_info"]["group_info"]["group_id"] = str( - message_data["message_info"]["group_info"]["group_id"] + if message_info.get("group_info") is not None: + message_info["group_info"]["group_id"] = str( + message_info["group_info"]["group_id"] ) - if message_data["message_info"].get("user_info") is not None: - message_data["message_info"]["user_info"]["user_id"] = str( - message_data["message_info"]["user_info"]["user_id"] + if message_info.get("user_info") is not None: + message_info["user_info"]["user_id"] = str( + message_info["user_info"]["user_id"] ) # print(message_data) # logger.debug(str(message_data))