一直想写这个博客好久了, 一直没时间, 今天抽空写一下.
首先这个功能如下图所示:
用到的库主要是: 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):
再写一个找书的子函数:
- defsearch_doc(book_name):
- book_list=[]
- for(root,dir,files) inos.walk(r'E:\doc\books'):
- forfile infiles:
- ifbook_name infile.split('.')[0]:
- book_list.append(os.path.join(root,file))
- returnbook_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)
到这里就结束了, 如果有更好的改进建议或者别的好的想法, 可以留言, 会谦虚学习的
源码:
- importitchat,os,pinyin,shutil
- fromitchat.content import*
- defsearch_doc(book_name):
- book_list=[]
- for(root,dir,files) inos.walk(r'E:\doc\books'):
- forfile infiles:
- ifbook_name infile.split('.')[0]:
- book_list.append(os.path.join(root,file))
- returnbook_list
- @itchat.msg_register(TEXT)# 只对文本信息进行操作 defauto_reply(msg):
- ifmsg['Text'].split(':')[0]=='书名':
- defaultReply = 'I can\'t find: '+ msg['Text']
- book_name=msg['Text'].split(':')[1]
- book_roots=search_doc(book_name)
- ifbook_roots==[]:
- returndefaultReply
- forbook_root inbook_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()
来源: http://www.bubuko.com/infodetail-2880927.html