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统计日志ip访问数的方法
Jul 06 Python
python Selenium爬取内容并存储至MySQL数据库的实现代码
Mar 16 Python
python调用Delphi写的Dll代码示例
Dec 05 Python
通过python的matplotlib包将Tensorflow数据进行可视化的方法
Jan 09 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
Python整数对象实现原理详解
Jul 01 Python
python连接mongodb集群方法详解
Feb 13 Python
解决python3插入mysql时内容带有引号的问题
Mar 02 Python
Python递归函数特点及原理解析
Mar 04 Python
TensorFlow-gpu和opencv安装详细教程
Jun 30 Python
python程序如何进行保存
Jul 03 Python
详解Python中openpyxl模块基本用法
Feb 23 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
PHP中的常见魔术方法功能作用及用法实例
2015/07/01 PHP
PHP设计模式之迭代器模式
2016/06/17 PHP
PHP 使用二进制保存用户状态的实例
2018/01/29 PHP
Javascript继承机制的设计思想分享
2011/08/28 Javascript
js使用post 方式打开新窗口
2015/02/26 Javascript
JS+CSS实现仿msn风格选项卡效果代码
2015/10/22 Javascript
JavaScript获取IP获取的是IPV6 如何校验
2016/06/12 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
Bootstrap + AngularJS 实现简单的数据过滤字符查找功能
2017/07/27 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
CentOS7中源码编译安装NodeJS的完整步骤
2018/10/13 NodeJs
vue-cli3搭建项目的详细步骤
2018/12/05 Javascript
Nodejs实现的操作MongoDB数据库功能完整示例
2019/02/02 NodeJs
Javascript读写cookie的实例源码
2019/03/16 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
微信小程序开发之左右分栏效果的实例代码
2019/05/20 Javascript
Vue 动态组件components和v-once指令的实现
2019/08/30 Javascript
浅谈Vue为什么不能检测数组变动
2019/10/14 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
python list 合并连接字符串的方法
2013/03/09 Python
详解Python的单元测试
2015/04/28 Python
浅谈PYTHON 关于文件的操作
2019/03/19 Python
Python pandas库中的isnull()详解
2019/12/26 Python
python+selenium+PhantomJS抓取网页动态加载内容
2020/02/25 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
浅析HTML5中header标签的用法
2016/06/24 HTML / CSS
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
期终自我鉴定
2014/02/17 职场文书
作风转变年心得体会
2014/10/22 职场文书
学习党章的体会
2014/11/07 职场文书
2015年公司保安年终工作总结
2015/05/14 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
2019年妇科护士的自我鉴定(3篇)
2019/09/26 职场文书
手写实现JS中的new
2021/11/07 Javascript