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基于pygame实现图片代替鼠标移动效果
Nov 11 Python
Python只用40行代码编写的计算器实例
May 10 Python
Python 3中print函数的使用方法总结
Aug 08 Python
Python随机生成均匀分布在单位圆内的点代码示例
Nov 13 Python
python构建基础的爬虫教学
Dec 23 Python
python内存动态分配过程详解
Jul 15 Python
python 模拟创建seafile 目录操作示例
Sep 26 Python
pytorch::Dataloader中的迭代器和生成器应用详解
Jan 03 Python
Python3使用xlrd、xlwt处理Excel方法数据
Feb 28 Python
Python退出时强制运行一段代码的实现方法
Apr 29 Python
浅谈keras.callbacks设置模型保存策略
Jun 18 Python
django使用graphql的实例
Sep 02 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
php正则过滤html标签、空格、换行符的代码(附说明)
2010/10/25 PHP
PHP记录页面停留时间的方法
2016/03/30 PHP
深入理解PHP中的empty和isset函数
2016/05/26 PHP
javascript 日期常用的方法
2009/11/11 Javascript
JavaScript 格式字符串的应用
2010/03/29 Javascript
JavaScript对内存分配及管理机制详细解析
2013/11/11 Javascript
javascript禁制后退键(Backspace)实例代码
2013/11/15 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
js中运算符&amp;&amp; 和 || 的使用记录
2014/08/21 Javascript
使用javascript实现json数据以csv格式下载
2015/01/09 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
JQuery移动页面开发之屏幕方向改变与滚屏的实现
2015/12/03 Javascript
实例详解jQuery结合GridView控件的使用方法
2016/01/04 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
Bootstarp基本模版学习教程
2017/02/01 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
JS实现禁止用户使用Ctrl+鼠标滚轮缩放网页的方法
2017/04/28 Javascript
浅谈关于JS下大批量异步任务按顺序执行解决方案一点思考
2019/01/08 Javascript
[01:32]2014DOTA2西雅图邀请赛 CIS我们有信心进入正赛
2014/07/08 DOTA
python 合并文件的具体实例
2013/08/08 Python
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python迭代器和生成器介绍
2015/03/06 Python
python 正确保留多位小数的实例
2018/07/16 Python
Python递归函数实例讲解
2019/02/27 Python
Python 等分切分数据及规则命名的实例代码
2019/08/16 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
Python中BeautifulSoup通过查找Id获取元素信息
2020/12/07 Python
美国最大的团购网站:Groupon
2016/07/23 全球购物
.NET面试10题
2014/02/24 面试题
个人思想理论学习的自我鉴定
2013/11/30 职场文书
物业门卫岗位职责
2013/12/28 职场文书
七一党建活动方案
2014/01/28 职场文书
护士个人自我鉴定
2014/03/24 职场文书
写给医院的感谢信
2015/01/22 职场文书
初三化学教学反思
2016/02/22 职场文书
MySQL数据库优化之通过索引解决SQL性能问题
2022/04/10 MySQL