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 相关文章推荐
Python3实现生成随机密码的方法
Aug 23 Python
Django框架中数据的连锁查询和限制返回数据的方法
Jul 17 Python
Python的Flask框架中使用Flask-SQLAlchemy管理数据库的教程
Jun 14 Python
Python中的变量和作用域详解
Jul 13 Python
Python实现的下载网页源码功能示例
Jun 13 Python
Python定时器实例代码
Nov 01 Python
Python3解决棋盘覆盖问题的方法示例
Dec 07 Python
对python的unittest架构公共参数token提取方法详解
Dec 17 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
Sep 10 Python
Python偏函数Partial function使用方法实例详解
Jun 17 Python
matplotlib绘制鼠标的十字光标的实现(自定义方式,官方实例)
Jan 10 Python
关于Python OS模块常用文件/目录函数详解
Jul 01 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学习 字符串课件
2008/06/15 PHP
自定义php类(查找/修改)xml文档
2013/03/26 PHP
PHP+jQuery 注册模块的改进(三):更新到Smarty3.1
2014/10/14 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
PHP设计模式之观察者模式定义与用法示例
2018/08/04 PHP
php使用自带dom扩展进行元素匹配的原理解析
2020/05/29 PHP
屏蔽Flash右键信息的js代码
2010/01/17 Javascript
JavaScript prototype属性使用说明
2010/05/13 Javascript
关于COOKIE个数与大小的问题
2011/01/17 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
JavaScript省市区三级联动菜单效果
2016/09/21 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
JS 验证密码 不能为空,必须含有数字、字母、特殊字符,长度在8-12位
2017/06/21 Javascript
最基础的vue.js双向绑定操作
2017/08/23 Javascript
编写React组件项目实践分析
2018/03/04 Javascript
基于vue.js实现分页查询功能
2018/12/29 Javascript
详解vue-cli3多页应用改造
2019/06/04 Javascript
[56:21]LGD vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Eclipse + Python 的安装与配置流程
2013/03/05 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
Python将多个excel文件合并为一个文件
2018/01/03 Python
pygame实现俄罗斯方块游戏
2018/06/26 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
Python中qutip用法示例详解
2020/10/02 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
python代码实现猜拳小游戏
2020/11/30 Python
美国第一香水网站:Perfume.com
2017/01/23 全球购物
计算机个人求职信范例
2014/01/24 职场文书
七年级历史教学反思
2014/02/05 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
疾病证明书
2015/06/19 职场文书
《坐井观天》教学反思
2016/02/18 职场文书
pytorch中F.avg_pool1d()和F.avg_pool2d()的使用操作
2021/05/22 Python