微信大家在使用的过程中,肯定都使用过“撤回”这一功能,要不是发错人,或者发错字,更或者是发错内容,还有发图片、表情包等。看到这一条条“××撤回一条消息”,大家是不是很好奇,想看又看不到,今天咱就用Python还原对方已经撤回的消息。
看到这一条的“××撤回一条消息”,顿时特别好奇,心想是不是撤回了漂亮妹妹的图片吗,O(∩_∩)O哈哈~,没事的,就用Python让撤回的消息重现。例如:
例如好友撤回的消息可以自动通过文件传输助手发送在手机上,这些文字、图片、链接都会重现,只要点开图片就知道对方撤回了啥,并且这图片还可以保存在手机上哦。话不多说,来看看我这位好友撤回了啥图,哈哈 ,直接上图。
图片来源于网络
msg_dict = {} # 定义字典储存消息
rev_tmp_dir = "E:\\wechat1\\" # 定义文件存储临时目录
...
# 将接收到的消息存放在字典中,不接受不具有撤回功能的信息
@itchat.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO, FRIENDS],
isFriendChat=True, isGroupChat=True)
...
def handler_receive_msg(msg):
...
msg_content = None # 消息内容
msg_share_url = None # 分享的链接
...
@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)
# 收到note通知类消息,判断是不是撤回并进行相应操作
def send_msg_helper(msg):
...
if __name__ == '__main__':
(1)导包:导入itchat库,用于控制微信
import os
import re
import shutil
import time
import itchat
from itchat.content import *
(2)定义储存的消息和临时存储目录
msg_dict = {} # 定义字典储存消息
rev_tmp_dir = "E:\\wechat1\\" # 文件存储临时目录
if not os.path.exists(rev_tmp_dir):
os.mkdir(rev_tmp_dir)
face_bug = None
(3)接受消息处理
定义消息ID和消息时间,并且加以判断是群消息或者是好友消息。
@itchat.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO, FRIENDS],
isFriendChat=True, isGroupChat=True)
def handler_receive_msg(msg):
global face_bug # 全局变量
msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 格式化本地时间戳
msg_id = msg['MsgId']
msg_time = msg['CreateTime']
if 'ActualNickName' in msg: #判断
from_user = msg['ActualUserName'] # 群消息的发送者,用户的唯一标识
msg_from = msg['ActualNickName']
friends = itchat.get_friends(update=True) # 获取所有好友
for friend in friends:
if from_user == friend['UserName']: # 判断群里撤回消息的是否为自己好友
if friend['RemarkName']: # 优先使用好友的备注名称,没有则使用昵称
msg_from = friend['RemarkName']
else:
msg_from = friend['NickName']
break
(4)获取群消息,并且加以判断是来自哪个群。
groups = itchat.get_chatrooms(update=True) # 获取所有的群
for group in groups:
if msg['FromUserName'] == group['UserName']:
group_name = group['NickName']
group_members = group['MemberCount']
break
group_name = group_name + '(' + str(group_members) + ')'
(5)处理个人消息,判断是否为自己撤回的消息。
else: # 否则输入个人消息
if itchat.search_friends(userName=msg['FromUserName'])['RemarkName']: # 优先使用备注名称
msg_from = itchat.search_friends(userName=msg['FromUserName'])['RemarkName']
else:
msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']
group_name = ''
msg_content = None
msg_share_url = None
(6)用if判断语句对各种类型的消息进行处理,发送的文本消息、图片、链接,并且保存在文件夹下面。
if msg['Type'] in ('Text', 'Friends'):
msg_content = msg['Text'] # 如果发送的消息是文本或者好友推荐
elif msg['Type'] in ('Recording', 'Attachment', 'Video', 'Picture'):
msg_content = r"" + msg['FileName']
msg['Text'](rev_tmp_dir + msg['FileName']) # 保存文件
elif msg['Type'] == 'Card':
msg_content = msg['RecommendInfo']['NickName'] + r" 的名片"
elif msg['Type'] == 'Map':
x, y, location = re.search(
"" + x.__str__() + " 经度->" + y.__str__()
else:
msg_content = r"" + location
elif msg['Type'] == 'Sharing':
msg_content = msg['Text']
msg_share_url = msg['Url']
face_bug = msg_content
# 更新字典
msg_dict.update({msg_id: {"msg_from": msg_from,
"msg_time": msg_time,
"msg_time_rec": msg_time_rec,
"msg_type": msg["Type"],
"msg_content": msg_content,
"msg_share_url": msg_share_url,
"group_name": group_name}})
(7)处理撤回的消息,收到通知消息,并且判断是不是为撤回的消息,如果是,获取消息的ID和时间并且发送。
@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)
# 收到note通知类消息,判断是不是撤回并进行相应操作
def send_msg_helper(msg):
global face_bug
if re.search(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>", msg['Content']) is not None:
old_msg_id = re.search(
"\(.*?)\<\/msgid\>",
msg['Content']).group(1)
old_msg = msg_dict.get(old_msg_id, {})
if len(old_msg_id) < 11:
itchat.send_file(rev_tmp_dir + face_bug, toUserName='filehelper')
os.remove(rev_tmp_dir + face_bug)
else:
(9)文件助手里文本消息提示撤回了什么消息。
msg_body = "来看看,有人撤回消息啦!" + "\n" \
+ old_msg.get('msg_from') + " 撤回了 " + old_msg.get("msg_type") + " 消息" + "\n" \
+ old_msg.get('msg_time_rec') + "\n" \
+ "他撤回了什么 ⇣" + "\n" \
+ r"" + old_msg.get('msg_content')
if old_msg['msg_type'] == "Sharing":
msg_body += "\n就是这个链接➣ " + old_msg.get('msg_share_url')
itchat.send(msg_body, toUserName='filehelper')
if old_msg["msg_type"] in (
"Picture", "Recording", "Video", "Attachment"):
file = '@fil@%s' % (rev_tmp_dir + old_msg['msg_content'])
itchat.send(msg=file, toUserName='filehelper')
os.remove(rev_tmp_dir + old_msg['msg_content'])
msg_dict.pop(old_msg_id)
(10)主函数
if __name__ == '__main__':
itchat.auto_login(hotReload=True)
itchat.run()