44python_wechat.py by xianhu 
55主要包括如下功能: 
66(1) 自动提醒群红包 
7- (2) 自动提醒群中带有特殊关键字的消息 
8- (3) 自动保存被撤回消息,包括内容、文件、图片、语音、视频等 
7+ (2) 自动保存被撤回消息,包括内容、文件、图片、语音、视频等 
98""" 
109
11- import  re 
1210import  time 
1311import  itchat 
1412import  logging 
1715
1816# 初始化 
1917my  =  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  =  ["创业" , "算法"  ,  "人工智能 "
2220my .to_user_name  =  "filehelper" 
2321
2422# my还包括的以下属性,注意用点.查看: 
2523# (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等  
2927# (5) mpList 订阅号列表,每一项为一个MassivePlatform字典类,包括UserName, NickName等 
3028
3129# 获取并更新通讯录: {UserName: UserInstance} 
@@ -41,7 +39,7 @@ def get_msg_list(msg):
4139 提取消息内容,消息来源分类: 
4240 (1)来自好友的消息 
4341 (2)来自自己的消息 
44-  (3)来自文件传输助手的消息等  
42+  (3)来自文件传输助手的消息  
4543 (4)来自群聊的消息 
4644 提取消息内容,消息类型分类: 
4745 (1)文字 
@@ -54,7 +52,7 @@ def get_msg_list(msg):
5452 (8)分享 
5553 (9)附件 
5654 """ 
57-  #  logging.warning("%s", msg)
55+  logging .warning ("message:  %s" , msg )
5856 msg_id  =  msg ["MsgId" ] # 消息ID 
5957 from_user_name  =  msg ["FromUserName" ] # 消息发送者ID 
6058 to_user_name  =  msg ["ToUserName" ] # 消息接受者ID 
@@ -64,7 +62,11 @@ def get_msg_list(msg):
6462 msg_time  =  datetime .datetime .fromtimestamp (msg ["CreateTime" ]) # 消息发送时间 
6563
6664 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" ] # 消息中所带链接的地址 
6870
6971 wind_name  =  msg ["User" ]["RemarkName" ] if  msg ["User" ].get ("RemarkName" ) else  (
7072 msg ["User" ]["NickName" ] if  msg ["User" ].get ("NickName" ) else  to_user_name 
@@ -79,8 +81,9 @@ def get_msg_list(msg):
7981 we_type  =  msg ["Type" ] # 消息类型 
8082 we_text  =  msg ["Text" ] # 消息内容 
8183
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 
8487
8588
8689# 消息注册,主要处理群消息 
@@ -90,7 +93,8 @@ def text_reply(msg):
9093 消息自动接收, 接受全部的消息 
9194 """ 
9295 # 消息提取 
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 )
9498
9599 # 消息过滤, 只监测文字、注解、分享、图片、语音、视频、附件等 
96100 if  we_type  not  in "Text" , "Note" , "Sharing" , "Picture" , "Recording" , "Video" , "Attachment" ]:
@@ -114,26 +118,25 @@ def text_reply(msg):
114118 if  we_type  ==  "Note"  and  we_text .find ("收到红包,请在手机上查看" ) >=  0 :
115119 my .send ("【%s】中有红包,快抢!"  %  wind_name , toUserName = my .to_user_name )
116120
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- 
123121 # 撤回消息处理 
124122 if  we_type  ==  "Note"  and  we_text .find ("撤回了一条消息" ) >=  0 :
125123 old_msg  =  my .msg_store .get (msg_content [msg_content .find ("<msgid>" )+ 7 : msg_content .find ("</msgid>" )])
126124 if  not  old_msg :
127125 logging .warning ("not message id in my.msg_store" )
128126 return 
129127
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 )
137140 msg_content  =  msg_file 
138141 elif  we_type  ==  "Sharing" :
139142 msg_content  =  we_text  +  ": "  +  msg_url 
0 commit comments