From 01361bef6d1ed291bf1012d85fbba120e6562293 Mon Sep 17 00:00:00 2001 From: Sai Asish Y Date: Sun, 26 Jul 2026 18:38:42 -0700 Subject: [PATCH 1/2] fix: serialize nested messages in OneBot v11 forward nodes Signed-off-by: Sai Asish Y --- .../adapters/onebot_v11.py | 14 ++++++- tests/test_onebot_v11.py | 40 +++++++++++++++++++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/nonebot_plugin_chatrecorder/adapters/onebot_v11.py b/nonebot_plugin_chatrecorder/adapters/onebot_v11.py index 2ab9892..7cc9aad 100644 --- a/nonebot_plugin_chatrecorder/adapters/onebot_v11.py +++ b/nonebot_plugin_chatrecorder/adapters/onebot_v11.py @@ -139,7 +139,19 @@ class Serializer(MessageSerializer[Message]): @override def serialize(cls, msg: Message) -> JsonMsg: cache_b64_msg(msg) - return super().serialize(msg) + return [ + {"type": seg.type, "data": cls._serialize_data(seg.data)} + for seg in msg + ] + + @classmethod + def _serialize_data(cls, data: dict) -> dict: + # 合并转发消息的 node 段中嵌套着 Message 对象, + # 直接存储会导致 json 序列化失败 + return { + k: cls.serialize(v) if isinstance(v, Message) else v + for k, v in data.items() + } class Deserializer(MessageDeserializer[Message]): @classmethod diff --git a/tests/test_onebot_v11.py b/tests/test_onebot_v11.py index fc3a453..b28724f 100644 --- a/tests/test_onebot_v11.py +++ b/tests/test_onebot_v11.py @@ -219,3 +219,43 @@ async def test_record_send_msg(app: App): serialize_message(bot, message), message.extract_plain_text(), ) + + +async def test_record_send_forward_msg(app: App): + """测试记录合并转发消息""" + from nonebot.adapters.onebot.v11 import MessageSegment + from nonebot_plugin_uninfo import Scene, SceneType, Session, User + + from nonebot_plugin_chatrecorder.adapters.onebot_v11 import record_send_msg + from nonebot_plugin_chatrecorder.message import serialize_message + + async with app.test_api() as ctx: + adapter = get_driver()._adapters[Adapter.get_name()] + bot = ctx.create_bot(base=Bot, adapter=adapter, self_id="11") + + group_id = 654321 + message_id = 11451466666 + message = Message( + MessageSegment.node_custom(10, "test", Message("test forward message")) + ) + await record_send_msg( + bot, + None, + "send_group_msg", + {"group_id": group_id, "message": message}, + {"message_id": message_id}, + ) + await check_record( + Session( + self_id="11", + adapter="OneBot V11", + scope="QQClient", + scene=Scene(id=str(group_id), type=SceneType.GROUP), + user=User(id="11"), + ), + None, + "message_sent", + str(message_id), + serialize_message(bot, message), + message.extract_plain_text(), + ) From a8d52d08d728cb73518b5d32bcd129d4fe4082bb Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Mon, 27 Jul 2026 01:38:52 +0000 Subject: [PATCH 2/2] style: auto fix by pre-commit hooks --- nonebot_plugin_chatrecorder/adapters/onebot_v11.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/nonebot_plugin_chatrecorder/adapters/onebot_v11.py b/nonebot_plugin_chatrecorder/adapters/onebot_v11.py index 7cc9aad..0a64eda 100644 --- a/nonebot_plugin_chatrecorder/adapters/onebot_v11.py +++ b/nonebot_plugin_chatrecorder/adapters/onebot_v11.py @@ -140,8 +140,7 @@ class Serializer(MessageSerializer[Message]): def serialize(cls, msg: Message) -> JsonMsg: cache_b64_msg(msg) return [ - {"type": seg.type, "data": cls._serialize_data(seg.data)} - for seg in msg + {"type": seg.type, "data": cls._serialize_data(seg.data)} for seg in msg ] @classmethod