对报错进行了修复, 新加几个装饰器,以及防撤回
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user