大家在使用微信过程中,有时候消息还没看到,就被撤回了。毕竟好奇心大家都有,明知到消息被撤回了,就更想去看一下是什么内容
心里想着万一是女神给我表白了呢.. 今天就用Python来做个微信防撤回的小功能。支持文本、图片、语音、视频、名片的防撤回。

思路:
利用itchat库将每次接收到的消息进行缓存。监听撤回事件,当有消失被撤回时,通过msgId去缓存中取到信息再发送给文件传输助手。这样就实现了一个简单的防撤回功能。

效果图

在这里插入图片描述

将接收的消息缓存

import itchat
from itchat.content import *
import datetime
import re
import os # 微信接受的信息存储路径
FILE_PATH = '/home/wechat/'
# 存放微信消息的缓存字典
MSG_DICT = {} # 微信消息类型字典
MSG_MESSAGE = {'Text': '文本', 'Map': '位置分享', 'Sharing': '分享链接',
               'Picture': '图片', 'Video': '视频', 'Card': '名片',
               'Attachment': '附件', 'Recording': '语音'} """
 监听消息
"""
# 监听的消息类型 为TEXT, MAP, SHARING, PICTURE, VIDEO, CARD, RECORDING, ATTACHMENT @itchat.msg_register([TEXT, MAP, SHARING, PICTURE, VIDEO, CARD, RECORDING, ATTACHMENT])
def wechat_msg(msg):
    # 获取消息id
    msg_id = msg['MsgId']
    # 当前时间
    msg_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
    # 发送人
    msg_from = itchat.search_friends(userName=msg['FromUserName'])['RemarkName']
    # 备注为空 获取昵称
    if not msg_from:
        msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName']
    # 内容
    msg_text = msg['Text']
    # 消息类型
    msg_type = msg['Type']     msg_url = None     # 消息为视频、照片、语音、附件的时候需要进行保存
    save_type = [VIDEO, PICTURE, RECORDING, ATTACHMENT]
    if msg_type in save_type:
        # 保存文件
        msg['Text'](FILE_PATH + msg['FileName'])
        msg_text = msg['FileName']     # 消息类型为地图、分享链接时 记录url
    url_type = [MAP, SHARING]
    if msg_type in url_type:
        msg_url = msg['msg_url']
    # 名片
    if msg_type == CARD:
        sex = msg['RecommendInfo']['Sex']
        if sex == 1:
            sex = '小哥哥'
        elif sex == 2:
            sex = '小姐姐'
        else:
            sex = 'ladyBoy'
        msg_text = f'来自{msg["RecommendInfo"]["Province"]} { msg["RecommendInfo"]["City"]}的 {msg["RecommendInfo"]["NickName"]} {sex} 的名片.'
    # 消息放入字典中
    MSG_DICT[msg_id] = {'msg_from': msg_from, 'msg_time': msg_time, 'msg_text': msg_text, 'msg_url': msg_url, 'msg_type': MSG_MESSAGE[msg_type]}
    print({'msg_from': msg_from, 'msg_time': msg_time, 'msg_text': msg_text, 'msg_url': msg_url, 'msg_type': MSG_MESSAGE[msg_type]})

我们将微信接收到的文本、视频、语音、图像、附件等消息类型都缓存到了MSG_DICT这个字典当中。下面我们就可以对 撤回 事件进行监听

监听撤回、发送撤回内容

