16
16
from itchat .content import *
17
17
18
18
# 初始化
19
- newInstance = itchat .new_instance ()
20
- newInstance .auto_login (hotReload = False , enableCmdQR = 2 )
21
- newInstance .global_keys = ["人工智能" , "机器学习" , "算法" , "数据挖掘" ]
22
- newInstance .to_user_name = "filehelper"
19
+ my = itchat .new_instance ()
20
+ my .auto_login (hotReload = False , enableCmdQR = 2 )
21
+ my .global_keys = ["人工智能" , "机器学习" , "算法" , "数据挖掘" ]
22
+ my .to_user_name = "filehelper"
23
23
24
- # 获取自己的属性字典:UserName, NickName, RemarkName, Sex(1 or 2)
25
- newInstance .owner = newInstance .loginInfo ["User" ]
24
+ # my还包括的以下属性,注意用点.查看:
25
+ # (1) alive 是否还活着,isLogging 是否已登陆
26
+ # (2) loginInfo 登陆信息,其中的User属性为自己的信息User字典类,包括UserName, NickName, RemarkName, Sex(1 or 2)等
27
+ # (3) memberList 通讯录列表,每一项为一个User字典类
28
+ # (4) chatroomList 群聊列表,每一项为一个Chatroom字典类,包括UserName, NickName, RemarkName, MemberCount等
29
+ # (5) mpList 订阅号列表,每一项为一个MassivePlatform字典类,包括UserName, NickName等
26
30
27
- # 获取通讯录 : {UserName: UserInstance}
28
- newInstance .friends = {user ["UserName" ]: user for user in newInstance .get_friends (update = True )}
31
+ # 获取并更新通讯录 : {UserName: UserInstance}
32
+ my .friends = {user ["UserName" ]: user for user in my .get_friends (update = True )}
29
33
30
34
# 消息存储队列
31
- newInstance .msg_store = {}
35
+ my .msg_store = {}
32
36
33
37
34
38
# 消息提取函数
@@ -49,14 +53,16 @@ def get_msg_list(msg):
49
53
msg_file = msg ["FileName" ] # 消息中所带文件的名称
50
54
msg_url = msg ["Url" ] # 消息中带有的链接地址
51
55
56
+ wind_name = msg ["User" ]["RemarkName" ] if msg ["User" ].get ("RemarkName" ) else (
57
+ msg ["User" ]["NickName" ] if msg ["User" ].get ("NickName" ) else to_user_name
58
+ )
59
+
52
60
if from_user_name .startswith ("@@" ):
53
61
# 群消息
54
- wind_name = msg ["User" ]["RemarkName" ] if msg ["User" ]["RemarkName" ] else msg ["User" ]["NickName" ]
55
- nick_name = msg ["ActualNickName" ] if (msg ["ActualUserName" ] not in newInstance .friends ) or \
56
- (not newInstance .friends [msg ["ActualUserName" ]]["RemarkName" ]) else newInstance .friends [msg ["ActualUserName" ]]["RemarkName" ]
62
+ nick_name = msg ["ActualNickName" ] if (msg ["ActualUserName" ] not in my .friends ) or \
63
+ (not my .friends [msg ["ActualUserName" ]]["RemarkName" ]) else my .friends [msg ["ActualUserName" ]]["RemarkName" ]
57
64
else :
58
65
# 个人消息
59
- wind_name = msg ["User" ]["RemarkName" ] if msg ["User" ]["RemarkName" ] else msg ["User" ]["NickName" ]
60
66
nick_name = wind_name
61
67
62
68
we_type = msg ["Type" ] # 消息类型
@@ -66,69 +72,64 @@ def get_msg_list(msg):
66
72
67
73
68
74
# 消息注册,主要处理群消息
69
- @newInstance .msg_register ([TEXT , MAP , CARD , NOTE , SHARING , PICTURE , RECORDING , ATTACHMENT , VIDEO ], isFriendChat = True , isGroupChat = True )
75
+ @my .msg_register ([TEXT , MAP , CARD , NOTE , SHARING , PICTURE , RECORDING , ATTACHMENT , VIDEO ], isFriendChat = True , isGroupChat = True )
70
76
def text_reply (msg ):
71
77
"""
72
78
消息自动接收, 接受全部的消息
73
79
"""
74
80
# 消息提取
75
81
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 )
76
82
77
- # 消息过滤,过滤自己发送的消息
78
- if from_user_name == newInstance .owner ["UserName" ]:
79
- logging .warning ("message from myself, skip" )
80
- return
81
-
82
83
# 消息过滤, 只监测文字、注解、分享、图片、语音、视频、附件等
83
84
if we_type not in ["Text" , "Note" , "Sharing" , "Picture" , "Recording" , "Video" , "Attachment" ]:
84
85
logging .warning ("message ignored" )
85
86
return
86
87
87
- if we_type in ["Picture" , "Recording" , "Video" , "Attachment" ]:
88
- re_length = re .search ("[\" \s]length=\" (?P<length>[\d]+?)\" " , msg_content , flags = re .IGNORECASE )
89
- if (not msg_content ) or (re_length and (int (re_length .group ("length" )) < 5000000 )):
90
- we_text (".Cache/" + msg_file )
91
- logging .warning ("downloading %s to .Cache/" , msg_file )
92
-
93
- # 消息存储
94
- newInstance .msg_store [msg_id ] = msg
88
+ # 处理来自自己的消息
89
+ if from_user_name == my .loginInfo ["User" ]["UserName" ]:
90
+ return
95
91
96
- # 删除过期消息
97
- ids_list = [ _id for _id in newInstance .msg_store if time . time () - newInstance . msg_store [ _id ][ "CreateTime" ] > 120 ]
98
- for _id in ids_list :
92
+ # 消息存储, 删除过期消息
93
+ my .msg_store [ msg_id ] = msg
94
+ for _id in [ _id for _id in my . msg_store if time . time () - my . msg_store [ _id ][ "CreateTime" ] > 120 ] :
99
95
logging .warning ("delete message, message_id = %s" , _id )
100
- newInstance .msg_store .pop (_id )
96
+ my .msg_store .pop (_id )
101
97
102
98
# 处理群消息
103
99
if from_user_name .startswith ("@@" ):
104
100
# 红包消息处理
105
101
if we_type == "Note" and we_text .find ("收到红包,请在手机上查看" ) >= 0 :
106
- newInstance .send ("【%s】中有红包,快抢!\n From: %s \n Content: %s \n Time: %s " % ( wind_name , nick_name , msg_content , msg_time ), toUserName = newInstance .to_user_name )
102
+ my .send ("【%s】中有红包,快抢!" % wind_name , toUserName = my .to_user_name )
107
103
108
104
# 提到自己消息处理
109
105
if msg ["IsAt" ]:
110
- newInstance .send ("【%s】中有@你的消息:\n From: %s\n Content : %s\n Time: %s" % (wind_name , nick_name , msg_content , msg_time ), toUserName = newInstance .to_user_name )
106
+ my .send ("【%s】中有@你的消息:\n From: %s\n Time : %s\n %s" % (wind_name , nick_name , msg_time , msg_content ), toUserName = my .to_user_name )
111
107
112
- for key in newInstance .global_keys :
108
+ for key in my .global_keys :
113
109
if msg_content .find (key ) >= 0 :
114
- newInstance .send ("【%s】中有关键字【%s】:\n From: %s\n Content : %s\n Time: %s" % (wind_name , key , nick_name , msg_content , msg_time ), toUserName = newInstance .to_user_name )
110
+ 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 )
115
111
break
116
112
117
113
# 撤回消息处理
118
114
if we_type == "Note" and we_text .find ("撤回了一条消息" ) >= 0 :
119
- old_msg = newInstance .msg_store .get (msg_content [msg_content .find ("<msgid>" )+ 7 : msg_content .find ("</msgid>" )])
115
+ old_msg = my .msg_store .get (msg_content [msg_content .find ("<msgid>" )+ 7 : msg_content .find ("</msgid>" )])
120
116
if not old_msg :
121
117
return
122
118
123
119
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 )
124
120
if we_type in ["Picture" , "Recording" , "Video" , "Attachment" ]:
121
+ re_length = re .search ("[\" \s]length=\" (?P<length>[\d]+?)\" " , msg_content , flags = re .IGNORECASE )
122
+ if (not msg_content ) or (re_length and (int (re_length .group ("length" )) < 5000000 )):
123
+ we_text (".Cache/" + msg_file )
124
+ logging .warning ("downloading %s to .Cache/" , msg_file )
125
+ # 更改内容
125
126
msg_content = msg_file
126
127
elif we_type == "Sharing" :
127
128
msg_content = we_text + ": " + msg_url
128
129
129
- newInstance .send ("【%s】中有消息被撤回:\n From: %s\n Type: %s\n Content : %s\n Time: %s" % (wind_name , nick_name , we_type , msg_content , msg_time ), toUserName = newInstance .to_user_name )
130
+ my .send ("【%s】中有消息被撤回:\n From: %s\n Type: %s\n Time : %s\n %s" % (wind_name , nick_name , we_type , msg_time , msg_content ), toUserName = my .to_user_name )
130
131
return
131
132
132
133
133
134
# 运行程序
134
- newInstance .run ()
135
+ my .run ()
0 commit comments