消息
目前wxrobot支持以下消息类型
- 文本消息 TextMessage
- 图片消息 ImageMessage
- 语音消息 VoiceMessage
- 小视频消息(调试中) Video Message
- 初始化消息 InitMessage
- 撤回消息 RevokeMessage
- 名片消息 RecommendMessage
- 位置消息 LocationMessage
其他的消息归为:未知消息(UnKnownMessag)
为了对消息进行回复,需要编写对应的handler来处理消息,有两种方式可以添加handler:
api.add_handler(func,type)
:先定义好方法调用handler,其中type为'all','text','image'等,因为要手写type可能会出错,不推荐。- 装饰器方式:直接装饰方法为handler,推荐。
所有消息
wxrobot提供了一个接收所有消息的handler接口。
@api.allMsg
def allMsgHandler(message):
print('%s给%s发了一条消息'%(messag.fromUserName,message.toUserName))
handler的方法是随意的,但是要加上allMsg
装饰器,方法必须至少包含一个属性,即message;
message提供了多个属性用于获取消息的信息,目前的属性及对应信息如下:
- fromUserName : message的来源的备注名或备注名
- toUserName : message的目标用户备注名或昵称名
- fromUserId : message的来源的用户ID
- toUserId : message的目标的用户ID
- msgId : 消息的id
- createTime : 消息的创建时间
- isBatch : bool值,为True时是群消息,为False时是普通消息
- fromMemberName : 只有为群消息时才有该属性,为群消息来源的群成员备注名或者昵称
- fromMemberId : 只有为群消息时才有该属性,为群消息来源的群成员用户ID
- content : 当为文本消息时,content是消息内容,而当为其他类型的时候是消息的原始内容。
除了以上共有属性,每种message还有各自的属性。
文本消息
@api.textMsg
def textMsgHandler(message):
print('%s给%s发了一条文本消息消息:%s'%(message.fromUserName,message.toUserName,message.content))
文本消息的内容都存储在message的content属性中。
位置消息
位置消息本质上其实是文本消息,但是在wxrobot中文本消息的handler并不会收到位置消息。
@api.location
def LocationMsgHandler(message):
print('%s给你发了一个位置:[我在%s]'%(message.fromUserName,message.location))
位置信息存储在message的location属性中,这是一个str对象。
图片消息
wxrobot遇到图片消息会先将图片缓存到本地,缓存的存储地址在message的image属性中,如果你想打开图片可以用wxrobot自带的open方法,也可以自己处理。
@api.imageMsg
def TextMsgHandler(message):
print('%s给%s发了一张图片'%(message.fromUserName,message.toUsername))
robot.open(message.image)
语音消息
语音消息的策略跟图片消息类似,也是先缓存本地,再返回缓存地址,message的voic属性即存储语音地址。wxrobot在linux下打开语音消息默认使用mpg123
,如果没有必须先安装,当然你也可以自己处理。
@api.voiceMsg
def VoiceMsgHandler(message):
print('-> %s给%s发了一段语音'%(message.fromUserName,message.toUserName))
robot.open(message.voice) #打开语音消息,linux下需要安装mpg123
小视频消息
同上,默认打开方式是vlc,如果没有可以安装,也可以自己处理。目前小视频缓存成功但是不能播放,还在调试中
@api.videoMsg
def VideoMsgHandler(message):
print('-> %s给%s发了一段小视频'%(message.fromUserName,message.toUserName))
robot.open(message.video) #打开视频消息,linux需要安装vlc
名片消息
名片消息内容存储在message的recommend属性中,你可以直接打印出来就有漂亮的效果了。
@api.recommend
def recommendMsgHandler(message):
print('-> %s给%s发了一张名片'%(message.fromUserName,message.toUserName))
print(message.recommend)
撤回消息
当某个用户撤回消息时(不论是不是群成员),都会调用相应的handler,撤回消息的msgid存储在message的msgid中,如果你有缓存消息,可以通过msgid查到对应撤回的消息
@api.revoke
def revokeMsgHandler(message):
print('-> %s向%s撤回了一条消息(%s)'%(message.fromUserName,message.toUserName,message.msgId))
初始化消息
当初次登陆或在手机上玩微信后都会收到一个初始化消息。初始化消息内容如下:
MsgType: 51
FromUserName: 自己ID
ToUserName: 自己ID
StatusNotifyUserName: 最近联系的联系人ID
Content:
<msg>
<op id='4'>
<username>
// 最近联系的联系人
filehelper,xxx@chatroom,wxid_xxx,xxx,...
</username>
<unreadchatlist>
<chat>
<username>
// 朋友圈
MomentsUnreadMsgStatus
</username>
<lastreadtime>
1454502365
</lastreadtime>
</chat>
</unreadchatlist>
<unreadfunctionlist>
// 未读的功能账号消息,群发助手,漂流瓶等
</unreadfunctionlist>
</op>
</msg>
未知消息
不能分类的消息都会被划分为UnknownMessage,拥有共有属性,没有私有属性。