微信自动分享书籍

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

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

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()

相关文章