python使用wxpy实现微信消息防撤回脚本


Posted in Python onApril 29, 2019

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

使用了sqlite3保存数据,当有人撤回消息时取出数据发送到文件传输助手。

文件的话会先保存到本地,语音会以文件的方式发送。

wxpy 和 itchat很久没更新了,有些功能没法用了,web微信也不知道什么时候会凉。

帮助信息在注释里。

# -*- coding: utf-8 -*-
 
# 使用sqlite3保存message,当有人撤回消息时在数据库中通过ID检索该消息是否存在,如果存在则将撤回的消息发送到文件助手里。
# 目前只支持 text picture map sharing recording video attachment 类型的消息。
 
import wxpy
import sqlite3
import os
import re
 
 
# 准备工作
# 创建attachment目录用于存储 图像、地图/位置、分享、语音、视频、文件
if not os.path.isdir('attachment'):
  os.mkdir('attachment')
attachment_path = os.path.join(os.getcwd(), 'attachment')
bot = wxpy.Bot()
# 用于获取msg ID
pattern = re.compile(r'\d{19}')
# 测试wxpy能否正常工作
myself = bot.friends()[0]
myself.send('Hello?')
 
# 创建数据库和message表
try:
  conn = sqlite3.connect('wxpy.db')
  cursor = conn.cursor()
  # cursor.execute('DROP TABLE MESSAGES')
  cursor.execute("""CREATE TABLE IF NOT EXISTS MESSAGES (id INTEGER PRIMARY KEY AUTOINCREMENT,
           msg_id INTEGER NOT NULL,
           msg_text TEXT,
           create_time DATE NOT NULL,
           revoke_time DATE,
           attachment_path TEXT,
           msg_sender TEXT NOT NULL,
           msg_type TEXT NOT NULL,
           msg_url TEXT,
           msg_raw_data TEXT NOT NULL)""")
  # print('establish successfully')
finally:
  conn.commit()
  cursor.close()
  conn.close()
 
# 注册所有消息,在程序运行期间将插入所有支持的信息
@bot.register()
def store_data(msg):
  # print(msg.raw)
  # 如果消息是支持的类型就将数据插入数据库
  if msg.type in [wxpy.TEXT, wxpy.RECORDING, wxpy.PICTURE, wxpy.ATTACHMENT, wxpy.VIDEO, wxpy.SHARING, wxpy.MAP]:
    insert_data(msg)
  # 撤回的消息类型是note
  elif msg.type == wxpy.NOTE:
    send_revoke(msg)
 
# 插入数据
def insert_data(msg):
  try:
    conn = sqlite3.connect('wxpy.db')
    cursor = conn.cursor()
    if msg.type == wxpy.TEXT:
      cursor.execute("INSERT INTO MESSAGES (msg_id, msg_text, create_time, msg_sender, msg_type, msg_raw_data)\
              values (?, ?, ?, ?, ?, ?)", (msg.id, msg.text, msg.create_time, str(msg.sender)[9:-1],
                             msg.type, str(msg.raw)))
 
    # 将录音/图像/文件/视频下载到本地,插入保存路径。
    elif msg.type in [wxpy.RECORDING, wxpy.PICTURE, wxpy.ATTACHMENT, wxpy.VIDEO]:
      save_path = os.path.join(attachment_path, msg.file_name)
      msg.get_file(save_path)
      cursor.execute('INSERT INTO MESSAGES (msg_id, create_time, attachment_path, msg_sender, msg_type,\
              msg_raw_data) values (?, ?, ?, ?, ?, ?)',
              (msg.id, msg.create_time, save_path, str(msg.sender)[9:-1], msg.type, str(msg.raw)))
 
    # 插入分享/位置链接
    elif msg.type in [wxpy.SHARING, wxpy.MAP]:
      cursor.execute('INSERT INTO MESSAGES (msg_id, msg_text, create_time, msg_sender, msg_type, msg_url,\
              msg_raw_data) values (?, ?, ?, ?, ?, ?, ?)',
              (msg.id, msg.text, msg.create_time, str(msg.sender)[9:-1], msg.type, str(msg.url), str(msg.raw)))
    # print('insert data successfully')
 
  finally:
    conn.commit()
    cursor.close()
    conn.close()
 
# 在数据库中检索消息是否存在,如果存在则将被撤回的消息发送到文件传输助手。
def send_revoke(message):
  msg_id = pattern.search(message.raw['Content']).group()
  try:
    conn = sqlite3.connect('wxpy.db')
    cursor = conn.cursor()
    cursor.execute('INSERT INTO MESSAGES (msg_id, create_time, msg_sender, msg_type, msg_raw_data)\
            values (?, ?, ?, ?, ?)',
            (message.id, message.create_time, str(message.sender)[9:-1], message.type, str(message.raw)))
    msg_data = cursor.execute('SELECT * FROM MESSAGES WHERE msg_id=?', (msg_id, )).fetchall()
    # print('take out data successfully')
  finally:
    conn.commit()
    cursor.close()
    conn.close()
  if msg_data[0][7] == 'Text':
    msg_info = '告诉你一个秘密 {} 在 {} 撤回了文本\n{}'.format(msg_data[0][6], msg_data[0][3], msg_data[0][2])
    bot.file_helper.send(msg_info)
  else:
    send_revoke_nontext(msg_data)
 
