4
4
python_wechat.py by xianhu
5
5
主要包括如下功能:
6
6
(1) 自动提醒群红包
7
- (2) 自动提醒群中带有特殊关键字的消息
8
- (3) 自动保存被撤回消息,包括内容、文件、图片、语音、视频等
7
+ (2) 自动保存被撤回消息,包括内容、文件、图片、语音、视频等
9
8
"""
10
9
11
- import re
12
10
import time
13
11
import itchat
14
12
import logging
17
15
18
16
# 初始化
19
17
my = itchat .new_instance ()
20
- my .auto_login (hotReload = False , enableCmdQR = - 2 )
21
- my .global_keys = ["创业" , "齐现虎 " ]
18
+ my .auto_login (hotReload = False , enableCmdQR = 2 )
19
+ my .global_keys = ["创业" , "算法" , "人工智能 " ]
22
20
my .to_user_name = "filehelper"
23
21
24
22
# my还包括的以下属性,注意用点.查看:
25
23
# (1) alive 是否还活着,isLogging 是否已登陆
26
- # (2) loginInfo 登陆信息,其中的User属性为自己的信息User字典类,包括UserName, NickName, RemarkName, Sex(1 or 2)等
27
- # (3) memberList 通讯录列表,每一项为一个User字典类,包括UserName, NickName, RemarkName, Sex(1 or 2)等
28
- # (4) chatroomList 群聊列表,每一项为一个Chatroom字典类,包括UserName, NickName, RemarkName, MemberCount, MemberList等
24
+ # (2) loginInfo 登陆信息,其中的User属性为自己的信息User字典类,包括UserName, NickName, RemarkName, Sex(1 or 2), Signature, Province, City等
25
+ # (3) memberList 通讯录列表,每一项为一个User字典类,包括UserName, NickName, RemarkName, Sex(1 or 2), Signature, Province, City等
26
+ # (4) chatroomList 群聊列表,每一项为一个Chatroom字典类,包括UserName, NickName, RemarkName, MemberCount, MemberList, Self等
29
27
# (5) mpList 订阅号列表,每一项为一个MassivePlatform字典类,包括UserName, NickName等
30
28
31
29
# 获取并更新通讯录: {UserName: UserInstance}
@@ -41,7 +39,7 @@ def get_msg_list(msg):
41
39
提取消息内容,消息来源分类:
42
40
(1)来自好友的消息
43
41
(2)来自自己的消息
44
- (3)来自文件传输助手的消息等
42
+ (3)来自文件传输助手的消息
45
43
(4)来自群聊的消息
46
44
提取消息内容,消息类型分类:
47
45
(1)文字
@@ -54,7 +52,7 @@ def get_msg_list(msg):
54
52
(8)分享
55
53
(9)附件
56
54
"""
57
- # logging.warning("%s", msg)
55
+ logging .warning ("message: %s" , msg )
58
56
msg_id = msg ["MsgId" ] # 消息ID
59
57
from_user_name = msg ["FromUserName" ] # 消息发送者ID
60
58
to_user_name = msg ["ToUserName" ] # 消息接受者ID
@@ -64,7 +62,11 @@ def get_msg_list(msg):
64
62
msg_time = datetime .datetime .fromtimestamp (msg ["CreateTime" ]) # 消息发送时间
65
63
66
64
msg_file = msg ["FileName" ] # 消息中所带文件的名称
67
- msg_url = msg ["Url" ] # 消息中带有的链接地址
65
+ msg_file_length = msg ["FileSize" ] # 消息中所带文件的大小
66
+ msg_file_length = int (msg_file_length ) if msg_file_length .strip () else 0
67
+ msg_voice_length = msg ["VoiceLength" ] # 消息中所带语音的长度(毫秒)
68
+ msg_play_length = msg ["PlayLength" ] # 消息中所带视频的长度(秒)
69
+ msg_url = msg ["Url" ] # 消息中所带链接的地址
68
70
69
71
wind_name = msg ["User" ]["RemarkName" ] if msg ["User" ].get ("RemarkName" ) else (
70
72
msg ["User" ]["NickName" ] if msg ["User" ].get ("NickName" ) else to_user_name
@@ -79,8 +81,9 @@ def get_msg_list(msg):
79
81
we_type = msg ["Type" ] # 消息类型
80
82
we_text = msg ["Text" ] # 消息内容
81
83
82
- logging .warning ("wind: %s, nick:%s, %s/%s, %s/%s, %s" , wind_name , nick_name , msg_type , we_type , msg_content , we_text , msg_time )
83
- return msg_id , from_user_name , to_user_name , msg_type , msg_content , msg_time , msg_file , msg_url , wind_name , nick_name , we_type , we_text
84
+ logging .warning ("show: nick_name=%s, wind_name=%s, we_type=%s, we_text=%s" , nick_name , wind_name , we_type , we_text )
85
+ return msg_id , from_user_name , to_user_name , msg_type , msg_content , msg_time , \
86
+ msg_file , msg_file_length , msg_voice_length , msg_play_length , msg_url , wind_name , nick_name , we_type , we_text
84
87
85
88
86
89
# 消息注册,主要处理群消息
@@ -90,7 +93,8 @@ def text_reply(msg):
90
93
消息自动接收, 接受全部的消息
91
94
"""
92
95
# 消息提取
93
- msg_id , from_user_name , to_user_name , msg_type , msg_content , msg_time , msg_file , msg_url , wind_name , nick_name , we_type , we_text = get_msg_list (msg )
96
+ msg_id , from_user_name , to_user_name , msg_type , msg_content , msg_time , \
97
+ msg_file , msg_file_length , msg_voice_length , msg_play_length , msg_url , wind_name , nick_name , we_type , we_text = get_msg_list (msg )
94
98
95
99
# 消息过滤, 只监测文字、注解、分享、图片、语音、视频、附件等
96
100
if we_type not in ["Text" , "Note" , "Sharing" , "Picture" , "Recording" , "Video" , "Attachment" ]:
@@ -114,26 +118,25 @@ def text_reply(msg):
114
118
if we_type == "Note" and we_text .find ("收到红包,请在手机上查看" ) >= 0 :
115
119
my .send ("【%s】中有红包,快抢!" % wind_name , toUserName = my .to_user_name )
116
120
117
- # 关键字消息处理
118
- for key in my .global_keys :
119
- if msg_content .find (key ) >= 0 :
120
- my .send ("【%s】中有关键字【%s】:\n From: %s\n Time: %s\n %s" % (wind_name , key , nick_name , msg_time , msg_content ), toUserName = my .to_user_name )
121
- break
122
-
123
121
# 撤回消息处理
124
122
if we_type == "Note" and we_text .find ("撤回了一条消息" ) >= 0 :
125
123
old_msg = my .msg_store .get (msg_content [msg_content .find ("<msgid>" )+ 7 : msg_content .find ("</msgid>" )])
126
124
if not old_msg :
127
125
logging .warning ("not message id in my.msg_store" )
128
126
return
129
127
130
- msg_id , from_user_name , to_user_name , msg_type , msg_content , msg_time , msg_file , msg_url , wind_name , nick_name , we_type , we_text = get_msg_list (old_msg )
131
- if we_type in ["Picture" , "Recording" , "Video" , "Attachment" ]:
132
- re_length = re .search ("[\" \s]length=\" (?P<length>[\d]+?)\" " , msg_content , flags = re .IGNORECASE )
133
- if (not msg_content ) or (re_length and (int (re_length .group ("length" )) < 5000000 )):
134
- we_text (".Cache/" + msg_file )
135
- logging .warning ("downloading %s to .Cache/" , msg_file )
136
- # 更改内容
128
+ msg_id , from_user_name , to_user_name , msg_type , msg_content , msg_time , \
129
+ msg_file , msg_file_length , msg_voice_length , msg_play_length , msg_url , wind_name , nick_name , we_type , we_text = get_msg_list (old_msg )
130
+
131
+ if we_type == "Text" :
132
+ msg_content = we_text
133
+ elif we_type in ["Picture" , "Recording" , "Video" , "Attachment" ]:
134
+ if (msg_file_length <= 500000 ) and (msg_voice_length <= 60000 ) and (msg_play_length <= 10 ):
135
+ try :
136
+ we_text (".Cache/" + msg_file )
137
+ logging .warning ("downloading %s to .Cache/" , msg_file )
138
+ except :
139
+ logging .error ("downloading %s to .Cache/ error" , msg_file )
137
140
msg_content = msg_file
138
141
elif we_type == "Sharing" :
139
142
msg_content = we_text + ": " + msg_url
0 commit comments