Python实现微信中找回好友、群聊用户撤回的消息功能示例


Posted in Python onAugust 23, 2019

本文实例讲述了Python实现微信中找回好友、群聊用户撤回的消息功能。分享给大家供大家参考,具体如下:

还在好奇好友撤回了什么消息吗?群里撤回了什么消息?下面的代码实现了:即使群、好友撤回了文本消息、表情、图片等消息,自己也能知道撤回的什么。

#coding=utf-8
import itchat
from itchat.content import TEXT
from itchat.content import *
import sys
import time
import re
import os
msg_information = {}
face_bug=None #针对表情包的内容
@itchat.msg_register([TEXT,PICTURE,FRIENDS,CARD,MAP,SHARING,RECORDING,ATTACHMENT,VIDEO],isFriendChat=True,isGroupChat=True)
def receive_msg(msg):
  global face_bug
  msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #接收消息的时间
  if 'ActualNickName' in msg:
    from_user = msg['ActualUserName'] #群消息的发送者,用户的唯一标识
    msg_from = msg['ActualNickName']#发送者群内的昵称
    friends = itchat.get_friends(update=True)#获取所有好友
    for f in friends:
      if from_user == f['UserName']: #如果群消息是好友发的
        if f['RemarkName']: # 优先使用好友的备注名称,没有则使用昵称
          msg_from = f['RemarkName']
        else:
          msg_from = f['NickName']
        break
    groups = itchat.get_chatrooms(update=True)#获取所有的群
    for g in groups:
      if msg['FromUserName'] == g['UserName']:#根据群消息的FromUserName匹配是哪个群
        group_name = g['NickName']
        group_menbers = g['MemberCount']
        break
    group_name = group_name + "(" + str(group_menbers) +")"
  else:
    if itchat.search_friends(userName=msg['FromUserName'])['RemarkName']:#优先使用备注名称
      msg_from = itchat.search_friends(userName=msg['FromUserName'])['RemarkName']
    else:
      msg_from = itchat.search_friends(userName=msg['FromUserName'])['NickName'] #在好友列表中查询发送信息的好友昵称
    group_name = ""
  msg_time = msg['CreateTime'] #信息发送的时间
  msg_id = msg['MsgId']  #每条信息的id
  msg_content = None   #储存信息的内容
  msg_share_url = None  #储存分享的链接,比如分享的文章和音乐
  if msg['Type'] == 'Text' or msg['Type'] == 'Friends':   #如果发送的消息是文本或者好友推荐
    msg_content = msg['Text']
  #如果发送的消息是附件、视频、图片、语音
  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))  #下载文件
  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
  face_bug = msg_content
  #将信息存储在字典中,每一个msg_id对应一条信息
  time.sleep(2)
  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_name":group_name
      }
    }
  )
  del_info = []
  for k in msg_information:
    m_time = msg_information[k]['msg_time'] #取得消息时间
    if int(time.time()) - m_time > 130: #如果消息时间是130秒甚至更久之前的,则删除。
      del_info.append(k)
  if del_info:
    for i in del_info:
      msg_information.pop(i)
#监听是否有消息撤回
@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['group_name'] + old_msg['msg_from'] +"\n" + old_msg['msg_time_rec'] \
            + "撤回了:" + "\n" + r"" + old_msg['msg_content']
      #如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手
      if old_msg['msg_type'] == "Sharing":
        msg_body += "\n链接是:" + old_msg.get('msg_share_url')
      #print(msg_body)
      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.auto_login(hotReload=True,enableCmdQR=1)
itchat.run()

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python ZipFile模块详解
Nov 01 Python
跟老齐学Python之有点简约的元组
Sep 24 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
python+pillow绘制矩阵盖尔圆简单实例
Jan 16 Python
Python django使用多进程连接mysql错误的解决方法
Oct 08 Python
详解python中init方法和随机数方法
Mar 13 Python
基于Python生成个性二维码过程详解
Mar 05 Python
Python函数基本使用原理详解
Mar 19 Python
Python 跨.py文件调用自定义函数说明
Jun 01 Python
浅谈Python 函数式编程
Jun 20 Python
解决使用Pandas 读取超过65536行的Excel文件问题
Nov 10 Python
使用Pytorch实现two-head(多输出)模型的操作
May 28 Python
详解Matplotlib绘图之属性设置
Aug 23 #Python
python3.6生成器yield用法实例分析
Aug 23 #Python
python基础 range的用法解析
Aug 23 #Python
Django 导出项目依赖库到 requirements.txt过程解析
Aug 23 #Python
Django接收自定义http header过程详解
Aug 23 #Python
Python 处理文件的几种方式
Aug 23 #Python
python 数据生成excel导出(xlwt,wlsxwrite)代码实例
Aug 23 #Python
You might like
php实现设计模式中的单例模式详解
2014/10/11 PHP
PHP缩略图生成和图片水印制作
2017/01/07 PHP
Yii2.0多文件上传实例说明
2017/07/24 PHP
WHOOPS PHP调试库的使用
2017/09/29 PHP
php+ajax实现文件切割上传功能示例
2020/03/03 PHP
Jquery图片滚动与幻灯片的实例代码
2013/04/08 Javascript
简单的JavaScript互斥锁分享
2014/02/02 Javascript
在windows上用nodejs搭建静态文件服务器的简单方法
2016/08/11 NodeJs
JavaScript注入漏洞的原理及防范(详解)
2016/12/04 Javascript
JavaScript无阻塞加载和defer、async详解
2017/02/26 Javascript
vue加载完成后的回调函数方法
2018/09/07 Javascript
解决微信小程序云开发中获取数据库的内容为空的方法
2019/05/15 Javascript
elementUI table表格动态合并的示例代码
2019/05/15 Javascript
Layui表格行工具事件与数据回填方法
2019/09/13 Javascript
webpack 处理CSS资源的实现
2019/09/27 Javascript
[01:05:56]2018DOTA2亚洲邀请赛3月29日 小组赛A组 Newbee VS VG
2018/03/30 DOTA
python实现bitmap数据结构详解
2014/02/17 Python
星球大战与Python之间的那些事
2016/01/07 Python
http请求 request失败自动重新尝试代码示例
2018/01/25 Python
tensorflow获取变量维度信息
2018/03/10 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
Python Matplotlib库安装与基本作图示例
2019/01/09 Python
Pyqt QImage 与 np array 转换方法
2019/06/27 Python
Pytorch mask_select 函数的用法详解
2020/02/18 Python
matplotlib.pyplot.matshow 矩阵可视化实例
2020/06/16 Python
kmart凯马特官网:美国最大的打折零售商和全球最大的批发商之一
2016/11/17 全球购物
毕业生教师求职信
2013/10/20 职场文书
运动会拉拉队口号
2014/06/09 职场文书
中学生运动会通讯稿大全
2014/09/18 职场文书
政风行风评议个人心得体会
2014/10/29 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
大学生实习介绍信
2015/05/05 职场文书
战友聚会致辞
2015/07/28 职场文书
关于教师节的广播稿
2015/08/19 职场文书
解决Golang中ResponseWriter的一个坑
2021/04/27 Golang
Mysql实现主从配置和多主多从配置
2021/06/02 MySQL