# 非文本信息发送
def send_revoke_nontext(msg_data):
  if msg_data[0][7] == 'Picture':
    if msg_data[0][5][-4:] == '.gif':
      # 现在wxpy & itchat发不了GIF了
      bot.file_helper('很抱歉,暂时不支持表情(gif)的撤回重发。')
    else:
      msg_info = '告诉你一个秘密 {} 在 {} 撤回了图像'.format(msg_data[0][6], msg_data[0][3])
      bot.file_helper.send(msg_info)
      bot.file_helper.send_image(msg_data[0][5])
  elif msg_data[0][7] == 'Recording':
    msg_info = '告诉你一个秘密 {} 在 {} 撤回了语音'.format(msg_data[0][6], msg_data[0][3])
    bot.file_helper.send(msg_info)
    bot.file_helper.send_file(msg_data[0][5])
  elif msg_data[0][7] == 'Attachment':
    msg_info = '告诉你一个秘密 {} 在 {} 撤回了文件'.format(msg_data[0][6], msg_data[0][3])
    bot.file_helper.send(msg_info)
    bot.file_helper.send_file(msg_data[0][5])
  elif msg_data[0][7] == 'Video':
    msg_info = '告诉你一个秘密 {} 在 {} 撤回了视频'.format(msg_data[0][6], msg_data[0][3])
    bot.file_helper.send(msg_info)
    bot.file_helper.send_video(msg_data[0][5])
  elif msg_data[0][7] == 'Sharing':
    msg_info = '告诉你一个秘密 {} 在 {} 撤回了分享\n{}\n{}'.format(msg_data[0][6], msg_data[0][3], msg_data[0][2],\
                             msg_data[0][8])
    bot.file_helper.send(msg_info)
  elif msg_data[0][7] == 'Map':
    msg_info = '告诉你一个秘密 {} 在 {} 撤回了位置\n{}\n{}'.format(msg_data[0][6], msg_data[0][3], msg_data[0][2],\
                             msg_data[0][8])
    bot.file_helper.send(msg_info)
 
 
wxpy.embed()

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

Python 相关文章推荐
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
python opencv读mp4视频的实例
Dec 07 Python
Python多进程写入同一文件的方法
Jan 14 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
python实现飞机大战小游戏
Nov 08 Python
Pytorch 实现focal_loss 多类别和二分类示例
Jan 14 Python
python不使用for计算两组、多个矩形两两间的iou方式
Jan 18 Python
Python 使用 environs 库定义环境变量的方法
Feb 25 Python
python将音频进行变速的操作方法
Apr 08 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
详解pandas apply 并行处理的几种方法
Feb 24 Python
Django Sitemap 站点地图的实现方法
Apr 29 #Python
python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决
Apr 29 #Python
python实现微信定时每天和女友发送消息
Apr 29 #Python
Python3.5常见内置方法参数用法实例详解
Apr 29 #Python
python微信撤回监测代码
Apr 29 #Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
Apr 29 #Python
详解Python中的内建函数,可迭代对象,迭代器
Apr 29 #Python
You might like
虹吸式咖啡探讨–研磨
2021/03/03 冲泡冲煮
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
Fine Uploader文件上传组件应用介绍
2013/01/06 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
php中使用sftp教程
2015/03/30 PHP
JavaScript脚本性能的优化方法
2007/02/02 Javascript
禁止JQuery中的load方法装载IE缓存中文件的方法
2009/09/11 Javascript
页面回到顶部的三种实现(锚标记,js)
2012/10/01 Javascript
兼容各大浏览器的JavaScript阻止事件冒泡代码
2015/07/09 Javascript
使用ReactJS实现tab页切换、菜单栏切换、手风琴切换和进度条效果
2016/10/17 Javascript
浅谈原生JS中的延迟脚本和异步脚本
2017/07/12 Javascript
jQuery实现新闻播报滚动及淡入淡出效果示例
2018/03/23 jQuery
微信小程序日期选择器实例代码
2018/07/18 Javascript
解决vue cli使用typescript后打包巨慢的问题
2019/09/30 Javascript
vue键盘事件点击事件加native操作
2020/07/27 Javascript
Python实现国外赌场热门游戏Craps(双骰子)
2015/03/31 Python
分析用Python脚本关闭文件操作的机制
2015/06/28 Python
Pytorch之contiguous的用法
2019/12/31 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
HTML5移动端开发中的Viewport标签及相关CSS用法解析
2016/04/15 HTML / CSS
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
网络通讯中,端口有什么含义,端口的取值范围
2012/11/23 面试题
安全大检查实施方案
2014/02/22 职场文书
村庄绿化方案
2014/05/07 职场文书
节约粮食标语
2014/06/18 职场文书
化工工艺设计求职信
2014/06/25 职场文书
环境日宣传活动总结
2014/07/09 职场文书
2014年创卫工作总结
2014/11/24 职场文书
毕业生个人自荐书
2015/03/05 职场文书
公司回复函格式
2015/07/14 职场文书
2016年秋季趣味运动会开幕词
2016/03/04 职场文书
《成长的天空》读后感3篇
2019/12/06 职场文书
jquery插件实现搜索历史
2021/04/24 jQuery
常用的MongoDB查询语句的示例代码
2021/07/25 MongoDB
Go语言 详解net的tcp服务
2022/04/14 Golang