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