Python 实现微信防撤回功能


Posted in Python onApril 29, 2019

在微信上突然看到“XXX撤回一条消息”的时候,心里痒不痒?现在就教你如何实现消息防撤回的功能。不限手机型号、手机无需root,只要微信号可以登上网页版就可以了(部分不常用和新申请的账号会登不上网页版)。

环境

Centos7 
python2.7
itchat

代码

# coding:utf-8
import itchat
from itchat.content import TEXT
from itchat.content import *
import sys
import time
import re
reload(sys)
sys.setdefaultencoding('utf8')
import os
msg_information = {}
face_bug = None # 针对表情包的内容
@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isFriendChat=True,
   isMpChat=True)
def handle_receive_msg(msg):
 global face_bug
 msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 接受消息的时间
 msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName'] # 在好友列表中查询发送信息的好友昵称
 msg_time = msg['CreateTime'] # 信息发送的时间
 msg_id = msg['MsgId'] # 每条信息的id
 msg_content = None # 储存信息的内容
 msg_share_url = None # 储存分享的链接,比如分享的文章和音乐
 print msg['Type']
 print msg['MsgId']
 if msg['Type'] == 'Text' or msg['Type'] == 'Friends': # 如果发送的消息是文本或者好友推荐
 msg_content = msg['Text']
 print msg_content
 # 如果发送的消息是附件、视屏、图片、语音
 elif msg['Type'] == "Attachment" or msg['Type'] == "Video" \
  or msg['Type'] == 'Picture' \
  or msg['Type'] == 'Recording':
 msg_content = msg['FileName'] # 内容就是他们的文件名
 msg['Text'](str(msg_content)) # 下载文件
 # print msg_content
 elif msg['Type'] == 'Card': # 如果消息是推荐的名片
 msg_content = msg['RecommendInfo']['NickName'] + '的名片' # 内容就是推荐人的昵称和性别
 if msg['RecommendInfo']['Sex'] == 1:
  msg_content += '性别为男'
 else:
  msg_content += '性别为女'
 print msg_content
 elif msg['Type'] == 'Map': # 如果消息为分享的位置信息
 x, y, location = re.search(
  "<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)
 if location is None:
  msg_content = r"纬度->" + x.__str__() + " 经度->" + y.__str__() # 内容为详细的地址
 else:
  msg_content = r"" + location
 elif msg['Type'] == 'Sharing': # 如果消息为分享的音乐或者文章,详细的内容为文章的标题或者是分享的名字
 msg_content = msg['Text']
 msg_share_url = msg['Url'] # 记录分享的url
 print msg_share_url
 face_bug = msg_content
 ##将信息存储在字典中,每一个msg_id对应一条信息
 msg_information.update(
 {
  msg_id: {
  "msg_from": msg_from, "msg_time": msg_time, "msg_time_rec": msg_time_rec,
  "msg_type": msg["Type"],
  "msg_content": msg_content, "msg_share_url": msg_share_url
  }
 }
 )
##这个是用于监听是否有friend消息撤回
@itchat.msg_register(NOTE, isFriendChat=True, isGroupChat=True, isMpChat=True)
def information(msg):
 # 这里如果这里的msg['Content']中包含消息撤回和id,就执行下面的语句
 if '撤回了一条消息' in msg['Content']:
 old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1) # 在返回的content查找撤回的消息的id
 old_msg = msg_information.get(old_msg_id) # 得到消息
 print old_msg
 if len(old_msg_id) < 11: # 如果发送的是表情包
  itchat.send_file(face_bug, toUserName='filehelper')
 else: # 发送撤回的提示给文件助手
  msg_body = "【" \
   + old_msg.get('msg_from') + " 撤回了 】\n" \
   + old_msg.get("msg_type") + " 消息:" + "\n" \
   + old_msg.get('msg_time_rec') + "\n" \
   + r"" + old_msg.get('msg_content')
  # 如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手
  if old_msg['msg_type'] == "Sharing":
  msg_body += "\n就是这个链接➣ " + old_msg.get('msg_share_url')
  # 将撤回消息发送到文件助手
  itchat.send_msg(msg_body, toUserName='filehelper')
  # 有文件的话也要将文件发送回去
  if old_msg["msg_type"] == "Picture" \
   or old_msg["msg_type"] == "Recording" \
   or old_msg["msg_type"] == "Video" \
   or old_msg["msg_type"] == "Attachment":
  file = '@fil@%s' % (old_msg['msg_content'])
  itchat.send(msg=file, toUserName='filehelper')
  os.remove(old_msg['msg_content'])
  # 删除字典旧消息
  msg_information.pop(old_msg_id)
