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 cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
用 Python 连接 MySQL 的几种方式详解
Apr 04 Python
python3实现windows下同名进程监控
Jun 21 Python
Python Dataframe 指定多列去重、求差集的方法
Jul 10 Python
python多线程并发让两个LED同时亮的方法
Feb 18 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
django的分页器Paginator 从django中导入类
Jul 25 Python
简单了解python数组的基本操作
Nov 26 Python
Python timer定时器两种常用方法解析
Jan 20 Python
Python如何使用ElementTree解析xml
Oct 12 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
python实现KNN近邻算法
Dec 30 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
codeigniter数据库操作函数汇总
2014/06/12 PHP
php实现的一个简单json rpc框架实例
2015/03/30 PHP
Yii框架模拟组件调用注入示例
2019/11/11 PHP
js创建一个input数组并绑定click事件的方法
2014/06/12 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
jQuery实现的动态伸缩导航菜单实例
2015/05/07 Javascript
js+html5实现canvas绘制简单矩形的方法
2015/06/05 Javascript
如何在Angular2中使用jQuery及其插件的方法
2017/02/09 Javascript
javascript Function函数理解与实战
2017/12/01 Javascript
微信小程序实现全国机场索引列表
2018/01/31 Javascript
ajax与jsonp的区别及用法
2018/10/16 Javascript
详解React项目如何修改打包地址(编译输出文件地址)
2019/03/21 Javascript
微信小程序第三方框架对比 之 wepy / mpvue / taro
2019/04/10 Javascript
Vue中使用better-scroll实现轮播图组件
2020/03/07 Javascript
JavaScript仿京东秒杀倒计时
2020/03/17 Javascript
python字典基本操作实例分析
2015/07/11 Python
python中异常报错处理方法汇总
2016/11/20 Python
小米5s微信跳一跳小程序python源码
2018/01/08 Python
Pytorch 保存模型生成图片方式
2020/01/10 Python
VS2019+python3.7+opencv4.1+tensorflow1.13配置详解
2020/04/16 Python
python3.7+selenium模拟淘宝登录功能的实现
2020/05/26 Python
PyTorch-GPU加速实例
2020/06/23 Python
在 Windows 下搭建高效的 django 开发环境的详细教程
2020/07/27 Python
css3让div随鼠标移动而抖动起来
2014/02/10 HTML / CSS
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
日期和时间问题
2015/01/04 面试题
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
家长给孩子的表扬信
2014/01/17 职场文书
触摸春天教学反思
2014/02/03 职场文书
病媒生物防治方案
2014/05/13 职场文书
科学发展观活动总结
2014/08/28 职场文书
教师节班会主持词
2015/07/06 职场文书
2016年“我们的节日·清明节”活动总结
2016/04/01 职场文书
docker-compose部署Yapi的方法
2022/04/08 Servers
python模板入门教程之flask Jinja
2022/04/11 Python
MySQL运行报错:“Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre”解决方法
2022/06/14 MySQL