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 相关文章推荐
Python3使用PyQt5制作简单的画板/手写板实例
Oct 19 Python
Python基础练习之用户登录实现代码分享
Nov 08 Python
OpenCV-Python实现轮廓检测实例分析
Jan 05 Python
python3爬取数据至mysql的方法
Jun 26 Python
Python制作exe文件简单流程
Jan 24 Python
使用python绘制二元函数图像的实例
Feb 12 Python
对python借助百度云API对评论进行观点抽取的方法详解
Feb 21 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
python如何使用socketserver模块实现并发聊天
Dec 14 Python
Python中有几个关键字
Jun 04 Python
学习Python爬虫的几点建议
Aug 05 Python
python 经纬度求两点距离、三点面积操作
Jun 03 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
推荐一篇入门级的Class文章
2007/03/19 PHP
PHP使用range协议实现输出文件断点续传代码实例
2014/07/04 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
jqGrid增加时--判断开始日期与结束日期(实例解析)
2013/11/08 Javascript
创建自己的jquery表格插件
2015/11/25 Javascript
javascript实现简单加载随机色方块
2015/12/25 Javascript
JS组件系列之Bootstrap table表格组件神器【二、父子表和行列调序】
2016/05/10 Javascript
Easyui笔记2:实现datagrid多行删除的示例代码
2017/01/14 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
vue Element-ui input 远程搜索与修改建议显示模版的示例代码
2017/10/19 Javascript
详解vue 单页应用(spa)前端路由实现原理
2018/04/04 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
JS代码屏蔽F12,右键,粘贴,复制,剪切,选中,操作实例
2019/09/17 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
2020/05/27 Javascript
[04:45]上海特级锦标赛主赛事第三日TOP10
2016/03/05 DOTA
Python实现在线程里运行scrapy的方法
2015/04/07 Python
Python黑魔法Descriptor描述符的实例解析
2016/06/02 Python
深入浅析Python2.x和3.x版本的主要区别
2018/11/30 Python
简单了解django索引的相关知识
2019/07/17 Python
安装python及pycharm的教程图解
2019/10/10 Python
Python实现自定义读写分离代码实例
2019/11/16 Python
python 使用递归实现打印一个数字的每一位示例
2020/02/27 Python
Why do we need Unit test
2013/01/03 面试题
医务工作者先进事迹材料
2014/01/26 职场文书
感恩节红领巾广播稿
2014/02/11 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
2015年八一建军节活动总结
2015/03/20 职场文书
软件项目经理岗位职责
2015/04/01 职场文书
2015党建工作简报
2015/07/21 职场文书
敬老院活动感想
2015/08/07 职场文书
再见,2019我们不负使命;你好,2020我们砥砺前行
2020/01/03 职场文书
解决Django transaction进行事务管理踩过的坑
2021/04/24 Python
Requests什么的通通爬不了的Python超强反爬虫方案!
2021/05/20 Python
基于Python编写一个监控CPU的应用系统
2022/06/25 Python
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL