python实现微信防撤回神器


Posted in Python onApril 29, 2019

本文实例为大家分享了python实现微信防撤回神器的具体代码,供大家参考,具体内容如下

手写辛苦,希望给赞

#!/usr/local/bin/python3
# coding=utf-8

import os
import re
import time
import _thread
import itchat
from itchat.content import *

# 可以撤回的消息格式:文本、语音、视频、图片、位置、名片、分享、附件
# 存储收到的消息
# 格式:{msg_id:{msg_from,msg_to,msg_time,msg_time_rec,msg_tye,msg_content,msg_share_url}}
msg_dict = {}

# 存储消息中文件的临时目录,程序启动时,先清空
rev_tmp_dir = "/Users/chenlong/d1/wechat/rev/"
if not os.path.exists(rev_tmp_dir):
 os.mkdir(rev_tmp_dir)
else:
 for f in os.listdir(rev_tmp_dir):
  path = os.path.join(rev_tmp_dir, f)
  if os.path.isfile(path):
   os.remove(path)

# 表情有一个问题:消息和撤回提示的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, FRIENDS, NOTE],
      isFriendChat=True, isGroupChat=True, isMpChat=True)
def handler_reveive_msg(msg):
 global face_bug
 msg_time_rev = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
 msg_id = msg['MsgId']
 msg_time = msg['CreateTime']
 msg_share_url = None
 group_name = None
 # 获取发送人
 if 'ActualNickName' in msg:
  sender_info = set_sender_group_chat(msg)
  msg_from = sender_info['msg_from']
  group_name = sender_info['group_name']
 else:
  msg_from = (itchat.search_friends(userName=msg['FromUserName']))['RemarkName'] # 优先使用备注
  if msg_from is None:
   msg_from = msg['FromUserName']

 # 获取消息内容
 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 + " 经度->" + y
  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_rev": msg_time_rev,
   "msg_type": msg['Type'],
   "msg_content": msg_content,
   "msg_share_url": msg_share_url,
   "group_name": group_name
  }
 })


# 遍历本地消息字典,清除2分钟之前的消息,并删除缓存的消息对应的文件
def clear_timeout_msg():
 need_del_msg_ids = []
 for m in msg_dict:
  msg_time = msg_dict[m]['msg_time']
  if int(time.time()) - msg_time > 120:
   need_del_msg_ids.append(m)

 if len(need_del_msg_ids) > 0:
  for i in need_del_msg_ids:
   old_msg = msg_dict.get(i)
   if old_msg['msg_type'] == PICTURE or old_msg['msg_type'] == RECORDING or old_msg['msg_type'] == VIDEO \
     or old_msg['msg_type'] == ATTACHMENT:
    os.remove(rev_tmp_dir + old_msg['msg_content'])
   msg_dict.pop(i)


# 设置发送人,当消息是群消息的时候
def set_sender_group_chat(msg):
 msg_from = msg['ActualNickName']
 # 查找用户备注名称
 friends = itchat.get_friends(update=True)
 from_user = msg['ActualUserName']
 for f in friends:
  if from_user == f['UserName']:
   msg_from = f['RemarkName'] or f['NickName']
   break

 groups = itchat.get_chatrooms(update=True)
 for g in groups:
  if msg['FromUserName'] == g['UserName']:
   group_name = g['NickName']
   break

 return {'msg_from': msg_from, 'group_name': group_name}


# 监听通知,判断是撤回通知,则将消息发给文件助手
@itchat.msg_register([NOTE], isFriendChat=True, isGroupChat=True, isMpChat=True)
def send_msg_helper(msg):
 global face_bug
 if re.search(r"\<\!\[CDATA\[.*撤回了一条消息\]\]\>", msg['Content']) is not None:
  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 = old_msg.get('msg_from') + "撤回了" + old_msg.get('msg_type') \
      + "消息\n" \
      + old_msg.get('msg_time_rev') + "\n" \
      + old_msg.get('msg_content')
   if old_msg.get('group_name') is not None:
    msg_body = old_msg.get('group_name') + ">" + msg_body
   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(hotReload=True, enableCmdQR=2)
 itchat.run()
 # 子线程清除超时消息
 _thread.start_new_thread(clear_timeout_msg)

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

Python 相关文章推荐
Python专用方法与迭代机制实例分析
Sep 15 Python
Python虚拟环境Virtualenv使用教程
May 18 Python
浅谈python socket函数中,send与sendall的区别与使用方法
May 09 Python
浅谈Django自定义模板标签template_tags的用处
Dec 20 Python
python3实现爬取淘宝美食代码分享
Sep 23 Python
Django中更改默认数据库为mysql的方法示例
Dec 05 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
Python基础之字典常见操作经典实例详解
Feb 26 Python
Python 调用有道翻译接口实现翻译
Mar 02 Python
QML用PathView实现轮播图
Jun 03 Python
用python对excel查重
Dec 07 Python
matplotlib bar()实现百分比堆积柱状图
Feb 24 Python
python实现文件助手中查看微信撤回消息
Apr 29 #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
You might like
PHP5中GD库生成图形验证码(有汉字)
2013/07/28 PHP
php实例分享之mysql数据备份
2014/05/19 PHP
php中mail函数发送邮件失败的解决方法
2014/12/24 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
php7 安装yar 生成docker镜像
2017/05/09 PHP
JavaScript 定义function的三种方式小结
2009/10/16 Javascript
别了 JavaScript中的isXX系列
2012/08/01 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
jquery日历控件实现方法分享
2014/03/07 Javascript
jquery无法设置checkbox选中即没有变成选中状态
2014/03/27 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
基于jQuery+JSON的省市二三级联动效果
2015/06/05 Javascript
jquery过滤特殊字符',防sql注入的实现方法
2016/08/17 Javascript
jQuery实现简洁的轮播图效果实例
2016/09/07 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
jquery版轮播图效果和extend扩展
2017/07/18 jQuery
JavaScript的Proxy可以做哪些有意思的事儿
2019/06/15 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
Python3.5面向对象与继承图文实例详解
2019/04/24 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
Pycharm内置终端及远程SSH工具的使用教程图文详解
2020/03/19 Python
PyTorch 中的傅里叶卷积实现示例
2020/12/11 Python
英国最大的婴儿监视器网上商店:Baby Monitors Direct
2018/04/24 全球购物
国外软件测试工程师面试题
2016/12/09 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
2013/11/27 面试题
硕士研究生自我鉴定
2013/11/08 职场文书
护士在校生自荐信
2014/02/01 职场文书
销售员未完成销售业绩的检讨书
2014/10/12 职场文书
2014年学校后勤工作总结
2014/12/06 职场文书
环保建议书作文500字
2015/09/14 职场文书
自己搭建resnet18网络并加载torchvision自带权重的操作
2021/05/13 Python
python 开心网和豆瓣日记爬取的小爬虫
2021/05/29 Python
高考要来啦!用Python爬取历年高考数据并分析
2021/06/03 Python
SpringBoot整合阿里云视频点播的过程详解
2021/12/06 Java/Android
oracle重置序列从0开始递增1
2022/02/28 Oracle