python使用wxpy轻松实现微信防撤回的方法


Posted in Python onFebruary 21, 2019

最近比较闲就随便瞎看,看到了微信防撤回就顺便跟着学着实现一下

使用的是wxpy,安装方法pip install wxpy(我使用的是python2.7),这样实现起来比较快,反正也只是练手

首现看了两个别人实现的代码,然后看了看wxpy的文档:http://wxpy.readthedocs.io/zh/latest/utils.html(萌新,顺便锻炼下看文档)

我实现的代码:

import wxpy
import re
 
# 实例化微信对象
bot = wxpy.Bot(cache_path=True)
 
# 启用puid 并指定puid所需映射数据保存的路径
bot.enable_puid(path='wxpy_puid.pkl')
 
# 用于存放每个用户最近发送的消息
msgs = dict()
 
# 信息的类型
msg_types = {
 'Text': '文本',
 'Map': '位置',
 'Picture': '图片',
 'Video': '视频',
 'Attachment': '文件',
 'Sharing': '分享',
 'Card': '名片',
 'Recording': '语音',
}
 
 
@bot.register()
def handle_receive_msg(msg):
 """
 监听消息
 :param msg: 接收到的消息
 :return:
 """
 # 原信息数据
 raw = msg.raw
 
 # 如果消息的状态码是4 即撤回消息
 if raw.get('Status') == 4:
  # 如果是群消息
  if isinstance(msg.chat, wxpy.api.chats.group.Group):
   # 获取群成员的puid
   puid = msg.member.puid
   # 获取发送者的昵称
   name = msg.member.nick_name
  # 如果是好友消息
  elif isinstance(msg.chat, wxpy.api.chats.friend.Friend):
   # 获取好友的puid
   puid = msg.chat.puid
   # 获取好友的昵称
   name = msg.chat.nick_name
  else:
   puid = None
   name = None
  if puid:
   # 被撤回消息的msgid的匹配规则
   msg_id_regex = re.compile('<msgid>(\d+)</msgid>')
   # 获取被撤回消息的msgid
   old_msg_id = msg_id_regex.findall(raw.get('Content'))[0]
   # 获取该发送者的最后5次的消息记录
   chat_msgs = msgs.get(puid)
   # 遍历消息记录
   for chat_msg in chat_msgs[::-1]:
    # 跳过不是被撤回的信息
    if str(chat_msg.id) != old_msg_id:
     continue
    chat = chat_msg.chat
    # 如果被撤回的信息是文本信息
    if chat_msg.type == "Text":
     # 如果消息长度过长 则不予处理
     if len(chat_msg.text) >= 150:
      warning = "【您撤回的消息过长,有炸群嫌疑,不予处理!!!】"
      bot.file_helper.send('%s撤回了一条文本消息--【%s】'.decode('utf-8') % (name, warning))
      break
     # 将此消息转发出来
     chat_msg.forward(chat, prefix='%s撤回了一条文本消息,消息内容为:'.decode('utf-8') % name)
    # 如果被撤回的是位置信息
    elif chat_msg.type == "Map":
     # 位置信息的匹配规则
     map_regex = re.compile(r'label="(.+?)"')
     # 获取位置信息中的位置
     map = map_regex.findall(chat_msg.raw.get("OriContent"))[0]
     # 将位置信息发出来
     msg.reply('%s撤回了一条位置消息,位置信息为:【%s】'.decode('utf-8') % (name, map))
    else:
     # 获取信息的类型
     msg_type = msg_types.get(chat_msg.type).decode('utf-8')
     # 将信息转发出来
     chat_msg.forward(chat, prefix='%s撤回了一条%s消息, 消息内容为:'.decode('utf-8') % (name, msg_type))
    break
 else:
  # 如果是群消息
  if isinstance(msg.chat, wxpy.api.chats.group.Group):
   # 获取群成员的puid
   puid = msg.member.puid
  # 如果是好友消息
  elif isinstance(msg.chat, wxpy.api.chats.friend.Friend):
   # 获取好友的puid
   puid = msg.chat.puid
  else:
   puid = None
  if puid:
   # 记录消息
   msgs.setdefault(puid, []).append(msg)
   # 截取消息 保留最大5条记录
   msgs[puid] = msg[puid][-5:]
 
