分享

一篇关于微信防撤回(文本、图片、语音、视频、名片等...)的Python学习教程

 千锋Python学堂 2019-07-30

大家在使用微信过程中,有时候消息还没看到,就被撤回了。毕竟好奇心大家都有,明知到消息被撤回了,就更想去看一下是什么内容。

心里想着万一是女神给我表白了呢… 今天的Python学习教程就教大家用Python来做个微信防撤回的小功能。支持文本、图片、语音、视频、名片的防撤回。

思路:

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

效果图

Python学习教程操作:将接收的消息缓存

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这个字典当中。下面我们就可以对 撤回 事件进行监听

Python学习教程:监听撤回、发送撤回内容

# 监听微信事件,

@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()

复制代码

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多