hanyan20

一直想写这个博客好久了,一直没时间,今天抽空写一下。

首先这个功能如下图所示:

wpsA58.tmp

用到的库主要是: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()

分类:

技术点:

相关文章: