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 相关文章推荐
pycharm 使用心得(四)显示行号
Jun 05 Python
python对字典进行排序实例
Sep 25 Python
pymongo给mongodb创建索引的简单实现方法
May 06 Python
Python堆排序原理与实现方法详解
May 11 Python
python3实现windows下同名进程监控
Jun 21 Python
python感知机实现代码
Jan 18 Python
解决django服务器重启端口被占用的问题
Jul 26 Python
python2爬取百度贴吧指定关键字和图片代码实例
Aug 14 Python
详解Matplotlib绘图之属性设置
Aug 23 Python
python通过SSH登陆linux并操作的实现
Oct 10 Python
详解python算法常用技巧与内置库
Oct 17 Python
PyCharm 解决找不到新打开项目的窗口问题
Jan 15 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中关于codeigniter的xmlrpc的类在进行数据交换时的类型问题
2011/07/03 PHP
PHP有序表查找之二分查找(折半查找)算法示例
2018/02/09 PHP
Yii框架响应组件用法实例分析
2019/09/04 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
JS实现三个层重叠点击互相切换的方法
2015/10/06 Javascript
jquery实现网页的页面平滑滚动效果代码
2015/11/02 Javascript
BootStrap 智能表单实战系列(十)自动完成组件的支持
2016/06/13 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
javascript数据类型详解
2017/02/07 Javascript
JS实现浏览器打印、打印预览示例
2017/02/28 Javascript
nodejs搭建本地服务器并访问文件的方法
2017/03/03 NodeJs
js实现省市级联效果分享
2017/08/10 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
javascript修改浏览器title方法 JS动态修改浏览器标题
2017/11/30 Javascript
详解webpack-dev-server的简单使用
2018/04/02 Javascript
JS实现的JSON序列化操作简单示例
2018/07/02 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
vuex Module将 store 分割成模块的操作
2020/12/07 Vue.js
Python 利用内置set函数对字符串和列表进行去重的方法
2018/06/29 Python
caffe binaryproto 与 npy相互转换的实例讲解
2018/07/09 Python
利用python画出折线图
2018/07/26 Python
Dlib+OpenCV深度学习人脸识别的方法示例
2019/05/14 Python
Python实现队列的方法示例小结【数组,链表】
2020/02/22 Python
Python Pivot table透视表使用方法解析
2020/09/11 Python
境外导游求职信
2014/02/27 职场文书
教职工代表大会主持词
2014/04/01 职场文书
党的群众路线专项整治方案
2014/11/03 职场文书
2016公司年会通知范文
2015/04/25 职场文书
2015年预算员工作总结
2015/05/14 职场文书
劳动争议仲裁代理词
2015/05/25 职场文书
幼儿园小班开学寄语
2015/05/27 职场文书
幼儿园奖惩制度范本
2015/08/05 职场文书
食品安全主题班会
2015/08/13 职场文书
学习型家庭事迹材料(2016精选版)
2016/02/29 职场文书
python3美化表格数据输出结果的实现代码
2021/04/14 Python
MySQL和Oracle批量插入SQL的通用写法示例
2021/11/17 MySQL