具体代码如下所述:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#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 登录
1
2
|
itchat.auto_login 需要扫描登录
hotreload = true 表示下次不用扫描了 会在本地生成
|
2)
@itchat.msg_register 当接收到对应消息类型时会被调用
对应类型如下
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 这里的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获得好友和群组已撤回的消息,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!
原文链接:https://www.cnblogs.com/yuanjava/archive/2018/06/24/9220877.html