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每次处理固定个数的字符的方法总结
Jan 29 Python
最大K个数问题的Python版解法总结
Jun 16 Python
微信跳一跳辅助python代码实现
Jan 05 Python
Python Logging 日志记录入门学习
Jun 02 Python
使用PYTHON解析Wireshark的PCAP文件方法
Jul 23 Python
使用 Python 在京东上抢口罩的思路详解
Feb 27 Python
pymysql 插入数据 转义处理方式
Mar 02 Python
python安装dlib库报错问题及解决方法
Mar 16 Python
Python限制内存和CPU使用量的方法(Unix系统适用)
Aug 04 Python
Python random模块的使用示例
Oct 10 Python
jupyter 添加不同内核的操作
Feb 06 Python
Python实现信息轰炸工具(再也不怕说不过别人了)
Jun 11 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_SELF的安全问题
2009/09/05 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
php读取excel文件的简单实例
2013/08/26 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
php中file_get_contents与curl性能比较分析
2014/11/08 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
2017/06/13 PHP
php获取ajax的headers方法与内容实例
2017/12/27 PHP
初窥JQuery(二) 事件机制(1)
2010/11/25 Javascript
在javascript中关于节点内容加强
2013/04/11 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
使用时间戳解决ie缓存的问题
2014/08/20 Javascript
javascript下拉框选项单击事件的例子分享
2015/03/04 Javascript
vue bus全局事件中心简单Demo详解
2018/02/26 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
Vue项目分环境打包的实现步骤
2018/04/02 Javascript
node.js使用redis储存session的方法
2018/09/26 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
swiperjs实现导航与tab页的联动
2020/12/13 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
详解详解Python中writelines()方法的使用
2015/05/25 Python
Python迭代和迭代器详解
2016/11/10 Python
解决python matplotlib imshow无法显示的问题
2018/05/24 Python
Python之循环结构
2019/01/15 Python
Python多线程同步---文件读写控制方法
2019/02/12 Python
python使用pyecharts库画地图数据可视化的实现
2020/03/25 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
运行时异常与一般异常有何异同?
2014/01/05 面试题
八一建军节部队活动方案
2014/02/04 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
2014年干部培训工作总结
2014/12/17 职场文书
女方离婚起诉书
2015/05/18 职场文书
搭讪开场白台词大全
2015/05/28 职场文书
演讲开场白和结束语
2015/05/29 职场文书
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL
java executor包参数处理功能 
2022/02/15 Java/Android