python实现文件助手中查看微信撤回消息


Posted in Python onApril 29, 2019

利用python实现防撤回,对方撤回的消息可在自己的微信文件传输助手中查看。

如果想变成可执行文件放在电脑中运行,可用pyinstaller将此程序打包成exe文件。

pyinstaller 文件名.py -F

执行程序后,消息防撤回就启动了。

程序完整代码

# -*-encoding:utf-8-*-
import os
import re
import shutil
import time
import itchat
from itchat.content import *

# 说明:可以撤回的有文本文字、语音、视频、图片、位置、名片、分享、附件

# {msg_id:(msg_from,msg_to,msg_time,msg_time_rec,msg_type,msg_content,msg_share_url)}
msg_dict = {}

# 文件存储临时目录
rev_tmp_dir = r"G:\python代码\微信\撤回到文件助手"
if not os.path.exists(rev_tmp_dir): os.mkdir(rev_tmp_dir)

# 表情有一个问题 | 接受信息和接受note的msg_id不一致 巧合解决方案
face_bug = None

# 将接收到的消息存放在字典中,当接收到新消息时对字典中超时的消息进行清理 | 不接受不具有撤回功能的信息
# [TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO, FRIENDS, NOTE]
@itchat.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING, ATTACHMENT, VIDEO])
def handler_receive_msg(msg):
 global face_bug
 # 获取的是本地时间戳并格式化本地时间戳 e: 2017-04-21 21:30:08
 msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
 # 消息ID
 msg_id = msg['MsgId']
 # 消息时间
 msg_time = msg['CreateTime']
 # 消息发送人昵称 | 这里也可以使用RemarkName备注 但是自己或者没有备注的人为None
 msg_from = (itchat.search_friends(userName=msg['FromUserName']))["NickName"]
 # 消息内容
 msg_content = None
 # 分享的链接
 msg_share_url = None
 if msg['Type'] == 'Text' \
   or msg['Type'] == 'Friends':
  msg_content = msg['Text']
 elif msg['Type'] == 'Recording' \
   or msg['Type'] == 'Attachment' \
   or msg['Type'] == 'Video' \
   or msg['Type'] == '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
 # 更新字典
 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
   }
  }
 )

# 收到note通知类消息,判断是不是撤回并进行相应操作
@itchat.msg_register([NOTE])
def send_msg_helper(msg):
 global face_bug
 if re.search(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>", msg['Content']) is not None:
  # 获取消息的id
  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:
   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"] == "Picture" \
     or old_msg["msg_type"] == "Recording" \
     or old_msg["msg_type"] == "Video" \
     or old_msg["msg_type"] == "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)

if __name__ == '__main__':
 itchat.auto_login()
 itchat.get_QR
 itchat.run()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中模块与包有相同名字的处理方法
May 05 Python
Python实现的手机号归属地相关信息查询功能示例
Jun 08 Python
python文件操作之批量修改文件后缀名的方法
Aug 10 Python
pycharm打开命令行或Terminal的方法
Jan 16 Python
浅谈Python编程中3个常用的数据结构和算法
Apr 30 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
你还在@微信官方?聊聊Python生成你想要的微信头像
Sep 25 Python
Django框架之中间件MiddleWare的实现
Dec 30 Python
tensorflow 动态获取 BatchSzie 的大小实例
Jun 30 Python
Matlab求解数组中的最大值及它所在的具体位置
Apr 16 Python
pytorch 运行一段时间后出现GPU OOM的问题
Jun 02 Python
微信小程序调用python模型
Apr 21 Python
Python实现微信消息防撤回功能的实例代码
Apr 29 #Python
python控制nao机器人身体动作实例详解
Apr 29 #Python
python实现nao机器人身体躯干和腿部动作操作
Apr 29 #Python
解决Python找不到ssl模块问题 No module named _ssl的方法
Apr 29 #Python
GitHub 热门:Python 算法大全,Star 超过 2 万
Apr 29 #Python
python实现nao机器人手臂动作控制
Apr 29 #Python
python机器人运动范围问题的解答
Apr 29 #Python
You might like
用PHP实现维护文件代码
2007/06/14 PHP
php数组函数序列之array_pop() - 删除数组中的最后一个元素
2011/11/07 PHP
功能强大的PHP POST提交数据类
2016/07/15 PHP
利用php获得flv视频长度的实例代码
2017/10/26 PHP
php多进程应用场景实例详解
2019/07/22 PHP
JS 遮照层实现代码
2010/03/31 Javascript
Firefox中beforeunload事件的实现缺陷浅析
2012/05/03 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
jQuery使用after()方法在元素后面添加多项内容的方法
2015/03/26 Javascript
javascript实现tab切换的四种方法
2015/11/05 Javascript
js实现的奥运倒计时时钟效果代码
2015/12/09 Javascript
JS创建对象几种不同方法详解
2016/03/01 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
整理关于Bootstrap模态弹出框的慕课笔记
2017/03/29 Javascript
详解nodejs express下使用redis管理session
2017/04/24 NodeJs
文本溢出插件jquery.dotdotdot.js使用方法详解
2017/06/22 jQuery
详谈DOM简介及节点、属性、查找节点的方法
2017/11/16 Javascript
JS实现非首屏图片延迟加载的示例
2018/01/06 Javascript
vue源码学习之Object.defineProperty 对数组监听
2018/05/30 Javascript
node错误处理与日志记录的实现
2018/12/24 Javascript
js实现一个页面多个倒计时的3种方法
2019/02/25 Javascript
js 下拉菜单点击旁边收起实现(踩坑记)
2019/09/29 Javascript
原生js实现日历效果
2020/03/02 Javascript
如何修改Vue打包后文件的接口地址配置的方法
2020/04/22 Javascript
[51:53]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第二场 1月24日
2021/03/11 DOTA
[01:08:24]DOTA2-DPC中国联赛 正赛 RNG vs Phoenix BO3 第一场 2月5日
2021/03/11 DOTA
TensorFlow实现创建分类器
2018/02/06 Python
python快速排序的实现及运行时间比较
2019/11/22 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
大学生求职中的自我评价
2013/10/01 职场文书
项目合作计划书
2014/01/09 职场文书
2014年元旦活动方案
2014/02/15 职场文书
2015秋季开学典礼演讲稿
2015/07/16 职场文书
保险公司增员口号
2015/12/25 职场文书
扩展多台相同的Web服务器
2021/04/01 Servers