微信公众号的拓展功能在哪里?
本系列教程从如何分析微信协议开始。第一部分教你如何获取并模拟从头开始扩展个人微信账户所需的协议。
第二部分将使用这些协议,并以各个项目为例介绍微信一些有趣功能的实现。
第三部分介绍了协议的一些高级用法,并进一步介绍和扩展了框架。
本文是教程的第二部分。
简单的结果显示
完成本文的学习后,你将完成三个小项(为了方便二次阅读,源码链接放在括号内)
微信操作的音乐播放器(源码)
具有可定制消息内容和对象的群发消息助手(源代码)
具体好友删除检测(源码)
使用微信协议来完成机器人是很常见的。如果您对具体细节感兴趣,可以添加您的个人账户littlecodersh并回复“源代码”。
本文主要基于微信API的第三方包itchat。您可以在项目主页上获取更多信息。
这部分需要的环境
本文是本教程的第二部分,需要一个基本的启用pip 的Python 环境。
本教程使用的环境如下:
Windows 8.1(也可使用其他平台)
Python 2 或3
微信版本6.3.25
微信控制器
demo-pcmusicviawechat-2.png
在项目主页上,有人专门向我提出了很多关于微信作为智能家居入口的想法。
如果微信可以作为控制器,那么就不用再费力去制作自己的手机客户端了。
其实这个要求实现起来非常简单。这里我借用了yaphone的RasWxMusicbox,并使用了部分代码作为演示。
这是一个通过微信控制电脑播放音乐的小项目。它主要有三个功能:
输入“help”来显示帮助
输入“off”即可关闭音乐播放
输入具体歌曲名称,进入歌曲选择
改成代码,逻辑是这样的:
if msg==u'close':
关闭音乐()
print(u'音乐已关闭')
如果消息==你'帮助':
print(u'帮助信息')
别的:
打印(interact_select_song(消息))
那么现在需要解决的是如何关闭音乐、如何选择音乐以及如何使用微信进行交互。
关闭音乐我们采用打开空文件的方法,选择音乐我们使用网易云音乐的API来完成:
导入操作系统
# 通过此命令安装API:pip install NetEaseMusicApi
从NetEaseMusicApi导入interact_select_song
with open('stop.mp3', 'w') as f通过
def close_music():
os.startfile('停止.mp3')
通过itchat包可以轻松完成对微信的调用。这里需要注意的是:
有些帐户无法与自身通信,因此我们选择与文件助手通信
为了防止回复其他消息,我们在第一行过滤掉不相关的信息
itchat.run的选项是允许热插拔,以方便调试。
# 继续之前的程序
# 通过此命令安装API:pip install itchat
导入itchat
@itchat.msg_register(itchat.content.TEXT)
def 音乐播放器(消息):
if msg['ToUserName'] !='filehelper'返回
if msg['Text']==u'关闭':
关闭音乐()
itchat.send(u'音乐已关闭', 'filehelper')
if msg['Text']==u'help':
itchat.send(u'帮助信息', 'filehelper')
别的:
itchat.send(interact_select_song(msg['Text']), 'filehelper')
itchat.auto_login(True)
itchat.send(HELP_MSG, '文件助手')
itchat.run()
itchat已经封装了常用的函数,调用起来非常方便。
我把完整的程序放在要点上。使用时别忘了安装第三方包。
通过与文件传输助手交互,微信可以轻松成为其他程序的入口。
群发助手
短信时代,节假日期间需要收发大量短信。
虽然看到短信很烦,但不发又怕错过什么。
因此,当时就产生了各种短信群发工具。最简单的方法包括在消息中添加昵称,使其感觉不像群发消息。
但可惜的是,微信内置的群发助手其实只是群发而已。
当然,只要稍加努力,一切皆有可能。
例如,为消息添加昵称:
你可以通过get_friends方法轻松获取你所有的好友(第一个好友就是你自己)
可以根据不同的好友发送不同的消息
这个程序运行后实际上会发送消息。如果只是为了演示目的,只需将itchat.send 更改为print 即可。
#编码=utf8
导入itchat、时间
itchat.auto_login(True)
SINCERE_WISH=u'祝%s 新年快乐!'
朋友列表=itchat.get_friends(update=True)[1:]
对于朋友列表中的朋友:
# 如果是为了演示目的,只需将下面的方法改为打印即可
itchat.send(SINCERE_WISH % (朋友['DisplayName']
或朋友['昵称']), 朋友['用户名'])
时间.睡眠(.5)
另一个例子是向特定的人发送特定的消息。
我们通过群聊的方式来实现,划定一个群聊,在群聊内通过私信发送祝福。
如果你只是创建群聊而不说话,对方不会收到提示。
如果群聊没有保存到通讯录,则无法在设备之间同步(所以itchat无法读取)
群聊在获取时不会自带自己的用户列表,所以需要使用update_chatroom 来更新用户列表。
当然,如果只是为了演示目的,将itchat.send改为print即可。
#编码=utf8
导入itchat、时间
itchat.auto_login(True)
REAL_SINCERE_WISH=u'祝%s 新年快乐!'
聊天室名称='愿望组'
itchat.get_chatrooms(更新=True)
聊天室=itchat.search_chatrooms(name=chatroomName)
如果聊天室为None:
print(u'未找到群聊:' + chatroomName)
别的:
聊天室=itchat.update_chatroom(聊天室[0]['用户名'])
对于聊天室中的朋友['MemberList']:
朋友=itchat.search_friends(userName=friend['UserName'])
# 如果是为了演示目的,只需将下面的方法改为打印即可
itchat.send(REAL_SINCERE_WISH % (朋友['DisplayName']
或朋友['昵称']), 朋友['用户名'])
时间.睡眠(.5)
所以我的通讯录里会有我从来不用的客户群、老师群等等。
我把完整的程序放在要点上。使用时别忘了安装第三方包。
当然,为了防止误操作,我在完整的程序中将itchat.send全部替换成了print。
另外,不仅可以发送文本,还可以发送文件和图片。具体操作请查看itchat的文档。
itchat也很方便的获取微信可以获取的各种内容。
其余的,比如生日、节假日等,就看具体需要了。
好友删除检测
图片
有时我们想知道朋友是否删除了我们或将我们列入黑名单。
使用itchat这个操作也会变得非常简单。
原则是添加好友到群聊时,非好友和黑名单好友不会被添加到群聊。
因此,群聊的返回值中包含了你和好友之间关系的数据。
另外,群聊只有在第一次产生普通消息时才会被创建者以外的人发现(系统消息不算普通消息)。
这样就可以隐蔽地完成好友检测。
用代码写的话,这个操作是这样的:(只是演示,不能运行,运行版本在段末)
聊天室用户名='@1234567'
朋友=itchat.get_friends()[1]
r=itchat.add_member_into_chatroom(chatroomUserName, [friend])
如果r['BaseResponse']['ErrMsg']=='':
状态=r['会员列表'][0]['会员状态']
itchat.delete_member_from_chatroom(聊天室['用户名'], [朋友])
return { 3u'该好友已将您加入黑名单。 ',
4:u'这个朋友已经删除了你。 ', }.get(状态,
你这个朋友仍然是你的朋友。 ')
其中,通过add_member_into_chatroom操作获取我们需要的返回值,就可以获取好友的状态。
同样,这次我们也使用文件传输助手作为终端,具体方法与控制器部分类似。
我们这次确定的交互方式是接收“名片”消息,判断名片中的好友与我们自己的关系。
那么获取名片信息的内容可以这样写:
导入itchat
@itchat.msg_register(itchat.content.CARD)
def get_friend(消息):
if msg['ToUserName'] !='filehelper'返回
friendStatus=get_friend_status(msg['RecommendInfo'])
itchat.send(friendStatus['NickName'], 'filehelper')
itchat.auto_login(True)
itchat.run()
那么我们需要的所有部分都解决了,让我们把它们放在一起。
我把完整的程序放在要点上。使用时别忘了安装第三方包。
在网页版微信界面被限制之前,你可以批量执行此操作,检测哪些好友删除了你。
但目前的操作显然是有频率限制的,所以我们只能做一些修改。