用Python还原对方已经撤回的消息

微信大家在使用的过程中,肯定都使用过“撤回”这一功能,要不是发错人,或者发错字,更或者是发错内容,还有发图片、表情包等。看到这一条条“××撤回一条消息”,大家是不是很好奇,想看又看不到,今天咱就用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']breakgroup_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("<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)if location is None:msg_content = r"纬度->" + x.__str__() + " 经度->" + y.__str__()     else:msg_content = r"" + locationelif 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_bugif re.search(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>", msg['Content']) is not None:old_msg_id = re.search("\<msgid\>(.*?)\<\/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()

用Python还原对方已经撤回的消息相关推荐

  1. 利用Python查看微信好友撤回的消息

    效果图如下: 不仅可以查看微信好友撤回的文字消息,如位置.视频.音频.图片等等都可以查看. 直接上源代码: # Python查看微信撤回消息 import re import os import ti ...

  2. 如何用Python查看微信好友撤回的消息?

    首先声明,本文主要就是在试图复现这篇文档中所说的: https://cloud.tencent.com/developer/article/1701130 因此要是下文中有什么讲的不清楚的地方,大家也 ...

  3. 【日常】如何将微信中对方所撤回的消息恢复?——电脑PC端微信教程:附源码

    1 前言 寻找微信撤回的图片是不少人一直在寻找的方法 但苦于在网上一直找不到结果 因此本文提出了一种可以找到微信撤回图片的方法. 区别于网上其他的不可用代码,本文能成功恢复! 2 原理 之前的说法是, ...

  4. Python还原微信好友已撤回的微信消息

    版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/m0_37615390,未经博主允许不得转载. 一大早醒来,发现女神昨晚发来三条消息,但是显示都已撤回,OMG,我错 ...

  5. python查看微信撤回消息_想查看微信好友撤回的消息?Python帮你搞定

    要说微信最让人恶心的发明,消息撤回绝对能上榜. 比如你现在正和女朋友用微信聊着天,或者跟自己喜欢的女孩子聊着天,一个不留神,你没注意到对方发的消息就被她及时撤回了,这时你很好奇,好奇她到底发了什么?于 ...

  6. python学习 -女神或者男神把微信消息撤回后好慌,有了这个妈妈再也不担心你看不到女神或者男神撤回的消息了(超详解)...

    简介 有时候在忙工作,女朋友发了一个消息,就撤回了,但是人天生的都有一颗好奇心,而且在当今这个时代找个女朋友不容易,一个程序猿找一个女朋友更是不容易的.人家好不容易跟你,你还不得把人家当老佛爷侍候着, ...

  7. 用PHP查看微信撤回的消息,python实现文件助手中查看微信撤回消息

    利用python实现防撤回,对方撤回的消息可在自己的微信文件传输助手中查看. 如果想变成可执行文件放在电脑中运行,可用pyinstaller将此程序打包成exe文件. pyinstaller 文件名. ...

  8. python学习 -对象把微信消息撤回后好慌,有了这个你就能看到撤回的消息了(超详解)

    目录 一.简介 普通人 python技术人员 1.准备环境 2.itchat介绍 3.itchat使用 4.pycharm解释器写入代码 一.简介 当我们与朋友,亲人,爱人聊天的时候,我估计每个人都经 ...

  9. 微信撤回的消息找不到?你OUT了,看看python程序怎么找回!

    如题所说,本节分享文章,微信撤回的消息如何通过python程序找回来? 下方是我录制的一个GIF动图,发送了五条消息,并且撤回,撤回的消息我转发到文件传输助手,如箭头所示 1.登陆itchat模块 2 ...

最新文章

  1. python常用变量名_python基础知识整理
  2. UITests操作指南
  3. 利用SeekFree的核心板调试MM32F3277的ISP功能
  4. 列举ospf的5种报文类型_这5种“专升本”你都知道吗?那个含金量更高呢?报考如何选择?...
  5. (转)双系统卸载Ubuntu
  6. linux tomcat6 jmx,Zabbix3.2.6之通过JMX监控Tomcat
  7. 基于DirectShow的局域网内音视频流的多机共享
  8. 收购Nervana,英特尔缘何看中AI市场
  9. 利用dropbox来Host你的silverlight应用
  10. 扫描全能王?原来图像技术可以这样子玩
  11. javascript进阶面向对象ES6
  12. “红山开源”创新论坛 | ChinaOSC
  13. Android动画内置插值器
  14. 腾讯视频QLV文件格式转换MP4格式
  15. centos查看磁盘转速_Centos磁盘读写检测进行性能判断
  16. iOS安全之【禁止网络代理】(防抓包) | 蓄力计划
  17. 递归和非递归实现阶乘
  18. HDU 4310 贪心算法 C++版
  19. CentOS下载教程
  20. 宗谱链——用区块链谱写家族史诗

热门文章

  1. Linux切换盘,C盘切换到D盘
  2. (七)play之yabe项目【CRUD】
  3. 中职学校计算机专业展板,职教中心课改展板文字内容
  4. 使用自定义键盘切换大小写功能失效,一直显示大写字母
  5. js 实现在移动端开发,解决不同手机像素大小的兼容问题
  6. 做wish需要会PHP吗,Wish用户下单后会发生什么?
  7. 快手:回文字符串(Python语言实现)
  8. 比较vtiger与Sugar
  9. 华为荣耀5cvs华为v9play_荣耀v9play和荣耀v9哪个好有什么不同?荣耀v9和v9play区别对比评测...
  10. 撸一撸 ICML2016的CReLU