# 使机器人后台运行,并进入交互模式
wxpy.embed()

也未做过多的测试和优化,测试了文本、图片、语音、位置信息,视频、名片、分享、文件消息未做测试

ps:这里语音消息撤回后发出来的是语音文件,位置信息发出来的是地址的文本

======================割======================

如果想要添加聊天机器人 可以加入:

# 指定一个好友
friend = bot.friends().search('您对朋友的备注')
# 指定一个群
group = bot.groups().search('群名')
 
# 实例化图灵机器人 免费申请图灵机器人: http://www.tuling123.com/
tu_ling = wxpy.Tuling(api_key="自行注册")
# chats指定对哪些用户起作用, 如果chats=None(默认值)对所有用户起作用
@bot.register(chats=[friend, group]) 
def reply_msg(msg):
 """
 自动回复消息
 :param msg: 接收到的信息数据
 :return: 回复文本
 """
 # do_reply会自动回复消息并返回消息文本
 tu_ling.do_reply(msg)

以上这篇python使用wxpy轻松实现微信防撤回的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中Matplotlib实现绘制3D图的示例代码
Sep 04 Python
Python logging管理不同级别log打印和存储实例
Jan 19 Python
python 识别图片中的文字信息方法
May 10 Python
Python3.5文件读与写操作经典实例详解
May 01 Python
python matplotlib库绘制散点图例题解析
Aug 10 Python
Python3简单爬虫抓取网页图片代码实例
Aug 26 Python
Python列表倒序输出及其效率详解
Mar 04 Python
python调用API接口实现登陆短信验证
May 10 Python
python安装和pycharm环境搭建设置方法
May 27 Python
Python fileinput模块如何逐行读取多个文件
Oct 05 Python
解决pytorch 损失函数中输入输出不匹配的问题
Jun 05 Python
Python+腾讯云服务器实现每日自动健康打卡
Dec 06 Python
Python开发网站目录扫描器的实现
Feb 21 #Python
Python爬虫之UserAgent的使用实例
Feb 21 #Python
利用python实现在微信群刷屏的方法
Feb 21 #Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
Feb 21 #Python
使用python itchat包爬取微信好友头像形成矩形头像集的方法
Feb 21 #Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 #Python
用python实现刷点击率的示例代码
Feb 21 #Python
You might like
【星际争霸1】人族1v7家ZBath
2020/03/04 星际争霸
PHP 页面编码声明方法详解(header或meta)
2010/03/12 PHP
PHP flush()与ob_flush()的区别详解
2013/06/03 PHP
PHP中soap的用法实例
2014/10/24 PHP
CentOS安装php v8js教程
2015/02/26 PHP
Javascript 刷新全集常用代码
2009/11/22 Javascript
JavaScript 轻松搞定快捷留言功能 只需一行代码
2010/04/01 Javascript
用jQuery模拟select下拉框的简单示例代码
2014/01/26 Javascript
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
js根据鼠标移动速度背景图片自动旋转的方法
2015/02/28 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
基于canvas实现的钟摆效果完整实例
2016/01/26 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
jQuery+CSS实现的table表格行列转置功能示例
2018/01/08 jQuery
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
Node.js 路由的实现方法
2019/06/05 Javascript
JavaScript创建、读取和删除cookie
2019/09/03 Javascript
用Python计算三角函数之acos()方法的使用
2015/05/15 Python
python生成验证码图片代码分享
2016/01/28 Python
Python字符串切片操作知识详解
2016/03/28 Python
pandas 选取行和列数据的方法详解
2019/08/08 Python
python中sort和sorted排序的实例方法
2019/08/26 Python
Python字符串格式化f-string多种功能实现
2020/05/07 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
学生会个人自荐书范文
2014/02/12 职场文书
党员岗位承诺口号大全
2014/03/28 职场文书
公司担保书范文
2014/05/21 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
判缓刑人员个人思想汇报
2014/10/10 职场文书
党员思想汇报材料
2014/12/19 职场文书
万能密码的SQL注入漏洞其PHP环境搭建及防御手段
2021/09/04 SQL Server
Python echarts实现数据可视化实例详解
2022/03/03 Python
Python中的 Set 与 dict
2022/03/13 Python