作者热门文章
- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Python 实现微信防撤回功能由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在微信上突然看到“xxx撤回一条消息”的时候,心里痒不痒?现在就教你如何实现消息防撤回的功能。不限手机型号、手机无需root,只要微信号可以登上网页版就可以了(部分不常用和新申请的账号会登不上网页版).
环境 。
centos7 python2.7 itchat 。
代码 。
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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
|
# coding:utf-8
import
itchat
from
itchat.content
import
text
from
itchat.content
import
*
import
sys
import
time
import
re
reload
(sys)
sys.setdefaultencoding(
'utf8'
)
import
os
msg_information
=
{}
face_bug
=
none
# 针对表情包的内容
@itchat
.msg_register([text, picture, friends, card,
map
, sharing, recording, attachment, video], isfriendchat
=
true,
ismpchat
=
true)
def
handle_receive_msg(msg):
global
face_bug
msg_time_rec
=
time.strftime(
"%y-%m-%d %h:%m:%s"
, time.localtime())
# 接受消息的时间
msg_from
=
itchat.search_friends(username
=
msg[
'fromusername'
])[
'nickname'
]
# 在好友列表中查询发送信息的好友昵称
msg_time
=
msg[
'createtime'
]
# 信息发送的时间
msg_id
=
msg[
'msgid'
]
# 每条信息的id
msg_content
=
none
# 储存信息的内容
msg_share_url
=
none
# 储存分享的链接,比如分享的文章和音乐
print
msg[
'type'
]
print
msg[
'msgid'
]
if
msg[
'type'
]
=
=
'text'
or
msg[
'type'
]
=
=
'friends'
:
# 如果发送的消息是文本或者好友推荐
msg_content
=
msg[
'text'
]
print
msg_content
# 如果发送的消息是附件、视屏、图片、语音
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))
# 下载文件
# print msg_content
elif
msg[
'type'
]
=
=
'card'
:
# 如果消息是推荐的名片
msg_content
=
msg[
'recommendinfo'
][
'nickname'
]
+
'的名片'
# 内容就是推荐人的昵称和性别
if
msg[
'recommendinfo'
][
'sex'
]
=
=
1
:
msg_content
+
=
'性别为男'
else
:
msg_content
+
=
'性别为女'
print
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
print
msg_share_url
face_bug
=
msg_content
##将信息存储在字典中,每一个msg_id对应一条信息
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
}
}
)
##这个是用于监听是否有friend消息撤回
@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.get(
'msg_from'
)
+
" 撤回了 】\n"
\
+
old_msg.get(
"msg_type"
)
+
" 消息:"
+
"\n"
\
+
old_msg.get(
'msg_time_rec'
)
+
"\n"
\
+
r""
+
old_msg.get(
'msg_content'
)
# 如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手
if
old_msg[
'msg_type'
]
=
=
"sharing"
:
msg_body
+
=
"\n就是这个链接➣ "
+
old_msg.get(
'msg_share_url'
)
# 将撤回消息发送到文件助手
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
.msg_register([text, picture, friends, card,
map
, sharing, recording, attachment, video], isgroupchat
=
true)
def
handle_receive_msg(msg):
global
face_bug
msg_time_rec
=
time.strftime(
"%y-%m-%d %h:%m:%s"
, time.localtime())
# 接受消息的时间
# groupid = msg['fromusername']
# chatroom = itchat.search_chatrooms(username=groupid)
msg_actual_from
=
msg[
'actualnickname'
]
# msg_actual_from = msg['user']
# msg_from = msg_actual_from['self']['nickname']
msg_from
=
msg_actual_from
msg_time
=
msg[
'createtime'
]
# 信息发送的时间
msg_id
=
msg[
'msgid'
]
# 每条信息的id
msg_content
=
none
# 储存信息的内容
msg_share_url
=
none
# 储存分享的链接,比如分享的文章和音乐
print
msg[
'type'
]
print
msg[
'msgid'
]
if
msg[
'type'
]
=
=
'text'
or
msg[
'type'
]
=
=
'friends'
:
# 如果发送的消息是文本或者好友推荐
msg_content
=
msg[
'text'
]
print
msg_content
# 如果发送的消息是附件、视屏、图片、语音
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))
# 下载文件
# print msg_content
elif
msg[
'type'
]
=
=
'card'
:
# 如果消息是推荐的名片
msg_content
=
msg[
'recommendinfo'
][
'nickname'
]
+
'的名片'
# 内容就是推荐人的昵称和性别
if
msg[
'recommendinfo'
][
'sex'
]
=
=
1
:
msg_content
+
=
'性别为男'
else
:
msg_content
+
=
'性别为女'
print
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
print
msg_share_url
face_bug
=
msg_content
##将信息存储在字典中,每一个msg_id对应一条信息
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消息撤回
@itchat
.msg_register(note, 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.get(
'msg_from'
)
+
" 群消息撤回提醒】\n"
\
+
" 撤回了 "
+
old_msg.get(
"msg_type"
)
+
" 消息:"
+
"\n"
\
+
old_msg.get(
'msg_time_rec'
)
+
"\n"
\
+
r""
+
old_msg.get(
'msg_content'
)
# 如果是分享的文件被撤回了,那么就将分享的url加在msg_body中发送给文件助手
if
old_msg[
'msg_type'
]
=
=
"sharing"
:
msg_body
+
=
"\n就是这个链接➣ "
+
old_msg.get(
'msg_share_url'
)
# 将撤回消息发送到文件助手
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)
# main (enablecmdqr = true 时,将会生成二维码图片,如 =2 时二维码乱码的话 改为1 即可
itchat.auto_login(enablecmdqr
=
2
, hotreload
=
true)
itchat.run()
|
如果想看懂代码的话,在有python一点基础的前提下搞懂 python 中的 装饰器 概念。下面是用到itchat中主要的一段代码 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
def
msg_register(
self
, msgtype, isfriendchat
=
false, isgroupchat
=
false, ismpchat
=
false):
''' a decorator constructor
return a specific decorator based on information given '''
if
not
(
isinstance
(msgtype,
list
)
or
isinstance
(msgtype,
tuple
)):
msgtype
=
[msgtype]
def
_msg_register(fn):
for
_msgtype
in
msgtype:
if
isfriendchat:
self
.functiondict[
'friendchat'
][_msgtype]
=
fn
if
isgroupchat:
self
.functiondict[
'groupchat'
][_msgtype]
=
fn
if
ismpchat:
self
.functiondict[
'mpchat'
][_msgtype]
=
fn
if
not
any
((isfriendchat, isgroupchat, ismpchat)):
self
.functiondict[
'friendchat'
][_msgtype]
=
fn
return
fn
return
_msg_register
|
运行 。
1.连接云服务器,安装pip 。
2.使用pip 安装 itchat库 (一个利用微信网页版api接口写的,有兴趣的话可以鼓捣鼓捣) 。
3.将脚本文件上传到云服务器 。
4.运行代码 。
1)扫码登录 。
2)登录成功 。
效果 。
发送消息 。
。
收到消息 。
。
开始撤回 。
。
撤回通知 。
总结 。
以上所述是小编给大家介绍的python 实现微信防撤回功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!最后此篇关于Python 实现微信防撤回功能的文章就讲到这里了,如果你想了解更多关于Python 实现微信防撤回功能的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我是一名优秀的程序员,十分优秀!