@itchat.msg_register([TEXT, PICTURE, FRIENDS, CARD, MAP, SHARING, RECORDING, ATTACHMENT, VIDEO], isGroupChat=True)
def handle_receive_msg(msg):
 global face_bug
 msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) # 接受消息的时间
 # groupid = msg['FromUserName']
 # chatroom = itchat.search_chatrooms(userName=groupid)
 msg_Actual_from = msg['ActualNickName']
 # msg_Actual_from = msg['User']
 # msg_from = msg_Actual_from['Self']['NickName']
 msg_from = msg_Actual_from
 msg_time = msg['CreateTime'] # 信息发送的时间
 msg_id = msg['MsgId'] # 每条信息的id
 msg_content = None # 储存信息的内容
 msg_share_url = None # 储存分享的链接,比如分享的文章和音乐
 print msg['Type']
 print msg['MsgId']
 if msg['Type'] == 'Text' or msg['Type'] == 'Friends': # 如果发送的消息是文本或者好友推荐
 msg_content = msg['Text']
 print msg_content
 # 如果发送的消息是附件、视屏、图片、语音
 elif msg['Type'] == "Attachment" or msg['Type'] == "Video" \
  or msg['Type'] == 'Picture' \
  or msg['Type'] == 'Recording':
 msg_content = msg['FileName'] # 内容就是他们的文件名
 msg['Text'](str(msg_content)) # 下载文件
 # print msg_content
 elif msg['Type'] == 'Card': # 如果消息是推荐的名片
 msg_content = msg['RecommendInfo']['NickName'] + '的名片' # 内容就是推荐人的昵称和性别
 if msg['RecommendInfo']['Sex'] == 1:
  msg_content += '性别为男'
 else:
  msg_content += '性别为女'
 print msg_content
 elif msg['Type'] == 'Map': # 如果消息为分享的位置信息
 x, y, location = re.search(
  "<location x=\"(.*?)\" y=\"(.*?)\".*label=\"(.*?)\".*", msg['OriContent']).group(1, 2, 3)
 if location is None:
  msg_content = r"纬度->" + x.__str__() + " 经度->" + y.__str__() # 内容为详细的地址
 else:
  msg_content = r"" + location
 elif msg['Type'] == 'Sharing': # 如果消息为分享的音乐或者文章,详细的内容为文章的标题或者是分享的名字
 msg_content = msg['Text']
 msg_share_url = msg['Url'] # 记录分享的url
 print msg_share_url
 face_bug = msg_content
 ##将信息存储在字典中,每一个msg_id对应一条信息
 msg_information.update(
 {
  msg_id: {
  "msg_from": msg_from, "msg_time": msg_time, "msg_time_rec": msg_time_rec,
  "msg_type": msg["Type"],
  "msg_content": msg_content, "msg_share_url": msg_share_url
  }
 }
 )
##这个是用于监听是否有Group消息撤回
@itchat.msg_register(NOTE, isGroupChat=True, isMpChat=True)
def information(msg):
 # 这里如果这里的msg['Content']中包含消息撤回和id,就执行下面的语句
 if '撤回了一条消息' in msg['Content']:
 old_msg_id = re.search("\<msgid\>(.*?)\<\/msgid\>", msg['Content']).group(1) # 在返回的content查找撤回的消息的id
 old_msg = msg_information.get(old_msg_id) # 得到消息
 print old_msg
 if len(old_msg_id) < 11: # 如果发送的是表情包
  itchat.send_file(face_bug, toUserName='filehelper')
 else: # 发送撤回的提示给文件助手
  msg_body = "【" \
   + old_msg.get('msg_from') + " 群消息撤回提醒】\n" \
   + " 撤回了 " + old_msg.get("msg_type") + " 消息:" + "\n" \
   + old_msg.get('msg_time_rec') + "\n" \
   + r"" + old_msg.get('msg_content')
  # 如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手
  if old_msg['msg_type'] == "Sharing":
  msg_body += "\n就是这个链接➣ " + old_msg.get('msg_share_url')
  # 将撤回消息发送到文件助手
  itchat.send_msg(msg_body, toUserName='filehelper')
  # 有文件的话也要将文件发送回去
  if old_msg["msg_type"] == "Picture" \
   or old_msg["msg_type"] == "Recording" \
   or old_msg["msg_type"] == "Video" \
   or old_msg["msg_type"] == "Attachment":
  file = '@fil@%s' % (old_msg['msg_content'])
  itchat.send(msg=file, toUserName='filehelper')
  os.remove(old_msg['msg_content'])
  # 删除字典旧消息
  msg_information.pop(old_msg_id)
# Main (enableCmdQr = True 时,将会生成二维码图片,如 =2 时二维码乱码的话 改为1 即可
itchat.auto_login(enableCmdQR=2, hotReload=True) 
itchat.run()

