diff --git a/gewechat/call_back_message/message.py b/gewechat/call_back_message/message.py index 684bbb1..f247fed 100644 --- a/gewechat/call_back_message/message.py +++ b/gewechat/call_back_message/message.py @@ -60,29 +60,28 @@ class MessageContent: def __post_init__(self): """处理XML内容和清理发信人信息""" - # 处理XML内容 # 清理发信人信息 self.clean_content = self.clean_sender_info(self.raw_content) - if self.clean_content.startswith(' str: """清理内容中的发信人信息""" if not content: return "" - import re # 如果有发信人信息,优先使用发信人信息进行清理 if self.sender: # 尝试移除发信人前缀(包括昵称和wxid两种情况) patterns = [ - f"^{self.sender}[::]\\s*\\n", # wxid格式 - f"^[^\\n]+?\\({self.sender}\\)[::]\\s*\\n", # 昵称(wxid)格式 - f"^[^\\n]+?<{self.sender}>[::]\\s*\\n", # 昵称格式 + f"^{re.escape(self.sender)}[::]\\s*\\n", # wxid格式 + f"^[^\\n]+?\\({re.escape(self.sender)}\\)[::]\\s*\\n", # 昵称(wxid)格式 + f"^[^\\n]+?<{re.escape(self.sender)}>[::]\\s*\\n", # 昵称格式 ] for pattern in patterns: content = re.sub(pattern, '', content) @@ -148,7 +147,7 @@ class WxMessage: msg_id: int sender: str to_user: str - roomid: str # 新增room_id属性 + roomid: str # 群聊ID msg_type: MessageType content: MessageContent create_time: int @@ -175,7 +174,6 @@ class WxMessage: actual_sender = from_user if is_group_chat and content_str: # 从消息内容中提取真正的发送人 - # 简化逻辑:直接通过冒号分割获取发送人 parts = content_str.split(':', 1) # 只分割第一个冒号 if len(parts) > 1: # 提取发送人ID(冒号前的部分) @@ -195,7 +193,7 @@ class WxMessage: msg_id=data.get("MsgId", 0), sender=actual_sender, # 使用提取出的实际发送人 to_user=to_user, # 群聊时,接收者为群ID - roomid=to_user if is_group_chat else "", # 如果是群聊,roomid就是from_user + roomid=from_user if is_group_chat else "", # 如果是群聊,roomid就是from_user msg_type=MessageType(data.get("MsgType", 0)), content=message_content, create_time=data.get("CreateTime", 0), @@ -288,6 +286,7 @@ class WxMessage: return self.sender == self.wxid def from_group(self) -> bool: + """判断是否是群聊消息""" return self.to_user.endswith("@chatroom") def is_at(self, wxid) -> bool: @@ -298,7 +297,7 @@ class WxMessage: if not re.findall(f"[\s|\S]*({wxid})[\s|\S]*", self.msg_source): return False # 不在 @ 清单里 - if re.findall(r"@(?:所有人|all|All)", self.content): + if re.findall(r"@(?:所有人|all|All)", self.content.clean_content): return False # 排除 @ 所有人 return True @@ -309,11 +308,11 @@ class WxMessage: return None try: - appmsg = self.content.xml_content.find('.//appmsg') + appmsg = ET.fromstring(self.content.xml_content).find('.//appmsg') if appmsg is not None: type_value = int(appmsg.find('type').text) return AppMessageType(type_value) - except (AttributeError, ValueError): + except (AttributeError, ValueError, ET.ParseError): pass return None @@ -323,7 +322,7 @@ class WxMessage: return None try: - img = self.content.xml_content.find('img') + img = ET.fromstring(self.content.xml_content).find('img') if img is not None: return ImageContent( aes_key=img.get('aeskey', ''), @@ -332,7 +331,7 @@ class WxMessage: md5=img.get('md5', ''), thumb_base64=self.raw_data.get("Data", {}).get("ImgBuf", {}).get("buffer") ) - except (AttributeError, ValueError): + except (AttributeError, ValueError, ET.ParseError): pass return None @@ -342,7 +341,7 @@ class WxMessage: return None try: - voice = self.content.xml_content.find('.//voicemsg') + voice = ET.fromstring(self.content.xml_content).find('.//voicemsg') if voice is not None: return VoiceContent( voice_length=int(voice.get('voicelength', 0)), @@ -350,7 +349,7 @@ class WxMessage: url=voice.get('voiceurl', ''), voice_base64=self.raw_data.get("Data", {}).get("ImgBuf", {}).get("buffer") ) - except (AttributeError, ValueError): + except (AttributeError, ValueError, ET.ParseError): pass return None @@ -360,7 +359,7 @@ class WxMessage: return None try: - video = self.content.xml_content.find('.//videomsg') + video = ET.fromstring(self.content.xml_content).find('.//videomsg') if video is not None: return VideoContent( aes_key=video.get('aeskey', ''), @@ -369,7 +368,7 @@ class WxMessage: length=int(video.get('length', 0)), play_length=int(video.get('playlength', 0)) ) - except (AttributeError, ValueError): + except (AttributeError, ValueError, ET.ParseError): pass return None @@ -379,7 +378,7 @@ class WxMessage: return None try: - location = self.content.xml_content.find('location') + location = ET.fromstring(self.content.xml_content).find('location') if location is not None: return LocationContent( x=float(location.get('x', 0)), @@ -387,7 +386,7 @@ class WxMessage: label=location.get('label', ''), poi_name=location.get('poiname') ) - except (AttributeError, ValueError): + except (AttributeError, ValueError, ET.ParseError): pass return None @@ -397,4 +396,4 @@ if __name__ == '__main__': content = MessageContent(content_str, sender="Jyunere") print(content.raw_content) print(content.xml_content) - print(content.clean_content) + print(content.clean_content) \ No newline at end of file diff --git a/gewechat/client/get_chatroom_members.py b/gewechat/client/get_chatroom_members.py index d7813ea..cff615c 100644 --- a/gewechat/client/get_chatroom_members.py +++ b/gewechat/client/get_chatroom_members.py @@ -1,25 +1,40 @@ import requests import json +base_url = "http://192.168.2.240:2531/v2/api" +headers = { + 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', + 'Content-Type': 'application/json' +} def get_chatroom_members(): url = "/group/getChatroomMemberList" - base_url = "http://192.168.2.240:2531/v2/api" payload = json.dumps({ "appId": "wx_3BC6eSHGE5xEm_hH3__7c", "chatroomId": "52418238895@chatroom" }) - headers = { - 'X-GEWE-TOKEN': 'cb43f52db27e4a56bb6ec7da54373582', - 'Content-Type': 'application/json' - } response = requests.request("POST", base_url + url, headers=headers, data=payload) print(response.text) +def revoke_msg(): + + url = "/message/revokeMsg" + + payload = json.dumps({ + "appId": "{{appid}}", + "toWxid": "34757816141@chatroom", + "msgId": "769533801", + "newMsgId": "5271007655758710001", + "createTime": "1704163145" + }) + + response = requests.request("POST", base_url+url, headers=headers, data=payload) + + print(response.text) if __name__ == '__main__': get_chatroom_members() \ No newline at end of file