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 with语句上下文管理器两种实现方法分析
Feb 09 Python
Python数据结构之图的应用示例
May 11 Python
Python简单实现网页内容抓取功能示例
Jun 07 Python
python ftp 按目录结构上传下载的实现代码
Sep 12 Python
python实现按关键字筛选日志文件
Dec 24 Python
使用pytorch完成kaggle猫狗图像识别方式
Jan 10 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
python matplotlib.pyplot.plot()参数用法
Apr 14 Python
Python3实现个位数字和十位数字对调, 其乘积不变
May 03 Python
Python sklearn中的.fit与.predict的用法说明
Jun 28 Python
Pytorch1.5.1版本安装的方法步骤
Dec 31 Python
Python绘制词云图之可视化神器pyecharts的方法
Feb 23 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中基本符号及使用方法
2010/03/23 PHP
Notice: Trying to get property of non-object problem(PHP)解决办法
2012/03/11 PHP
PHP获取当前页面完整URL的实现代码
2013/06/10 PHP
用PHP代替JS玩转DOM的思路及示例代码
2014/06/15 PHP
php实现过滤字符串中的中文和数字实例
2015/07/29 PHP
php的常量和变量实例详解
2017/06/27 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
nodejs 实现模拟form表单上传文件
2014/07/14 NodeJs
JavaScript实现列表分页功能特效
2015/05/15 Javascript
实例讲解js验证表单项是否为空的方法
2016/01/09 Javascript
基于jQuery实现带动画效果超炫酷的弹出对话框(附源码下载)
2016/02/22 Javascript
Angular2内置指令NgFor和NgIf详解
2016/08/03 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
Vue中render方法的使用详解
2018/01/26 Javascript
浅谈vue中关于checkbox数据绑定v-model指令的个人理解
2018/11/14 Javascript
微信小程序与webview交互实现支付功能
2019/06/07 Javascript
[55:25]2018DOTA2亚洲邀请赛3月29日 小组赛A组 VG VS OG
2018/03/30 DOTA
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
2019/11/01 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
python pprint模块中print()和pprint()两者的区别
2020/02/10 Python
Python执行时间的几种计算方法
2020/07/31 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
美国保健品专家:Life Extension
2018/05/04 全球购物
主管竞聘书范文
2014/03/31 职场文书
生日寄语大全
2014/04/08 职场文书
仓库规划计划书
2014/04/28 职场文书
国际经济与贸易专业求职信
2014/07/10 职场文书
好人好事演讲稿
2014/09/01 职场文书
2014年教研室工作总结
2014/12/06 职场文书
药品销售内勤岗位职责
2015/04/13 职场文书
迁徙的鸟观后感
2015/06/09 职场文书
李强优秀员工观后感
2015/06/16 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书