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深入学习之装饰器
Aug 31 Python
Python中使用dom模块生成XML文件示例
Apr 05 Python
Python2.x版本中cmp()方法的使用教程
May 14 Python
简单介绍Python中的decode()方法的使用
May 18 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
pygame游戏之旅 调用按钮实现游戏开始功能
Nov 21 Python
Python实现的在特定目录下导入模块功能分析
Feb 11 Python
Python程序包的构建和发布过程示例详解
Jun 09 Python
利用Python复制文件的9种方法总结
Sep 02 Python
Python生成随机验证码代码实例解析
Jun 09 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
Python利用命名空间解析XML文档
Aug 10 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
PHP IN_ARRAY 函数使用注意事项
2010/07/24 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
解读PHP中上传文件的处理问题
2016/05/29 PHP
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
javascript+xml实现简单图片轮换(只支持IE)
2012/12/23 Javascript
Javascript基础教程之定义和调用函数
2015/01/18 Javascript
深入理解JavaScript系列(22):S.O.L.I.D五大原则之依赖倒置原则DIP详解
2015/03/05 Javascript
使用jquery动态加载Js文件和Css文件
2015/10/24 Javascript
详解JavaScript编程中的数组结构
2015/10/24 Javascript
JavaScript Date对象详解
2016/03/01 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
Vue.js系列之项目结构说明(2)
2017/01/03 Javascript
JS实现AES加密并与PHP互通的方法分析
2017/04/19 Javascript
浅谈vue中使用图片懒加载vue-lazyload插件详细指南
2017/10/23 Javascript
微信小程序如何获取用户信息
2018/01/26 Javascript
vue2中,根据list的id进入对应的详情页并修改title方法
2018/08/24 Javascript
jQuery三组基本动画与自定义动画操作实例总结
2020/05/09 jQuery
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
Vue清除定时器setInterval优化方案分享
2020/07/21 Javascript
Python 爬虫多线程详解及实例代码
2016/10/08 Python
Python使用遗传算法解决最大流问题
2018/01/29 Python
python3 对list中每个元素进行处理的方法
2018/06/29 Python
Python Django Vue 项目创建过程详解
2019/07/29 Python
基于python框架Scrapy爬取自己的博客内容过程详解
2019/08/05 Python
Python高级编程之继承问题详解(super与mro)
2019/11/19 Python
Tensorflow获取张量Tensor的具体维数实例
2020/01/19 Python
logging level级别介绍
2020/02/21 Python
前后端结合实现amazeUI分页效果
2020/08/21 HTML / CSS
彪马美国官网:PUMA美国
2017/03/09 全球购物
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
影视动画专业个人的自我评价
2013/12/31 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
社区反邪教工作方案
2014/06/16 职场文书
2014最新毕业证代领委托书
2014/09/26 职场文书
2015年挂职干部工作总结
2015/05/14 职场文书
python数字图像处理之图像的批量处理
2022/06/28 Python