# 监听微信事件,
@itchat.msg_register([NOTE])
def get_withdraw_message(msg):
    # 文本消息
    content = msg['Content']
    print('监听事件...')
    # result = re.search(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>", msg['Content'])
    # 判断是否是撤回消息
    pattern = re.compile(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>")
    match = pattern.findall(content)
    """
    msg 内容
    '<sysmsg type="revokemsg">
        <revokemsg>
            <session>wxid_ajl8ccgq8ehf22</session>
            <oldmsgid>1671792812</oldmsgid>
            <msgid>3341430144853335059</msgid>
            <replacemsg><![CDATA["初一丶" 撤回了一条消息]]></replacemsg>
        </revokemsg>
    </sysmsg>'
    """
    # 有撤回的消息
    if match:
        # 获取撤回消息的msg_id
        withdraw_msg_id = re.search(r"\<msgid>(.*?)\<\/msgid", content).group(1)
        if MSG_DICT:
            # 获取撤回消息的内容
            withdraw_msg = MSG_DICT.get(withdraw_msg_id)
            # 构建消息文本
            semd_msg = withdraw_msg.get('msg_from') + '撤回了他在' + withdraw_msg.get('msg_time') + \
            '发送的' + withdraw_msg.get('msg_type') + '消息。' + '内容为:' + withdraw_msg.get('msg_text')             print(semd_msg)             # 撤回信息的消息类型
            type = withdraw_msg['msg_type']             # 如果是地图、或者分享信息的时候 拼接url
            if type in [MAP, SHARING]:
                semd_msg += "信息链接为:" + withdraw_msg.get('msg_url')             # 将文本信息发送至文件传输助手
            result = itchat.send(semd_msg,  toUserName='filehelper')             # 如果是['视屏', '图片', '语音', '附件'] 发送相应文件
            file = FILE_PATH + withdraw_msg['msg_text']
            if type in ['视频', '图片', '语音', '附件']:
                # 发送文件至传输助手
                result = itchat.send_file(file, toUserName='filehelper')
                # 发送图片也可以
                # result = itchat.send_image(file, toUserName='filehelper')
                # 发送视频
                # result = itchat.send_video(file, toUserName='filehelper')
                # 将已发送的文件 从硬盘上删除
                os.remove(file)
        # 从字典中删除已发送的文件
        del MSG_DICT[withdraw_msg_id] if __name__ == '__main__':
    # 微信热登录
    itchat.auto_login(True)
    # 启动
    itchat.run()

后来我发现、防撤回功能并没有什么卵用,因为女神给我发的不是去洗澡就是去睡觉、根本没给我表白

在这里插入图片描述

文章首发自公众号:「程序员共成长」。一个专门面向程序员群体的圈子,专注分享日常学习总结、业内资讯、优质学习视频资源, 这里不光有技术、还有诗和远方…给新加入的小伙伴准备了见面礼,包括但不限于Java、Python、Linux、数据库、大数据、架构以及各方向电子书。公众号内回复[礼包]即可领取。

用Python教你微信防撤回(文本、图片、语音、视频、名片等...)的更多相关文章

  1. 我已经看到了,撤回也没用了(PC微信防撤回补丁)

    前两天看 GitHub 发现一个有趣的项目,PC微信防撤回补丁,本着研究学习的目的,在看过源码,一顿疯狂操作之后,了解了其原理是基于修改 wechatwin.dll 达到防撤回的. 于是乎,自己动手玩 ...

  2. 记录实践PC端微信防撤回实现过程(基于3.1.0.67版本)

    利用OD实现对PC端微信防撤回功能的实现 文章最后有一键补丁工具哦~ 准备工具 1.OD 2.PC微信客户端(3.1.0.67) 过程 1.运行微信客户端,不需要登录 2.运行OD,左上角选择附加进程 ...

  3. Python3.5+PyQt5多线程+itchat实现微信防撤回桌面版代码

    weChatThread线程类 之前一直不会python多线程,写这个程序的时候,发现不用多线程会陷入无限未响应状态.于是学了半天python多线程,但是在主函数里写的时候,发现一个问题,Ui主线程和 ...

  4. PC端微信防撤回功能分析

    1.打开PC端微信的安装目录,有一个WeChatWin.dll文件,微信的所有功能基本上都在这个文件中了 2.OD打开,搜索字符串revokemsg(撤回消息,掌握一门外语是多么的重要啊!!!),在所 ...

  5. Mac查看及清理QQ、微信之前下载的图片、视频或DB等

    之前写过一篇清理Mac空间的文章: Mac系统清理.占用空间大.空间不够.查看系统文件大小分布 其实这篇文章不是太全,有些资源还是清理不彻底,正好前段时间需要找微信下载的资源,其实可以算作空间清理的续 ...

  6. [软件逆向]实战Mac系统下的软件分析+Mac QQ和微信的防撤回

      0x00  一点废话 最近因为Mac软件收费的比较多,所以买了几款正版软件,但是有的软件卖的有点贵,买了感觉不值,不买吧,又觉得不方便,用别人的吧,又怕不安全.于是我就买了正版的Hopper Di ...

  7. Python实现微信消息防撤回

    微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿.在此期间微信也推出了不少的功能如:“摇一摇”.“漂流瓶”.“朋友圈”.“附近的人” ...

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

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

  9. Windows下用python来获取微信撤回消息

    转自:https://blog.csdn.net/sunzhibin1/article/details/83348304 娱乐(windows系统) 安装itchat itchat是一个开源的pyth ...

随机推荐

  1. java中&和&& | 和||的区别

    我想很多人在学习java的时候,或者其他语言(如:C#,.Net等)都会遇到 &和&& 然而,如果你没有真正的理解他们的意思,这会给你思路上面带来很大的麻烦 在这篇blog中, ...

  2. 从构建分布式秒杀系统聊聊Disruptor高性能队列

    前言 秒杀架构持续优化中,基于自身认知不足之处在所难免,也请大家指正,共同进步.文章标题来自码友 简介 LMAX Disruptor是一个高性能的线程间消息库.它源于LMAX对并发性,性能和非阻塞算法 ...

  3. mfc启动画面

    目标 用一张位图来作为启动画面,在进入程序时显示. 策略 在应用程序类的I n i t I n s t a n c e ()函数中,在最早时刻创建启动窗口.启动窗口用一个位图类显示在普通窗口中. 步骤 ...

  4. python+appium 查找某个元素find_element()并click()点击,正向判断与反判断的方法封装

    使用场景: 在自动化测试过程中,难免会用到反判断,包括异常情况的处理,比如:find_element_by_name('测试') 判断"测试"是否存在,存在则点击,不存在则执行其他 ...

  5. JAVAEE——SpringMVC第一天:介绍、入门程序、架构讲解、SpringMVC整合MyBatis、参数绑定、SpringMVC和Struts2的区别

    1. 学习计划   第一天 1.SpringMVC介绍 2.入门程序 3.SpringMVC架构讲解 a) 框架结构 b) 组件说明 4.SpringMVC整合MyBatis 5.参数绑定 a) Sp ...

  6. 阿里云Centos7.x MySql安装教程示例

    创建用户 useradd mysql; passwd mysql; 下载(比如:5.5.61) 地址 https://dev.mysql.com/downloads/mysql/5.6.html#do ...

  7. 基于Webpack, KnockoutJs,esyui,koeasyui实现类vue-cli生成的模板框架

    前后端分离的开发机制,基本上是开发现代业务系统的标配.可在国内某些特殊领域还是存在大量的以JQuery走天涯的现象,但其中也不泛有追求技术者,如不才的鄙人.不才的本人曾以JQuery走天涯:后又接受了 ...

  8. 学习 JavaScript (六)核心概念:函数

    基本知识 函数对于我们来说,不算陌生的东西.中学就已经有了函数的概念,比如: y = f(x) 输入一个数 x,能够得到与之对应的一个数 y.也就是说,f(x) 的有一个返回值,这是函数在数学上的定义 ...

  9. rocketMQ安装中遇到的坑

    安装步骤是这些: Prerequisite The following softwares are assumed installed: 64bit OS, Linux/Unix/Mac is rec ...

  10. C#-Xamarin的Android项目开发(一)——创建项目

    创建项目 使用Xamarin开发安卓项目,首先需要安装VS2017以上版本.因为VS2017以上的版本,可以直接创建Xamarin项目. 另外用Xamarin开发安卓项目,还需要使用Intel的CPU ...