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中find()方法的使用
May 18 Python
python实现网站的模拟登录
Jan 04 Python
django实现用户登陆功能详解
Dec 11 Python
Python创建字典的八种方式
Feb 27 Python
python ChainMap的使用和说明详解
Jun 11 Python
使用python实现多维数据降维操作
Feb 24 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python实现批量转换图片为黑白
Jun 16 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
Jan 24 Python
Pytorch反向传播中的细节-计算梯度时的默认累加操作
Jun 05 Python
聊聊基于pytorch实现Resnet对本地数据集的训练问题
Mar 25 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 类型转换函数intval
2009/06/20 PHP
PHP+ajax 无刷新删除数据
2010/02/20 PHP
PHP MemCached高级缓存配置图文教程
2010/08/05 PHP
php实现word转html的方法
2016/01/22 PHP
CodeIgniter框架验证码类库文件与用法示例
2017/03/18 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
JQuery中关于jquery.js与jquery.min.js的比较探讨
2013/05/15 Javascript
使用原生JS实现弹出层特效
2014/12/22 Javascript
jQuery中的pushStack实现原理和应用实例
2015/02/03 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
jQuery动态产生select option下拉列表
2017/03/15 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
vue的状态管理模式vuex
2017/11/30 Javascript
Vue实现日历小插件
2019/06/26 Javascript
[02:41]DOTA2英雄基础教程 冥魂大帝
2014/01/16 DOTA
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
使用IronPython把Python脚本集成到.NET程序中的教程
2015/03/31 Python
Python使用shelve模块实现简单数据存储的方法
2015/05/20 Python
在Python中使用sort()方法进行排序的简单教程
2015/05/21 Python
python基础入门学习笔记(Python环境搭建)
2016/01/13 Python
Python操作Access数据库基本步骤分析
2016/09/19 Python
Python爬虫天气预报实例详解(小白入门)
2018/01/24 Python
python unittest实现api自动化测试
2018/04/04 Python
Python中super函数用法实例分析
2019/03/18 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
jenkins+python自动化测试持续集成教程
2020/05/12 Python
Pycharm中配置远程Docker运行环境的教程图解
2020/06/11 Python
使用CSS实现阅读进度条
2017/02/27 HTML / CSS
QQ空间主人寄语大全
2014/04/12 职场文书
中学生期中自我鉴定
2014/04/20 职场文书
励志演讲稿大全
2014/08/21 职场文书
公司总经理岗位职责
2015/04/01 职场文书
CI Games宣布《堕落之王2》使用虚幻引擎5制作 预计将于2023年正式发售
2022/04/11 其他游戏