From 2a79c5cb3eb3063c4fd9ea4cee34d28c8cc4ef12 Mon Sep 17 00:00:00 2001 From: liuwei Date: Mon, 13 Apr 2026 13:04:58 +0800 Subject: [PATCH] refactor: tighten group member change filtering --- plugins/group_member_change/main.py | 75 +++++++++++++++++++++++++++-- 1 file changed, 70 insertions(+), 5 deletions(-) diff --git a/plugins/group_member_change/main.py b/plugins/group_member_change/main.py index b0c5a02..e5a18d9 100644 --- a/plugins/group_member_change/main.py +++ b/plugins/group_member_change/main.py @@ -18,6 +18,13 @@ class GroupMemberChangePlugin(MessagePluginInterface): # 功能权限常量 FEATURE_KEY = "GROUP_MEMBER_CHANGE" FEATURE_DESCRIPTION = "👥 群成员变更监控 [自动监控群成员变动并发送通知]" + SUPPORTED_TEMPLATE_TEXTS = { + '"$names$"加入了群聊', + '"$username$"邀请"$names$"加入了群聊', + '你邀请"$names$"加入了群聊', + '"$adder$"通过扫描"$from$"分享的二维码加入群聊', + '"$adder$"通过"$from$"的邀请二维码加入群聊' + } @property def name(self) -> str: @@ -61,10 +68,35 @@ class GroupMemberChangePlugin(MessagePluginInterface): def can_process(self, message: Dict[str, Any]) -> bool: """检查是否可以处理该消息""" + roomid = str(message.get("roomid", "") or "").strip() + if not roomid or not roomid.endswith("@chatroom"): + return False + + gbm: GroupBotManager = message.get("gbm") + if gbm and gbm.get_group_permission(roomid, self.feature) == PermissionStatus.DISABLED: + return False + + msg_type = message.get("type") + msg_type_value = getattr(msg_type, "value", msg_type) + if str(msg_type_value) not in {"10000", "10002"}: + return False + content = message.get("content") + if hasattr(content, "clean_content"): + content = content.clean_content + content = str(content or "").strip() if not content or " Tuple[bool, Optional[str]]: """处理接收到的消息""" @@ -82,10 +114,8 @@ class GroupMemberChangePlugin(MessagePluginInterface): if roomid and gbm.get_group_permission(roomid, self.feature) == PermissionStatus.DISABLED: return False, "没有权限" - xml_content = str(content).strip().replace("\n", "").replace("\t", "") - - root = ET.fromstring(xml_content) - if root.tag != "sysmsg": + root = self._parse_sysmsg_root(content) + if root is None: return False, "非本次需要处理消息" # 检查是否是进群消息 @@ -146,6 +176,41 @@ class GroupMemberChangePlugin(MessagePluginInterface): return True, "已发送进群欢迎语" return False, "无需执行" + def _parse_sysmsg_root(self, content: str) -> Optional[ET.Element]: + xml_content = str(content or "").strip().replace("\n", "").replace("\t", "") + if not xml_content or " bool: + if root.attrib.get("type") != "sysmsgtemplate": + return False + + sys_msg_template = root.find("sysmsgtemplate") + if sys_msg_template is None: + return False + + template = sys_msg_template.find("content_template") + if template is None: + return False + + template_type = template.attrib.get("type") + if template_type not in {"tmpl_type_profile", "tmpl_type_profilewithrevoke"}: + return False + + template_node = template.find("template") + template_text = (template_node.text or "").strip() if template_node is not None else "" + if not template_text: + return False + + return any(item in template_text for item in self.SUPPORTED_TEMPLATE_TEXTS) + @property def commands(self) -> List[str]: """插件支持的命令列表"""