消息

目前wxrobot支持以下消息类型

  • 文本消息 TextMessage
  • 图片消息 ImageMessage
  • 语音消息 VoiceMessage
  • 小视频消息(调试中) Video Message
  • 初始化消息 InitMessage
  • 撤回消息 RevokeMessage
  • 名片消息 RecommendMessage
  • 位置消息 LocationMessage

其他的消息归为:未知消息(UnKnownMessag)

为了对消息进行回复,需要编写对应的handler来处理消息,有两种方式可以添加handler:

  1. api.add_handler(func,type):先定义好方法调用handler,其中type为'all','text','image'等,因为要手写type可能会出错,不推荐。
  2. 装饰器方式:直接装饰方法为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,拥有共有属性,没有私有属性。