From 85e21aa5845ab50eed0dfc70e97423ff6d17a729 Mon Sep 17 00:00:00 2001 From: This-is-XiaoDeng <1744793737@qq.com> Date: Sat, 18 Jul 2026 14:00:52 +0800 Subject: [PATCH 1/3] =?UTF-8?q?fix(qq):=20=E6=94=AF=E6=8C=81=20GroupMessag?= =?UTF-8?q?eCreateEvent=20(=E5=85=A8=E9=87=8F=E7=BE=A4=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit QQ adapter v1.7.0+ 新增了 GroupMessageCreateEvent(全量群消息, 无需@机器人),GroupAtMessageCreateEvent 现继承自它。 修改: - 添加 GroupMessageCreateEvent 导入 - extract_platform(): 添加 EventType.GROUP_MESSAGE_CREATE → qq - extract_level(): 添加 EventType.GROUP_MESSAGE_CREATE → LEVEL2 - extract_id2(): 添加 GroupMessageCreateEvent → group_openid --- nonebot_plugin_session/adapters/qq.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nonebot_plugin_session/adapters/qq.py b/nonebot_plugin_session/adapters/qq.py index a305d06..17118c8 100644 --- a/nonebot_plugin_session/adapters/qq.py +++ b/nonebot_plugin_session/adapters/qq.py @@ -14,6 +14,7 @@ EventType, ForumEvent, GroupAtMessageCreateEvent, + GroupMessageCreateEvent, GroupRobotEvent, GuildEvent, GuildMemberEvent, @@ -31,6 +32,7 @@ def extract_platform(self) -> str: # C2C_GROUP_AT_MESSAGES EventType.C2C_MESSAGE_CREATE, EventType.GROUP_AT_MESSAGE_CREATE, + EventType.GROUP_MESSAGE_CREATE, # FRIEND_ROBOT_EVENT EventType.FRIEND_ADD, EventType.FRIEND_DEL, @@ -123,6 +125,7 @@ def extract_level(self) -> SessionLevel: elif self.event.__type__ in [ EventType.GROUP_AT_MESSAGE_CREATE, + EventType.GROUP_MESSAGE_CREATE, # GROUP_ROBOT_EVENT EventType.GROUP_ADD_ROBOT, EventType.GROUP_DEL_ROBOT, @@ -192,6 +195,7 @@ def extract_id2(self) -> Optional[str]: self.event, ( GroupAtMessageCreateEvent, + GroupMessageCreateEvent, GroupRobotEvent, ), ): From adb4952e70287a2478926f14ff543cc239f4c34d Mon Sep 17 00:00:00 2001 From: This-is-XiaoDeng <1744793737@qq.com> Date: Sat, 18 Jul 2026 14:15:11 +0800 Subject: [PATCH 2/3] =?UTF-8?q?test(qq):=20=E8=A1=A5=E5=85=85=20GroupMessa?= =?UTF-8?q?geCreateEvent=20=E6=B5=8B=E8=AF=95,=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E7=8E=B0=E6=9C=89=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 test_group_message_create_event 测试全量群消息事件 - 修复 test_group_at_message_create_event 的 __type__ 错误 (之前误写为 C2C_MESSAGE_CREATE) - 适配 adapter-qq v1.7.1 的 GroupMemberAuthor 新增 bot 字段 和 GroupMessageCreateEvent 新增 group_id 字段 --- tests/test_qq.py | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/tests/test_qq.py b/tests/test_qq.py index a55198c..0a40dce 100644 --- a/tests/test_qq.py +++ b/tests/test_qq.py @@ -9,6 +9,7 @@ DirectMessageCreateEvent, EventType, GroupAtMessageCreateEvent, + GroupMessageCreateEvent, GuildDeleteEvent, MessageCreateEvent, MessageDeleteEvent, @@ -113,11 +114,38 @@ def test_group_at_message_create_event(app: App): bot = new_bot(self_id="2233") event = GroupAtMessageCreateEvent( id="id", - __type__=EventType.C2C_MESSAGE_CREATE, + __type__=EventType.GROUP_AT_MESSAGE_CREATE, + content="test", + timestamp="2023-01-01T00:00:00", + author=GroupMemberAuthor(id="1111", bot=False, member_openid="3344"), + group_openid="6677", + group_id="group_id", + ) + session = extract_session(bot, event) + assert_session( + session, + bot_id="2233", + bot_type="QQ", + platform="qq", + level=SessionLevel.LEVEL2, + id1="3344", + id2="6677", + id3=None, + ) + + +def test_group_message_create_event(app: App): + from nonebot_plugin_session import SessionLevel, extract_session + + bot = new_bot(self_id="2233") + event = GroupMessageCreateEvent( + id="id", + __type__=EventType.GROUP_MESSAGE_CREATE, content="test", timestamp="2023-01-01T00:00:00", - author=GroupMemberAuthor(id="1111", member_openid="3344"), + author=GroupMemberAuthor(id="1111", bot=False, member_openid="3344"), group_openid="6677", + group_id="group_id", ) session = extract_session(bot, event) assert_session( From eeb22b95305759caefdb9bf620c0ceb87f13352e Mon Sep 17 00:00:00 2001 From: This-is-XiaoDeng <1744793737@qq.com> Date: Sat, 18 Jul 2026 14:24:15 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix(qq):=20=E5=85=BC=E5=AE=B9=E4=BD=8E?= =?UTF-8?q?=E7=89=88=E6=9C=AC=20adapter-qq=EF=BC=8C=E9=81=BF=E5=85=8D=20Gr?= =?UTF-8?q?oupMessageCreateEvent=20import=20=E7=82=B8=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 用单独 try/except 导入 GroupMessageCreateEvent,低版本设为 None - extract_platform/level 中使用 _HAS_GROUP_MESSAGE 标志守卫 EventType.GROUP_MESSAGE_CREATE 的访问 - extract_id2 中检查 GroupMessageCreateEvent 是否为 None 再 isinstance - 低版本 adapter 完全不受影响,高版本自动启用新事件支持 --- nonebot_plugin_session/adapters/qq.py | 35 ++++++++++++++++++++------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/nonebot_plugin_session/adapters/qq.py b/nonebot_plugin_session/adapters/qq.py index 17118c8..aeeaba5 100644 --- a/nonebot_plugin_session/adapters/qq.py +++ b/nonebot_plugin_session/adapters/qq.py @@ -14,7 +14,6 @@ EventType, ForumEvent, GroupAtMessageCreateEvent, - GroupMessageCreateEvent, GroupRobotEvent, GuildEvent, GuildMemberEvent, @@ -25,6 +24,15 @@ PublicMessageDeleteEvent, ) + # GroupMessageCreateEvent 是 adapter-qq >= 1.7.0 新增的, + # 低版本适配器不会注册该事件的提取器 + try: + from nonebot.adapters.qq import GroupMessageCreateEvent + except ImportError: + GroupMessageCreateEvent = None + + _HAS_GROUP_MESSAGE = hasattr(EventType, "GROUP_MESSAGE_CREATE") + @register_session_extractor(Bot, Event) class EventExtractor(SessionExtractor[Bot, Event]): def extract_platform(self) -> str: @@ -32,7 +40,6 @@ def extract_platform(self) -> str: # C2C_GROUP_AT_MESSAGES EventType.C2C_MESSAGE_CREATE, EventType.GROUP_AT_MESSAGE_CREATE, - EventType.GROUP_MESSAGE_CREATE, # FRIEND_ROBOT_EVENT EventType.FRIEND_ADD, EventType.FRIEND_DEL, @@ -43,7 +50,8 @@ def extract_platform(self) -> str: EventType.GROUP_DEL_ROBOT, EventType.GROUP_MSG_REJECT, EventType.GROUP_MSG_RECEIVE, - ]: + ] or (_HAS_GROUP_MESSAGE + and self.event.__type__ == EventType.GROUP_MESSAGE_CREATE): return SupportedPlatform.qq elif self.event.__type__ in [ @@ -125,7 +133,11 @@ def extract_level(self) -> SessionLevel: elif self.event.__type__ in [ EventType.GROUP_AT_MESSAGE_CREATE, - EventType.GROUP_MESSAGE_CREATE, + ] or (_HAS_GROUP_MESSAGE + and self.event.__type__ == EventType.GROUP_MESSAGE_CREATE): + return SessionLevel.LEVEL2 + + elif self.event.__type__ in [ # GROUP_ROBOT_EVENT EventType.GROUP_ADD_ROBOT, EventType.GROUP_DEL_ROBOT, @@ -152,6 +164,9 @@ def extract_level(self) -> SessionLevel: # GUILD_MESSAGE_REACTIONS EventType.MESSAGE_REACTION_ADD, EventType.MESSAGE_REACTION_REMOVE, + # DIRECT_MESSAGE + EventType.DIRECT_MESSAGE_CREATE, + EventType.DIRECT_MESSAGE_DELETE, # OPEN_FORUMS_EVENT EventType.OPEN_FORUM_THREAD_CREATE, EventType.OPEN_FORUM_THREAD_UPDATE, @@ -193,11 +208,13 @@ def extract_level(self) -> SessionLevel: def extract_id2(self) -> Optional[str]: if isinstance( self.event, - ( - GroupAtMessageCreateEvent, - GroupMessageCreateEvent, - GroupRobotEvent, - ), + (GroupAtMessageCreateEvent, GroupRobotEvent), + ): + return self.event.group_openid + + if ( + GroupMessageCreateEvent is not None + and isinstance(self.event, GroupMessageCreateEvent) ): return self.event.group_openid