一大早醒来,发现女神昨晚发来三条消息,但是显示都已撤回,OMG,我错过了什么?群里有一个漂亮妹纸的爆照照片撤回了,想看又看不到!群里大佬分享的经典语录被撤回了,感觉错过一个亿!怎么办?用无所不能的 Python 就可以将这些撤回的消息发给你的微信,让你从此走上人生巅峰!
项目环境
语言:Python3
编辑器:Pycharm
导包
itchat:控制微信的第三方库
这个库相信大家不陌生了,之前写的 微信最强花式操作,带你玩转 wxpy 文章里用的 wxpy 库就是在 itchat 库的基础上封装的。
效果展示
以下截图显示的撤回消息类型依次是文字消息、微信自带表情、图片、语音、定位地图、名片、公众号文章、音乐、视频。有群里撤回的,也有个人号撤回的。


程序思路
主要由两部分组成:
handler_receive_msg():处理接收到的消息,将消息临时放在字典中。
send_msg_helper():将撤回的消息自动发给文件传输助手。
程序分析
首先,我们定义一个字典来储存消息,定义消息储存的临时路径。
| 1 | # 说明:可以撤回的有文本文字、微信自带&收藏的表情、图片、语音、位置、名片、分享、附件、视频 | 
接收信息处理
先将我们需要处理的消息用 msg_register 装饰器进行注册,格式化本地时间,定义消息 ID 和消息时间。如果是群成员而且是自己微信好友撤回消息,则显示撤回消息的名称是你备注的名字,如果没有备注名字,则显示名称为微信昵称。
| 1 | 
 | 
获取你的所有群的消息,判断出撤回的消息来自哪个群,显示出群名称。1
2
3
4
5
6
7groups = itchat.get_chatrooms(update=True)        # 获取所有的群
for group in groups:
    if msg['FromUserName'] == group['UserName']:  # 根据群消息的FromUserName匹配是哪个群
        group_name = group['NickName']
        group_members = group['MemberCount']
        break
group_name = group_name + '(' + str(group_members) + ')'
个人消息处理
如果为个人聊天信息,也是优先显示备注名称,没有备注名就显示昵称。
| 1 | else: # 否则输入个人消息 | 
各类型消息处理
用判断语句对各种类型的消息进行处理,包括文字消息、微信自带的表情和收藏的表情、图片、语音、位置、名片、分享、附件、视频。多条件时这里用了 in 的用法,还记得之前讲  Python 优雅的写法  文章里把用 or 连接条件改成用 in,代码更简洁,这样我们通过项目不断的巩固之前学到的知识点,这样才能不断进步。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18if 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"" + location
elif msg['Type'] == 'Sharing':      # 如果消息为分享的音乐或者文章,详细的内容为文章的标题或者是分享的名字
    msg_content = msg['Text']
    msg_share_url = msg['Url']      # 分享链接
face_bug = msg_content
更新信息字典
| 1 | # 更新字典 | 
处理撤回消息
先判断是否是撤回消息,将撤回消息发送到你的文件传输助手里,把上面函数储存的消息的发送人、发送类型、发送时间、撤回的内容发出来。以下是部分代码。
| 1 | 
 | 
主函数
最后用主函数执行微信的登录和运行。第一次需要扫码登录微信,登录时加上 hotReload 参数,为 True 时,短时间内再次运行会保存上次微信的登录态,不需要再次扫码登录。
| 1 | if __name__ == '__main__': | 
如果你电脑中有安装 Python 环境,在编辑器中直接运行源码或者在 cmd 中运行 py 文件即可。源码获取方式在文末给出。有需要的话以后可以做成界面化工具,挂在服务器上,支持做成界面化工具。
写在最后
今天的分享就到这里了,需要优化的地方:长时间运行时会报 ConnectionError 提示的错误,但是不影响发送撤回消息的功能,后期加个异常捕捉机制优化下。
赶紧动手试试吧,把你朋友撤回的消息发给 TA 看看,看看他是什么反应,有趣的撤回消息发到朋友圈去提高逼格,奈斯!
源码
| 1 | #!/usr/bin/env python | 
 
        