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之wxPython应用实例
Sep 28 Python
Windows下Python使用Pandas模块操作Excel文件的教程
May 31 Python
Python 性能优化技巧总结
Nov 01 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
Apr 11 Python
深入理解python中的select模块
Apr 23 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
python dumps和loads区别详解
Feb 04 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
python3实现无权最短路径的方法
May 12 Python
教你怎么用python selenium实现自动化测试
May 27 Python
OpenCV-Python实现油画效果的实例
Jun 08 Python
python图像处理 PIL Image操作实例
Apr 09 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开发环境配置(MySQL数据库安装图文教程)
2010/04/28 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
laravel创建类似ThinPHP中functions.php的全局函数
2016/11/26 PHP
CL vs ForZe BO5 第三场 2.13
2021/03/10 DOTA
破除网页鼠标右键被禁用的绝招大全
2006/12/27 Javascript
用javascript实现画板的代码
2007/09/05 Javascript
JavaScript开发时的五个注意事项
2007/12/08 Javascript
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
利用毫秒减值计算时长的js代码
2013/09/22 Javascript
jQuery实现简单的图片查看器
2020/09/11 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
2015/12/31 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
微信小程序网络请求wx.request详解及实例
2017/05/18 Javascript
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
python持久性管理pickle模块详细介绍
2015/02/18 Python
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
Python去除、替换字符串空格的处理方法
2018/04/01 Python
Python+selenium实现自动循环扔QQ邮箱漂流瓶
2018/05/29 Python
django之使用celery-把耗时程序放到celery里面执行的方法
2019/07/12 Python
在PyTorch中Tensor的查找和筛选例子
2019/08/18 Python
Python zip函数打包元素实例解析
2019/12/11 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
python使用matplotlib:subplot绘制多个子图的示例
2020/09/24 Python
python Scrapy框架原理解析
2021/01/04 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
丝芙兰法国官网:SEPHORA法国
2016/09/01 全球购物
超市业务员岗位职责
2013/12/05 职场文书
护士自荐信范文
2013/12/15 职场文书
微型企业创业投资计划书
2014/01/10 职场文书
党的群众路线教育实践活动学习心得体会
2014/03/03 职场文书
春节联欢会主持词
2014/03/24 职场文书
幼儿发展评估方案
2014/06/11 职场文书
面试通知单大全
2015/04/20 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL