使用Python微信库itchat获得好友和群组已撤回的消息


Posted in Python onJune 24, 2018

具体代码如下所述:

#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 #针对表情包的内容
# 这里的TEXT表示如果有人发送文本消息()
# TEXT  文本  文本内容(文字消息)
# MAP  地图  位置文本(位置分享)
# CARD  名片  推荐人字典(推荐人的名片)
# SHARING  分享  分享名称(分享的音乐或者文章等)
# PICTURE 下载方法    图片/表情
# RECORDING  语音  下载方法
# ATTACHMENT  附件  下载方法
# VIDEO  小视频  下载方法
# FRIENDS  好友邀请  添加好友所需参数
# SYSTEM  系统消息  更新内容的用户或群聊的UserName组成的列表
# NOTE  通知  通知文本(消息撤回等),那么就会调用下面的方法
# 其中isFriendChat表示好友之间,isGroupChat表示群聊,isMapChat表示公众号
@itchat.msg_register([TEXT,PICTURE,FRIENDS,CARD,MAP,SHARING,RECORDING,ATTACHMENT,VIDEO],isFriendChat=True,isGroupChat=True)
def receive_msg(msg):
  global face_bug
  # print("消息是:"+str(msg))
  msg_time_rec = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) #接收消息的时间
  # ActualNickName : 实际 NickName(昵称) 群消息里(msg)才有这个值
  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_content = "F:\\weixininfo\\"+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
      }
    }
  )
  #自动删除130秒之前的消息,避免数据量太大后引起内存不足
  del_info = []
  for k in msg_information:
    m_time = msg_information[k]['msg_time'] #取得消息时间
    if int(time.time()) - m_time > 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()

思路

    1)使用python微信库itchat   登录

itchat.auto_login 需要扫描登录
hotReload=True 表示下次不用扫描了 会在本地生成

使用Python微信库itchat获得好友和群组已撤回的消息

2)

@itchat.msg_register  当接收到对应消息类型时会被调用

对应类型如下

# 这里的TEXT表示如果有人发送文本消息()
# TEXT  文本  文本内容(文字消息)
# MAP  地图  位置文本(位置分享)
# CARD  名片  推荐人字典(推荐人的名片)
# SHARING  分享  分享名称(分享的音乐或者文章等)
# PICTURE 下载方法    图片/表情
# RECORDING  语音  下载方法
# ATTACHMENT  附件  下载方法
# VIDEO  小视频  下载方法
# FRIENDS  好友邀请  添加好友所需参数
# SYSTEM  系统消息  更新内容的用户或群聊的UserName组成的列表
# NOTE  通知  通知文本(消息撤回等),那么就会调用下面的方法
# 其中isFriendChat表示好友之间,isGroupChat表示群聊,isMapChat表示公众号

然后根据msg获取里面对应的内容如发送时间 msg_time

发送内容msg_content等等  把这些消息存放在msg_information里 

判断消息里内容里 有  撤回了一条消息  根据消息id 去msg_information里获取对象内容 发送到手机助手 和打印在屏幕上最后如果时间超过130秒  删除msg_information里的内容

运行图片如下:

使用Python微信库itchat获得好友和群组已撤回的消息

使用Python微信库itchat获得好友和群组已撤回的消息

总结

以上所述是小编给大家介绍的使用Python微信库itchat获得好友和群组已撤回的消息,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
python批量提取word内信息
Aug 09 Python
apache部署python程序出现503错误的解决方法
Jul 24 Python
基于Pandas读取csv文件Error的总结
Jun 15 Python
深入浅析Python传值与传址
Jul 10 Python
python之cv2与图像的载入、显示和保存实例
Dec 05 Python
Django框架模板介绍
Jan 15 Python
Python求两点之间的直线距离(2种实现方法)
Jul 07 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
Django Path转换器自定义及正则代码实例
May 29 Python
tensorflow2.0教程之Keras快速入门
Feb 20 Python
pytest配置文件pytest.ini的详细使用
Apr 17 Python
Python的这些库,你知道多少?
Jun 09 Python
python库lxml在linux和WIN系统下的安装
Jun 24 #Python
Python3中详解fabfile的编写
Jun 24 #Python
关于python写入文件自动换行的问题
Jun 23 #Python
利用Python读取txt文档的方法讲解
Jun 23 #Python
python读取一个目录下所有txt里面的内容方法
Jun 23 #Python
Python 读取某个目录下所有的文件实例
Jun 23 #Python
python保存数据到本地文件的方法
Jun 23 #Python
You might like
PHP 用数组降低程序的时间复杂度
2009/12/04 PHP
PHP抓取、分析国内视频网站的视频信息工具类
2014/04/02 PHP
解决PHP里大量数据循环时内存耗尽的方法
2015/10/10 PHP
PHP的介绍以及优势详细分析
2019/09/05 PHP
laravel-admin 实现在指定的相册下添加照片
2019/10/21 PHP
setTimeout和setInterval的浏览器兼容性分析
2007/02/27 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
node.js中的console.dir方法使用说明
2014/12/10 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
2015/11/04 Javascript
javascript图片切换综合实例(循环切换、顺序切换)
2016/01/13 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
js判断所有表单项不为空则提交表单的实现方法
2016/09/09 Javascript
bootstrap侧边栏圆点导航
2017/01/11 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
js实现canvas图片与img图片的相互转换的示例
2017/08/31 Javascript
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
JavaScript检查数据中是否存在相同的元素(两种方法)
2018/10/07 Javascript
jQuery实现动态生成年月日级联下拉列表示例
2019/05/11 jQuery
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 LGD VS TNC
2018/03/30 DOTA
[47:12]TFT vs Secret Supermajor小组赛C组 BO3 第三场 6.3
2018/06/04 DOTA
解析Python中的__getitem__专有方法
2016/06/27 Python
python shell根据ip获取主机名代码示例
2017/11/25 Python
无法使用pip命令安装python第三方库的原因及解决方法
2018/06/12 Python
pandas 实现字典转换成DataFrame的方法
2018/07/04 Python
Python WEB应用部署的实现方法
2019/01/02 Python
Python定义函数时参数有默认值问题解决
2019/12/19 Python
Python CategoricalDtype自定义排序实现原理解析
2020/09/11 Python
CSS3教程(10):CSS3 HSL声明设置颜色
2009/04/02 HTML / CSS
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
公司募捐倡议书
2014/05/14 职场文书
解除聘用合同证明书范本
2014/09/11 职场文书
医者仁心观后感
2015/06/17 职场文书
Django+Nginx+uWSGI 定时任务的实现方法
2022/01/22 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