对报错进行了修复, 新加几个装饰器,以及防撤回

This commit is contained in:
Mr.yang
2023-10-08 22:02:57 +08:00
parent e759e5fa9d
commit f321ed6d85
11 changed files with 485 additions and 72 deletions
+55 -11
View File
@@ -2,12 +2,12 @@
import re
import time
from wcfauto.msg_list import msg_list
from wcferry import Wcf, WxMsg
class WcfV2(Wcf):
def __init__(self, host: str, port: int = 10086, debug: bool = True) -> None:
def __init__(self, host: str = None, port: int = 10086, debug: bool = True) -> None:
super().__init__(host, port, debug)
def get_msg(self, block=True) -> WxMsg:
@@ -27,8 +27,9 @@ class WcfV2(Wcf):
class WxMsgV2(WxMsg):
"""微信消息
Attributes:
type (int): 消息类型,可通过 `get_msg_types` 获取
type (int): 消息类型,可通过 `wcf类的 get_msg_types` 获取
id (str): 消息 id
xml (str): 消息 xml 部分
sender (str): 消息发送人
@@ -39,8 +40,6 @@ class WxMsgV2(WxMsg):
"""
def __init__(self, msg: WxMsg) -> None:
# self._is_self = msg._is_self
# self._is_group = msg._is_group
self._type = msg.type
self._id = msg.id
self._ts = msg.ts
@@ -49,8 +48,8 @@ class WxMsgV2(WxMsg):
self._sender = msg.sender
self._roomid = msg.roomid
self._content = msg.content
self._thumb = msg.thumb
self._extra = msg.extra
self._thumb = msg.thumb.replace("\\", "/")
self._extra = msg.extra.replace("\\", "/")
self.__data = {'isSelf': True if self._is_self else False,
'isGroup': True if self._is_group else False,
'isPyq': True if self._type == 0 else False,
@@ -64,20 +63,54 @@ class WxMsgV2(WxMsg):
'thumb': self._thumb if self._thumb else None,
'extra': self._extra if self._extra else None,
'time': int(time.time() * 1000),
}, 'revokmsgid': None, 'isRevokeMsg': False, }
}, 'revokmsgid': None, 'isRevokeMsg': False}
self.__revokmsg_p()
self.__initial()
msg_list.append(self)
def __revokmsg_p(self):
rmsg = self.__data['data']['content']
rev_type = re.findall('<sysmsg type="(.*?)"\s?', rmsg)
rev_w = re.findall("<replacemsg><!\[CDATA\[(.*?)]]></replacemsg>", rmsg)
rev_type = re.findall(r'<sysmsg type="(.*?)"\s?', rmsg)
rev_w = re.findall(r"<replacemsg><!\[CDATA\[(.*?)]]></replacemsg>", rmsg)
if len(rev_type) == 0 or len(rev_w) == 0:
return
if rev_type[0] == 'revokemsg' and rev_w[0] == '撤回了一条消息':
if rev_type[0] == 'revokemsg' and '撤回了一条消息' in rev_w[0]:
self.__data['data']['content'] = rev_w[0]
self.__data['isRevokeMsg'] = True
self.__data['revokmsgid'] = re.findall('<newmsgid>(.*?)</newmsgid>', rmsg)[0]
def __initial(self):
try:
if self.__data['data']['type'] == 51:
op_id = re.findall(r"<op id='(\d+)'>", self.__data['data']['content'])[0]
name = re.findall(r'<name>(.*?)</name>', self.__data['data']['content'])[0].strip()
if name == 'lastMessage' and str(op_id) == '2':
username = re.findall(r'<username>(.*?)</username>', self.__data['data']['content'])[0]
self.__data['data']['xml'] = self.__data['data']['content']
self.__data['data']['content'] = f'其他设备进入 [{username}] 聊天界面'
return
if name == 'HandOffMaster' and str(op_id) == '11':
opcode = re.findall(r'opcode="(\d+)"', self.__data['data']['content'])[0]
self.__data['data']['xml'] = self.__data['data']['content']
title = '' or re.findall(r'<title><!\[CDATA\[(.*?)]]></title>', self.__data['data']['content'])[0]
type_id = re.findall(r'<handoff\s+type="(\d+)"', self.__data['data']['content'])[0]
type_map = {'2': '公众号文章', '3': '小程序'}
if str(opcode) == '1':
self.__data['data']['content'] = f'其他设备进入{type_map[str(type_id)]} [{title}]'
elif str(opcode) == '2':
self.__data['data']['content'] = f'其他设备离开{type_map[str(type_id)]} [{title}]'
elif str(opcode) == '3':
self.__data['data']['content'] = f'其他设备在{type_map[str(type_id)]} [{title}] 里进行跳转'
elif str(opcode) == '4':
self.__data['data']['content'] = f'其他设备进入{type_map[str(type_id)]} [{title}]'
return
if name == 'MomentsUnreadMsgStatus' or name == 'MomentsTimelineStatus':
self.__data['data']['xml'] = self.__data['data']['content']
self.__data['data']['content'] = f'其他设备进入朋友圈'
return
except:
pass
def __str__(self) -> str:
return repr(self.__data)
@@ -139,3 +172,14 @@ class WxMsgV2(WxMsg):
def is_text(self) -> bool:
"""是否文本消息"""
return self.type == 1
def get_revoke_msg(self) -> "WxMsg" or None:
"""
获取撤回的消息
注意仅有撤回的消息在调用函数会返回消息内容, 自行修改 msg内容或者不是撤回的消息在调用该函数后会返回 None
未撤回的消息调用该函数会返回 None
:return: 返回被撤回的信息, 信息的类仍然是 WxMsg
"""
if self.__data['isRevokeMsg'] and (self.__data['revokmsgid'] is not None):
return msg_list.find_msg(self.__data['revokmsgid'])
return None