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切片用法实例教程
Sep 08 Python
python定时器(Timer)用法简单实例
Jun 04 Python
python中函数默认值使用注意点详解
Jun 01 Python
Python实现删除列表中满足一定条件的元素示例
Jun 12 Python
python实现的二叉树定义与遍历算法实例
Jun 30 Python
mac下如何将python2.7改为python3
Jul 13 Python
利用Pyhton中的requests包进行网页访问测试的方法
Dec 26 Python
python函数声明和调用定义及原理详解
Dec 02 Python
python numpy数组中的复制知识解析
Feb 03 Python
Python3 shutil(高级文件操作模块)实例用法总结
Feb 19 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
python自动化八大定位元素讲解
Jul 09 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
备份mysql数据库的php代码(一个表一个文件)
2010/05/28 PHP
mantis安装、配置和使用中的问题小结
2014/07/14 PHP
帝国cms常用标签汇总
2015/07/06 PHP
制作高质量的JQuery Plugin 插件的方法
2010/04/20 Javascript
jquery应该如何来设置改变按钮input的onclick事件
2012/12/10 Javascript
js验证模型自我实现的具体方法
2013/06/21 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
jquery ajax跨域解决方法(json方式)
2014/02/04 Javascript
javascript面向对象快速入门实例
2015/01/13 Javascript
javascript引用类型指针的工作方式
2015/04/13 Javascript
基于jQuery实现的双11天猫拆红包抽奖效果
2015/12/01 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
2016/05/26 Javascript
js实现精确到秒的倒计时效果
2016/05/29 Javascript
卸载安装Node.js与npm过程详解
2016/08/15 Javascript
Bootstrap按钮功能之查询按钮和重置按钮
2016/10/26 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
微信小程序修改swiper默认指示器样式的实例代码
2018/07/18 Javascript
elementUI 设置input的只读或禁用的方法
2018/10/30 Javascript
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
详解ES6 CLASS在微信小程序中的应用实例
2020/04/24 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
python从ftp下载数据保存实例
2013/11/20 Python
详解Python的Django框架中inclusion_tag的使用
2015/07/21 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
python石头剪刀布小游戏(三局两胜制)
2021/01/20 Python
Python字典生成式、集合生成式、生成器用法实例分析
2020/01/07 Python
谈谈Python:为什么类中的私有属性可以在外部赋值并访问
2020/03/05 Python
python中get和post有什么区别
2020/06/19 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
计划生育证明格式范本
2014/09/12 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
租房协议书范例
2014/10/14 职场文书
2019年销售人员的职业生涯规划书
2019/03/25 职场文书