如果想看懂代码的话,在有python一点基础的前提下搞懂 Python 中的 装饰器  概念。下面是用到itchat中主要的一段代码

def msg_register(self, msgType, isFriendChat=False, isGroupChat=False, isMpChat=False):
 ''' a decorator constructor
 return a specific decorator based on information given '''
 if not (isinstance(msgType, list) or isinstance(msgType, tuple)):
 msgType = [msgType]
 def _msg_register(fn):
 for _msgType in msgType:
  if isFriendChat:
  self.functionDict['FriendChat'][_msgType] = fn
  if isGroupChat:
  self.functionDict['GroupChat'][_msgType] = fn
  if isMpChat:
  self.functionDict['MpChat'][_msgType] = fn
  if not any((isFriendChat, isGroupChat, isMpChat)):
  self.functionDict['FriendChat'][_msgType] = fn
 return fn
 return _msg_register

运行

1.连接云服务器,安装pip 

Python 实现微信防撤回功能

2.使用pip 安装 itchat库 (一个利用微信网页版api接口写的,有兴趣的话可以鼓捣鼓捣)

Python 实现微信防撤回功能

3.将脚本文件上传到云服务器

Python 实现微信防撤回功能

4.运行代码

1)扫码登录

Python 实现微信防撤回功能

2)登录成功

Python 实现微信防撤回功能

效果

发送消息 

Python 实现微信防撤回功能 

收到消息 

Python 实现微信防撤回功能 

开始撤回 

 Python 实现微信防撤回功能 

撤回通知

Python 实现微信防撤回功能

总结

以上所述是小编给大家介绍的Python 实现微信防撤回功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python实现爬虫统计学校BBS男女比例之数据处理(三)
Dec 31 Python
python如何获取服务器硬件信息
May 11 Python
python实现xlsx文件分析详解
Jan 02 Python
python如何在循环引用中管理内存
Mar 20 Python
Django基于ORM操作数据库的方法详解
Mar 27 Python
widows下安装pycurl并利用pycurl请求https地址的方法
Oct 15 Python
pycharm+PyQt5+python最新开发环境配置(踩坑)
Feb 11 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
在python中利用dict转json按输入顺序输出内容方式
Feb 27 Python
Python面向对象程序设计之私有变量,私有方法原理与用法分析
Mar 23 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
python程序控制NAO机器人行走
Apr 29 #Python
Django web框架使用url path name详解
Apr 29 #Python
Python对HTML转义字符进行反转义的实现方法
Apr 28 #Python
Django使用redis缓存服务器的实现代码示例
Apr 28 #Python
django的settings中设置中文支持的实现
Apr 28 #Python
Django数据库类库MySQLdb使用详解
Apr 28 #Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
Apr 28 #Python
You might like
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
Laravel (Lumen) 解决JWT-Auth刷新token的问题
2019/10/24 PHP
基于Jquery的动态创建DOM元素的代码
2010/12/28 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
JQUERY表单暂存功能插件分享
2016/02/23 Javascript
浅谈React中组件间抽象
2018/01/27 Javascript
vue实现循环切换动画
2018/10/17 Javascript
微信小程序实现留言板
2018/10/31 Javascript
30分钟精通React今年最劲爆的新特性——React Hooks
2019/03/11 Javascript
vue 添加和编辑用同一个表单,el-form表单提交后清空表单数据操作
2020/08/03 Javascript
python将多个文本文件合并为一个文本的代码(便于搜索)
2011/03/13 Python
pandas把dataframe转成Series,改变列中值的类型方法
2018/04/10 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
一篇文章了解Python中常见的序列化操作
2019/06/20 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
使用Python在Windows下获取USB PID&amp;VID的方法
2019/07/02 Python
python如何给字典的键对应的值为字典项的字典赋值
2019/07/05 Python
python实现证件照换底功能
2019/08/20 Python
安装PyInstaller失败问题解决
2019/12/14 Python
Python tkinter三种布局实例详解
2020/01/06 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Python使用docx模块实现刷题功能代码
2020/02/13 Python
keras中的History对象用法
2020/06/19 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
css3学习系列之移动属性详解
2017/07/04 HTML / CSS
什么是类的返射机制
2016/02/06 面试题
华为python面试题
2016/05/03 面试题
讲文明树新风公益广告宣传方案
2014/02/25 职场文书
入党自我鉴定
2014/03/25 职场文书
文明美德伴我成长演讲稿
2014/05/12 职场文书
工程部部长岗位职责
2015/02/12 职场文书
应收账款管理制度
2015/08/06 职场文书
新西兰:最新留学学习计划书写作指南
2019/07/15 职场文书
MongoDB 常用的crud操作语句
2021/06/20 MongoDB
源码安装apache脚本部署过程详解
2022/09/23 Servers