一直想写这个博客好久了,一直没时间,今天抽空写一下。
首先这个功能如下图所示:
用到的库主要是: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()