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避免死锁方法实例分析
Jun 04 Python
python socket多线程通讯实例分析(聊天室)
Apr 06 Python
Python线性方程组求解运算示例
Jan 17 Python
Numpy array数据的增、删、改、查实例
Jun 04 Python
浅谈Python中的全局锁(GIL)问题
Jan 11 Python
pytorch GAN生成对抗网络实例
Jan 10 Python
简单了解Python write writelines区别
Feb 27 Python
Anaconda配置pytorch-gpu虚拟环境的图文教程
Apr 16 Python
python怎么判断素数
Jul 01 Python
Python实现手绘图效果实例分享
Jul 22 Python
python实现单机五子棋
Aug 28 Python
Python selenium绕过webdriver监测执行javascript
Apr 12 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比较相似字符串的方法
2015/06/05 PHP
php curl优化下载微信头像的方法总结
2018/09/07 PHP
PHP的mysqli_stmt_init()函数讲解
2019/01/24 PHP
js获取图片大小的函数代码
2011/09/20 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
JS实现窗口加载时模拟鼠标移动的方法
2015/06/03 Javascript
jquery带翻页动画的电子杂志代码分享
2015/08/21 Javascript
每天一篇javascript学习小结(String对象)
2015/11/18 Javascript
Bootstrap的class样式小结
2016/12/01 Javascript
jQuery导航条固定定位效果实例代码
2017/05/26 jQuery
基于JavaScript实现幸运抽奖页面
2020/07/05 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
vue数据操作之点击事件实现num加减功能示例
2019/01/19 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
JS实现判断数组是否包含某个元素示例
2019/05/24 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
javascript设计模式 ? 命令模式原理与用法实例分析
2020/04/20 Javascript
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
使用numpy和PIL进行简单的图像处理方法
2018/07/02 Python
对Python 多线程统计所有csv文件的行数方法详解
2019/02/12 Python
超实用的 30 段 Python 案例
2019/10/10 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python2与Python3的区别点整理
2019/12/12 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
python数据预处理 :数据共线性处理详解
2020/02/24 Python
英国最大的运动营养公司之一:LA Muscle
2018/07/02 全球购物
Hawes & Curtis官网:英国经典品牌
2019/07/27 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
如何拷贝一整个Java对象,包括它的状态
2013/12/27 面试题
生产副总岗位职责
2013/11/28 职场文书
给老婆大人的检讨书
2014/02/24 职场文书
安全环保标语
2014/06/09 职场文书
竞选班长演讲稿400字
2014/08/22 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
保送生自荐信
2015/03/06 职场文书
Linux磁盘管理方法介绍
2022/06/01 Servers