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程序实例(通讯录)
Nov 29 Python
python利用paramiko连接远程服务器执行命令的方法
Oct 16 Python
Python编程二分法实现冒泡算法+快速排序代码示例
Jan 15 Python
对命令行模式与python交互模式介绍
May 12 Python
python实现自动登录
Sep 17 Python
Django 在iframe里跳转顶层url的例子
Aug 21 Python
感知器基础原理及python实现过程详解
Sep 30 Python
Python实现线性插值和三次样条插值的示例代码
Nov 13 Python
解决 jupyter notebook 回车换两行问题
Apr 15 Python
解决Python数据可视化中文部分显示方块问题
May 16 Python
Python进行统计建模
Aug 10 Python
Python基于argparse与ConfigParser库进行入参解析与ini parser
Feb 02 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
JoshChen_php新手进阶高手不可或缺的规范介绍
2013/08/16 PHP
PHP7 整型处理机制修改
2021/03/09 PHP
改进UCHOME的记录发布,增强可访问性用户体验
2011/01/17 Javascript
javascript定义变量时有var和没有var的区别探讨
2014/07/21 Javascript
javascript数组排序汇总
2015/07/07 Javascript
Boostrap基础教程之JavaScript插件篇
2016/09/08 Javascript
vue 打包后的文件部署到express服务器上的方法
2017/08/09 Javascript
JavaScript如何对图片进行黑白化
2018/04/10 Javascript
async/await地狱该如何避免详解
2018/05/10 Javascript
JavaScript原型链与继承操作实例总结
2018/08/24 Javascript
Vue CLI3 如何支持less的方法示例
2018/08/29 Javascript
vue中的inject学习教程
2019/04/24 Javascript
小程序云开发如何实现图片上传及发表文字
2019/05/17 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
layui layer select 选择被遮挡的解决方法
2019/09/21 Javascript
JS几个常用的函数和对象定义与用法示例
2020/01/15 Javascript
js实现全选和全不选
2020/07/28 Javascript
[04:01]2014DOTA2国际邀请赛 TITAN告别Ohaiyo期望明年再战
2014/07/15 DOTA
Python 详解基本语法_函数_返回值
2017/01/22 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
python opencv实现图片旋转矩形分割
2018/07/26 Python
Python如何调用外部系统命令
2019/08/07 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
python 通过文件夹导入包的操作
2020/06/01 Python
HTML5之SVG 2D入门10—滤镜的定义及使用
2013/01/30 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
香蕉共和国Banana Republic官网:美国GAP旗下偏贵族风格服饰品牌
2016/11/21 全球购物
什么是跨站脚本攻击
2014/12/11 面试题
个人纪律作风整改措施思想汇报
2014/10/12 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
义卖募捐活动总结
2015/05/09 职场文书
电影圆明园观后感
2015/06/03 职场文书
欠款证明
2015/06/24 职场文书
领导视察通讯稿
2015/07/18 职场文书
新学期主题班会
2015/08/17 职场文书
table设置超出部分隐藏,鼠标移上去显示全部内容的方法
2022/12/24 HTML / CSS