一直想写这个博客好久了,一直没时间,今天抽空写一下。
首先这个功能如下图所示:
用到的库主要是:itchat,os,pinyin,shutil
本篇博客会将所有的功能实现都描述出来。
1 首先是微信网页端的登陆:
1.1 itchat.auto_login()
此处不建议采用热重装的方式,即:itchat.auto_login(hotReload=True)
因为在调试程序过程中会反复登陆,可能会导致暂时禁用网页版微信,将hotReload=True去掉即可。
1.2 from itchat.content import *
总共有四种格式消息内容,可以全部导入(起码官方文档是这么操作的)。
定义一个自动回复消息的子函数:
1.3 @itchat.msg_register(TEXT)#只对文本信息进行操作
def auto_reply(msg):
装饰器中有四种类型可以选择,这里我们只需要对文字消息回复,所以装饰器括号里只需要输入TEXT就可以了。
msg就是我们收到的信息,我们这里可以打印一下这个信息,看一下这个信息详细的类型:
{‘MsgId‘: ‘2185934866399863740‘, ‘FromUserName‘: ‘@9aad42feffb2d30915be7096622bd49a3bf862f9b3db1229bdafec9ec4325078‘, ‘ToUserName‘: ‘@b7e350f6855d8a4cd0dbb3849df4e07a‘, ‘MsgType‘: 1, ‘Content‘: ‘你好‘, ‘Status‘: 3, ‘ImgStatus‘: 1, ‘CreateTime‘: 1544363187, ‘VoiceLength‘: 0, ‘PlayLength‘: 0, ‘FileName‘: ‘‘, ‘FileSize‘: ‘‘, ‘MediaId‘: ‘‘, ‘Url‘: ‘‘, ‘AppMsgType‘: 0, ‘StatusNotifyCode‘: 0, ‘StatusNotifyUserName‘: ‘‘, ‘RecommendInfo‘: {‘UserName‘: ‘‘, ‘NickName‘: ‘‘, ‘QQNum‘: 0, ‘Province‘: ‘‘, ‘City‘: ‘‘, ‘Content‘: ‘‘, ‘Signature‘: ‘‘, ‘Alias‘: ‘‘, ‘Scene‘: 0, ‘VerifyFlag‘: 0, ‘AttrStatus‘: 0, ‘Sex‘: 0, ‘Ticket‘: ‘‘, ‘OpCode‘: 0}, ‘ForwardFlag‘: 0, ‘AppInfo‘: {‘AppID‘: ‘‘, ‘Type‘: 0}, ‘HasProductId‘: 0, ‘Ticket‘: ‘‘, ‘ImgHeight‘: 0, ‘ImgWidth‘: 0, ‘SubMsgType‘: 0, ‘NewMsgId‘: 2185934866399863740, ‘OriContent‘: ‘‘, ‘EncryFileName‘: ‘‘, ‘User‘: <User: {‘MemberList‘: <ContactList: []>, ‘Uin‘: 0, ‘UserName‘: ‘@9aad42feffb2d30915be7096622bd49a3bf862f9b3db1229bdafec9ec4325078‘, ‘NickName‘: ‘浅月‘, ‘HeadImgUrl‘: ‘/cgi-bin/mmwebwx-bin/webwxgeticon?seq=686195330&username=@9aad42feffb2d30915be7096622bd49a3bf862f9b3db1229bdafec9ec4325078&skey=@crypt_b434f67c_698cdfb4794fc7fbb4b01909f6defedf‘, ‘ContactFlag‘: 3, ‘MemberCount‘: 0, ‘RemarkName‘: ‘‘, ‘HideInputBarFlag‘: 0, ‘Sex‘: 1, ‘Signature‘: ‘西出阳关,独饮成三人‘, ‘VerifyFlag‘: 0, ‘OwnerUin‘: 0, ‘PYInitial‘: ‘JY‘, ‘PYQuanPin‘: ‘jianyue‘, ‘RemarkPYInitial‘: ‘‘, ‘RemarkPYQuanPin‘: ‘‘, ‘StarFriend‘: 0, ‘AppAccountFlag‘: 0, ‘Statues‘: 0, ‘AttrStatus‘: 102437, ‘Province‘: ‘广东‘, ‘City‘: ‘深圳‘, ‘Alias‘: ‘‘, ‘SnsFlag‘: 1, ‘UniFriend‘: 0, ‘DisplayName‘: ‘‘, ‘ChatRoomId‘: 0, ‘KeyWord‘: ‘‘, ‘EncryChatRoomId‘: ‘‘, ‘IsOwner‘: 0}>, ‘Type‘: ‘Text‘, ‘Text‘: ‘你好‘}
可以看到这个字典里信息量有点庞大哈
不过我们要的东西就只有两个,一个TEXT,一个FromUserName。
接下来就是对获取来的信息进行分析了,我们先规定一个格式,不然正常聊天都加上自动回复就很尴尬了,比如回复(书名:XX),我们就会发送相应的书籍给他:
2 微信网页端自动回复
2.1 if msg[‘Text‘].split(‘:‘)[0]==‘书名‘:
如果没有找到书名,那我们这就设置一个自动回复:
defaultReply = ‘I can\‘t find: ‘ + msg[‘Text‘]
2.2 def search_doc(book_name):
再写一个找书的子函数:
def search_doc(book_name):
book_list=[]
for (root,dir,files) in os.walk(r‘E:\doc\books‘):
for file in files:
if book_name in file.split(‘.‘)[0]:
book_list.append(os.path.join(root,file))
return book_list
找到以后返回所有符合条件的书籍。
2.3 itchat.send_file(dstfile, toUserName=msg.FromUserName)
发送文件。
3 文件处理
需要注意的是这里不能直接发送,因为itchat不支持发送带中文的文件,这里需要将书名转换为英文发送过去。
这里我们接下来做个爬虫,爬某某翻译即可实现。
当然我是不会这么干的,直接将汉字转拼音保留拼音第一个,推荐直接用pinyin这个库,功能最简洁明了。
3.1 En=pinyin.get_initial(‘汉字’).replace(‘ ‘,‘‘)
他默认是有空格的,我将空格去掉了。
3.2 文件拷贝
接下来操作便是使用shutil拷贝,并且在拷贝的时候更改文件名
en_book_name=pinyin.get_initial(book_name).replace(‘ ‘,‘‘)+‘.‘+book_root.split(‘.‘)[-1]
dstfile=‘C:/book/‘+en_book_name
shutil.copyfile(book_root,dstfile)
到这里就结束了,如果有更好的改进建议或者别的好的想法,可以留言,会谦虚学习的
源码:
import itchat,os,pinyin,shutil
from itchat.content import *
def search_doc(book_name):
book_list=[]
for (root,dir,files) in os.walk(r‘E:\doc\books‘):
for file in files:
if book_name in file.split(‘.‘)[0]:
book_list.append(os.path.join(root,file))
return book_list
@itchat.msg_register(TEXT)#只对文本信息进行操作
def auto_reply(msg):
if msg[‘Text‘].split(‘:‘)[0]==‘书名‘:
defaultReply = ‘I can\‘t find: ‘ + msg[‘Text‘]
book_name=msg[‘Text‘].split(‘:‘)[1]
book_roots=search_doc(book_name)
if book_roots==[]:
return defaultReply
for book_root in book_roots:
en_book_name=pinyin.get_initial(book_name).replace(‘ ‘,‘‘)+‘.‘+book_root.split(‘.‘)[-1]
dstfile=‘C:/book/‘+en_book_name
shutil.copyfile(book_root,dstfile)
itchat.send_file(dstfile, toUserName=msg.FromUserName)
os.remove(dstfile)
# 为了让实验过程更加方便(修改程序不用多次扫码),我们使用热启动
itchat.auto_login()#生成Qcode码,扫描成功即可登录网页版微信
itchat.run()