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中的__new__()方法的使用
Apr 09 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
Python基础学习之常见的内建函数整理
Sep 06 Python
Python实现输出某区间范围内全部素数的方法
May 02 Python
Python中list查询及所需时间计算操作示例
Jun 21 Python
python求解数组中两个字符串的最小距离
Sep 27 Python
python 实现创建文件夹和创建日志文件的方法
Jul 07 Python
python使用原始套接字发送二层包(链路层帧)的方法
Jul 22 Python
python爬虫 爬取58同城上所有城市的租房信息详解
Jul 30 Python
Python ini文件常用操作方法解析
Apr 26 Python
django 连接数据库出现1045错误的解决方式
May 14 Python
python 中的@运算符使用
May 26 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 cli配置文件问题分析
2015/10/15 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
JavaScript中几个重要的属性(this、constructor、prototype)介绍
2013/05/19 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
jQuery Html控件基本操作(日常收集整理)
2016/03/11 Javascript
浅谈jquery的map()和each()方法
2016/06/12 Javascript
原生javascript上传图片带进度条【实例分享】
2017/04/06 Javascript
Node.JS利用PhantomJs抓取网页入门教程
2017/05/19 Javascript
微信小程序 动画的简单实例
2017/10/12 Javascript
基于javascript中的typeof和类型判断(详解)
2017/10/27 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
layui问题之模拟select点击事件的实例讲解
2018/08/15 Javascript
webpack多入口多出口的实现方法
2018/08/17 Javascript
详解微信小程序与内嵌网页交互实现支付功能
2018/10/22 Javascript
webpack的pitching loader详解
2019/09/23 Javascript
python搭建简易服务器分析与实现
2012/12/15 Python
进一步探究Python的装饰器的运用
2015/05/05 Python
Python中文字符串截取问题
2015/06/15 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
2016/02/18 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
Python给定一个句子倒序输出单词以及字母的方法
2018/12/20 Python
将python运行结果保存至本地文件中的示例讲解
2019/07/11 Python
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
python3.5的包存放的具体路径
2020/08/16 Python
基于Python中Remove函数的用法讨论
2020/12/11 Python
澳大利亚巧克力花束和礼品网站:Tastebuds
2019/03/15 全球购物
文员自我评价怎么写
2013/09/19 职场文书
专科文秘应届生求职信
2013/11/18 职场文书
学校运动会开幕演讲稿
2014/01/04 职场文书
大学生旅游业创业计划书
2014/01/29 职场文书
学校后勤岗位职责
2014/02/19 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
教师廉洁自律个人总结
2015/02/10 职场文书
2015年事业单位办公室文员工作总结
2015/04/24 职场文书
【海涛教你打DOTA】黑鸟第一视角解说
2022/04/01 DOTA