您的位置:首页 > 编程语言 > Python开发

利用python实现微信好友防撤回、消息监控

2019-07-03 10:04 926 查看

该项目来源于github,将其跑通:

# -*- coding: utf-8 -*-
"""
Created on Fri Jun 21 12:09:43 2019

@author: wuxian
"""
import sys
import os, re, shutil, time, collections, json

from html.parser import HTMLParser
from xml.etree import ElementTree as ETree

import itchat
from itchat.content import *

#itchat.login()
msg_store = collections.OrderedDict()
timeout = 600
sending_type = {'Picture': 'img', 'Video': 'vid'}
data_path = 'data'
nickname = ''
bot = None

if __name__ == '__main__':
if not os.path.exists(data_path):
os.mkdir(data_path)
# if the QR code doesn't show correctly, you can try to change the value
# of enableCdmQR to 1 or -1 or -2. It nothing works, you can change it to
# enableCmdQR=True and a picture will show up.
bot = itchat.new_instance()
#    bot.auto_login(hotReload=True, enableCmdQR=1)
bot.login()
nickname = bot.loginInfo['User']['NickName']

def clear_timeouted_message():
now = time.time()
count = 0
for k, v in list(msg_store.items()):
if now - v['ReceivedTime'] > timeout:
count += 1
else:
break
for i in range(count):
item = msg_store.popitem(last=False)

def get_sender_receiver(msg):
sender = nickname
receiver = nickname
if msg['FromUserName'][0:2] == '@@': # group chat
sender = msg['ActualNickName']
m = bot.search_chatrooms(userName=msg['FromUserName'])
if m is not None:
receiver = m['NickName']
elif msg['ToUserName'][0:2] == '@@': # group chat by myself
if 'ActualNickName' in msg:
sender = msg['ActualNickName']
else:
m = bot.search_friends(userName=msg['FromUserName'])
if m is not None:
sender = m['NickName']
m = bot.search_chatrooms(userName=msg['ToUserName'])
if m is not None:
receiver = m['NickName']
else: # personal chat
m = bot.search_friends(userName=msg['FromUserName'])
if m is not None:
sender = m['NickName']
m = bot.search_friends(userName=msg['ToUserName'])
if m is not None:
receiver = m['NickName']
return HTMLParser().unescape(sender), HTMLParser().unescape(receiver)

def print_msg(msg):
msg_str = ' '.join(msg)
print(msg_str)
return msg_str

def get_whole_msg(msg, download=False):
sender, receiver = get_sender_receiver(msg)
if len(msg['FileName']) > 0 and len(msg['Url']) == 0:
if download: # download the file into data_path directory
fn = os.path.join(data_path, msg['FileName'])
msg['Text'](fn)
if os.path.getsize(fn) == 0:
return []
c = '@%s@%s' % (sending_type.get(msg['Type'], 'fil'), fn)
else:
c = '@%s@%s' % (sending_type.get(msg['Type'], 'fil'), msg['FileName'])
return ['[%s]->[%s]:' % (sender, receiver), c]
c = msg['Text']
if len(msg['Url']) > 0:
try: # handle map label
content_tree = ETree.fromstring(msg['OriContent'])
if content_tree is not None:
map_label = content_tree.find('location')
if map_label is not None:
c += ' ' + map_label.attrib['poiname']
c += ' ' + map_label.attrib['label']
except:
pass
url = HTMLParser().unescape(msg['Url'])
c += ' ' + url
return ['[%s]->[%s]: %s' % (sender, receiver, c)]

@bot.msg_register([TEXT, PICTURE, MAP, CARD, SHARING, RECORDING,
ATTACHMENT, VIDEO, FRIENDS], isFriendChat=True, isGroupChat=True)
def normal_msg(msg):
print_msg(get_whole_msg(msg))
now = time.time()
msg['ReceivedTime'] = now
msg_id = msg['MsgId']
msg_store[msg_id] = msg
clear_timeouted_message()

@bot.msg_register([NOTE], isFriendChat=True, isGroupChat=True)
def note_msg(msg):
print_msg(get_whole_msg(msg))
content = HTMLParser().unescape(msg['Content'])
try:
content_tree = ETree.fromstring(content)
except Exception:
# invent/remove to chatroom
return
if content_tree is None:
return
revoked = content_tree.find('revokemsg')
if revoked is None:
return
old_msg_id = revoked.find('msgid').text
old_msg = msg_store.get(old_msg_id)
if old_msg is None:
return
msg_send = get_whole_msg(old_msg, download=True)
for m in msg_send:
bot.send(m, toUserName='filehelper')
clear_timeouted_message()

if __name__ == '__main__':
bot.run()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: