之前所做的有一个特点就是需要在树莓派上连接一个USB麦克风,通过这个麦克风来进行语音的输入,但是在实际使用场景上来看,这是不合理的,因此需要一个可以远程操控智能小车的方案,因此萌发了将控制端移植到手机上的想法,移植到手机上也有几个不同的方案。
1. 通过Zigbee无线传输技术进行数据的传输
优点:易于进行扩展,可方便的与其他智能家居连接起来
缺点:传输的数据量很小,不适用于语音数据以及图像数据的传递
2. 通过搭建一个服务器,开发一个手机APP,通过服务器进行数据的传输
优点:自己搭建服务器, 可控制性强
缺点:开发门槛高(需要进行服务器的搭建以及手机应用的开发,不易实现)以及使用门槛高(需要单独在手机上安装一个APP)
3. 通过微信平台,进行数据(文本、语音、图像、视频)的传递
优点:人人都有微信,使用门槛低,功能相对全面
缺点:可控制性相对较弱
最终经过权衡,选取第三个方案,通过微信控制智能小车。
itchat
itchat是一个开源的微信个人号接口,使用python调用微信从未如此简单。可以通过它进行微信消息的读取,回复,联系人的读取等等
1. 安装
pip install itchat
2. 简单入门
1.登陆配置
登陆使用的是itchat提供了auto_login方法,调用即可完成登录。
一般而言,会在完成消息的注册之后再进行登陆。
这里需要特别强调的是两点,分别是短时间关闭重连、命令行二维码。
* itchat提供了登陆状态暂存,关闭程序后一定时间内不需要扫码即可登录。由于目前微信网页版提供上一次登录的微信号不扫码直接手机确认登陆,所以如果开启登陆状态暂存将会自动使用这一功能。
* 为了方便在无图形界面使用itchat,程序内置了命令行二维码的显示。
短时间关闭程序后重连
这样即使程序关闭,一定时间内重新开启也可以不用重新扫码。
最简单的用法就是给auto_login方法传入值为真的hotReload。
该方法会生成一个静态文件itchat.pkl,用于存储登陆的状态。
import itchat
from itchat.content import TEXT
@itchat.msg_register(TEXT)
def simple_reply(msg):
print(msg.text)
itchat.auto_login(hotReload=True)
itchat.run()
命令行二维码显示
通过以下命令可以在登陆的时候使用命令行显示二维码:
itchat.auto_login(enableCmdQR=True)
部分系统可能字幅宽度有出入,可以通过将enableCmdQR赋值为特定的倍数进行调整:如部分的linux系统,块字符的宽度为一个字符(正常应为两字符),故赋值为2
itchat.auto_login(enableCmdQR=2)
2.聊天对象
在使用个人微信的过程当中主要有三种账号需要获取,分别为:
* 好友
* 公众号
* 群聊
itchat为这三种账号都提供了整体获取方法与搜索方法。群聊多出获取用户列表方法以及创建群聊、增加、删除用户的方法。
接下来对三种分别介绍如何使用以及如何通过唯一的Uin确定好友与群聊。
好友
好友的获取方法为get_friends,将会返回完整的好友列表。
* 其中每个好友为一个字典
* 列表的第一项为本人的账号信息
* 传入update键为True将可以更新好友列表并返回
好友的搜索方法为search_friends,有四种搜索方式:
1. 仅获取自己的用户信息
2. 获取特定UserName的用户信息
3. 获取备注、微信号、昵称中的任何一项等于name键值的用户
4. 获取备注、微信号、昵称分别等于相应键值的用户
下面是示例程序:
获取自己的用户信息,返回自己的属性字典
itchat.search_friends()
获取特定UserName的用户信息
itchat.search_friends(userName='@abcdefg1234567')
获取任何一项等于name键值的用户
itchat.search_friends(name='littlecodersh')
获取分别对应相应键值的用户
itchat.search_friends(wechatAccount='littlecodersh')
其中3、4项功能可以一同使用,将返回同时满足两个条件的好友
itchat.search_friends(name='LittleCoder机器人', wechatAccount='littlecodersh')
更新用户信息的方法为update_friend。
* 该方法需要传入用户的UserName,返回指定用户的最新信息
* 也可以传入UserName组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
memberList = itchat.update_friend('@abcdefg1234567')
公众号
公众号的获取方法为get_mps,将会返回完整的公众号列表。
* 其中每个公众号为一个字典
* 传入update键为True将可以更新公众号列表并返回
公众号的搜索方法为search_mps,有两种搜索方法:
1. 获取特定UserName的公众号
2. 获取名字中含有特定字符的公众号
如果两项都做了特定,将会仅返回特定UserName的公众号,下面是示例程序:
获取特定UserName的公众号,返回值为一个字典
itchat.search_mps(userName='@abcdefg1234567')
获取名字中含有特定字符的公众号,返回值为一个字典的列表
itchat.search_mps(name='LittleCoder')
以下方法相当于仅特定了UserName
itchat.search_mps(userName='@abcdefg1234567', name='LittleCoder')
群聊
群聊的获取方法为get_chatrooms,将会返回完整的群聊列表。
* 其中每个群聊为一个字典
* 传入update键为True将可以更新群聊列表并返回通讯录中保存的群聊列表
* 群聊列表为后台自动更新,如果中途意外退出存在极小的概率产生本地群聊消息与后台不同步
* 为了保证群聊信息在热启动中可以被正确的加载,即使不需要持续在线的程序也需要运行itchat.run()
* 如果不想要运行上述命令,请在退出程序前调用itchat.dump_login_status()
,更新热拔插需要的信息
群聊的搜索方法为search_chatrooms,有两种搜索方法:
1. 获取特定UserName的群聊
2. 获取名字中含有特定字符的群聊
如果两项都做了特定,将会仅返回特定UserName的群聊,下面是示例程序:
获取特定UserName的群聊,返回值为一个字典
itchat.search_chatrooms(userName='@@abcdefg1234567')
获取名字中含有特定字符的群聊,返回值为一个字典的列表
itchat.search_chatrooms(name='LittleCoder')
以下方法相当于仅特定了UserName
itchat.search_chatrooms(userName='@@abcdefg1234567', name='LittleCoder')
群聊用户列表的获取方法为update_chatroom。
* 如果想要更新该群聊的其他信息也可以用该方法
* 群聊在首次获取中不会获取群聊的用户列表,需要调用该命令才能获取群聊的成员
* 该方法需要传入群聊的UserName,返回特定群聊的详细信息
* 也可以传入UserName组成的列表,那么相应的也会返回指定用户的最新信息组成的列表
memberList = itchat.update_chatroom('@@abcdefg1234567', detailedMember=True)
创建群聊、增加、删除群聊用户的方法如下所示:
* 由于之前通过群聊检测是否被好友拉黑的程序,目前这三个方法都被严格限制了使用频率
* 删除群聊需要本账号为群管理员,否则会失败
* 将用户加入群聊有直接加入与发送邀请,通过useInvitation设置
* 超过40人的群聊无法使用直接加入的加入方式,特别注意
memberList = itchat.get_friends()[1:]
chatroomUserName = itchat.create_chatroom(memberList, 'test chatroom') # 创建群聊,topic键值为群聊名
itchat.delete_member_from_chatroom(chatroomUserName, memberList[0]) # 删除群聊内的用户
itchat.add_member_into_chatroom(chatroomUserName, memberList[0], useInvitation=False) # 增加用户进入群聊
Uins
Uin 就是微信中用于标识用户的方式,每一个用户、群聊都有唯一且不同的Uin。通过Uin,即使退出了重新登录,也可以轻松的确认正在对话的是上一次登陆的哪一个用户。但注意,Uin与其他值不同,微信后台做了一定的限制,必须通过特殊的操作才能获取。
最简单来说,首次点开登陆用的手机端的某个好友或者群聊,itchat就能获取到该好友或者群聊的Uin。
如果想要通过程序获取,也可以用程序将某个好友或者群聊置顶(取消置顶)。
这里提供一个提示群聊更新的程序:
import re, sys, json
import itchat
from itchat.content import *
itchat.auto_login(True)
@itchat.msg_register(SYSTEM)
def get_uin(msg):
if msg['SystemInfo'] != 'uins': return
ins = itchat.instanceList[0]
fullContact = ins.memberList + ins.chatroomList + ins.mpList
print('** Uin Updated **')
for username in msg['Text']:
member = itchat.utils.search_dict_list(
fullContact, 'UserName', username)
print(('%s: %s' % (
member.get('NickName', ''), member['Uin']))
.encode(sys.stdin.encoding, 'replace'))
itchat.run(True)
每当Uin更新了,就会打印相应的更新情况。
3.消息处理
消息内容
微信初始化消息、文本消息、图片消息、小视频消息、地理位置消息、名片消息、语音消息、动画表情、普通链接或应用分享消息、音乐链接消息、群消息、红包消息、系统消息
回复方法
- 方法:
send(msg='Text Message', toUserName=None)
- 所需值:
- msg:消息内容
- ‘@fil@文件地址’将会被识别为传送文件
- ‘@img@图片地址’将会被识别为传送图片
- ‘@vid@视频地址’将会被识别为小视频
- toUserName:发送对象,如果留空将会发送给自己
- 返回值:发送成功->True, 失败->False
- 程序示例:使用的素材可以在这里下载
#coding=utf8
import itchat
itchat.auto_login()
itchat.send('Hello world!')
# 请确保该程序目录下存在:gz.gif以及xlsx.xlsx
itchat.send('@img@%s' % 'gz.gif')
itchat.send('@fil@%s' % 'xlsx.xlsx')
itchat.send('@vid@%s' % 'demo.mp4')
4.注册方法
itchat将根据接收到的消息类型寻找对应的已经注册的方法。如果一个消息类型没有对应的注册方法,该消息将会被舍弃。
注册
可以通过两种方式注册消息方法
import itchat
from itchat.content import *
# 不带具体对象注册,将注册为普通消息的回复方法
@itchat.msg_register(TEXT)
def