• 用Python教你微信防撤回(文本、图片、语音、视频、名片等...)


    大家在使用微信过程中,有时候消息还没看到,就被撤回了。毕竟好奇心大家都有,明知到消息被撤回了,就更想去看一下是什么内容
    心里想着万一是女神给我表白了呢.. 今天就用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、数据库、大数据、架构以及各方向电子书。公众号内回复[礼包]即可领取。

  • 相关阅读:
    C#随笔
    AWS rds遇到问题及解决办法 坑
    Sencha Touch 心得
    zeroclipboard无法正常使用的解决办法
    ckeditor 在mvc4发布后出现无法显示的情况
    迅雷下载地址修改,百度网盘百度云迅雷下载
    php和mysql连接方式(短 长 池)
    MySQL数据库持久连接
    php长连接和短连接区别
    过滤sql注入关键字
  • 原文地址:https://www.cnblogs.com/wyl-0120/p/10063599.html
Copyright © 2020-2023  润新知