基于极光消息JMessage实现一个智能(智障)机器人小助手【系列一】

70 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第5天,点击查看活动详情

应用内聊天和跨应用聊天是一些toB的应用不可或缺的功能之一,极光IM借助极光推送的长链接通道,提供了一个IM一揽子解决方案 本文将以极光IM为例,实现一个小型机器人demo,机器人的注册有两种方式,一种是特定uid,一种是通过极光的实时消息路由。下面将会针对这两种方式,分别进行简要说明。

机器人注册方式一 特定uid

极光消息是以应用为维度的,我们可以通过sdk提供的方法进行用户注册,也可以通过极光提供rest api进行注册

// 基于极光sdk进行机器人用户初始化
// sdk初始化
  const JIM = new JMessage();
  JIM.init({
               "appkey" : "<appkey>",
           "random_str" : "<random_str>",
            "signature" : "<signature>",
            "timestamp" : "<timestamp>",
            "flag" : 0
        }).onSuccess(function(data) {
           //data.code 返回码
           //data.message 描述
          }).onFail(function(data) {
            // 同上
        });

机器人注册

// robot init and login
  JIM.register({
        'username' : 'robot',
        'password' : '<register password="">',
          'is_md5' : <is_md5>,
          'extras' : {'key1':'val1','key2':'val2'},
         'address' : '深圳'
        }).onSuccess(function(data) {
            //data.code 返回码
            //data.message 描述
          }).onFail(function(data) {
            // 同上
        });</is_md5></register></register>

机器人登录

JIM.login({
    'username' : 'robot',
    'password' : '<login password="">'
}).onSuccess(function(data) {
     //data.code 返回码
     //data.message 描述
     //data.online_list[] 在线设备列表
     //data.online_list[].platform  Android,ios,pc,web
     //data.online_list[].mtime 最近一次登录时间
     //data.online_list[].isOnline 是否在线 true or false
     //data.online_list[].isLogin 是否登录 true or false
     //data.online_list[].flag 该设备是否被当前登录设备踢出 true or false
}).onFail(function(data){
  //同上
});</login></login>

注册实时消息监听

JIM.onMsgReceive(function(data) {
   // data.messages[]
   // data.messages[].ctime_ms
   // data.messages[].msg_type 会话类型
   // data.messages[].msg_id
   // data.messages[].from_appey 单聊有效
   // data.messages[].from_username 单聊有效
   // data.messages[].from_gid 群聊有效
   // data.messages[].need_receipt
   // data.messages[].content
   // data.messages[].custom_notification.enabled
   // data.messages[].custom_notification.title
   // data.messages[].custom_notification.alert
   // data.messages[].custom_notification.at_prefix
});

注册离线消息监听

JIM.onSyncConversation(function(data) {
   // data[]
   // data[].msg_type 会话类型
   // data[].from_appey 单聊有效
   // data[].from_username 单聊有效
   // data[].from_gid 群聊有效
   // data[].unread_msg_count 消息未读数
   // 消息已读回执状态,针对自己发的消息
   // data[].receipt_msgs[]
   // data[].receipt_msgs[].msg_id
   // data[].receipt_msgs[].unread_count
   // data[].receipt_msgs[].mtime
   // 消息列表
   // data[].msgs[]
   // data[].msgs[].msg_id
   // data[].msgs[].content
   // data[].msgs[].msg_type
   // data[].msgs[].ctime_ms
   // data[].msgs[].need_receipt
   // data[].msgs[].custom_notification.enabled
   // data[].msgs[].custom_notification.title
   // data[].msgs[].custom_notification.alert
   // data[].msgs[].custom_notification.at_prefix
});

基于接收消息的内容进行分词,智能回复

function actionMsg (content) {
  return '对不起,我没理解你的意思。。。请再说一次'
}
JIM.onMsgReceive(function(data) {
   // data.messages[]
   // data.messages[].ctime_ms
   // data.messages[].msg_type 会话类型
   // data.messages[].msg_id
   // data.messages[].from_appey 单聊有效
   // data.messages[].from_username 单聊有效
   // data.messages[].from_gid 群聊有效
   // data.messages[].need_receipt
   // data.messages[].content
   // data.messages[].custom_notification.enabled
   // data.messages[].custom_notification.title
   // data.messages[].custom_notification.alert
   // data.messages[].custom_notification.at_prefix
   data.messages.map(v => {
       if (actionMsg(v.content)) {
         JIM.sendSingleMsg({
            'target_username' : v.form_username,
            'content' : actionMsg(v.content)
        }).onSuccess(function(data) {
            // do something
        }).onFail(function(data) {
            // do something
        }).onTimeout(function(data) {
            if (data.response_timeout) {
                // do something when response timeout
            } else {
                // do something when request timeout
            }
        }).onAck(function(data) {
            // do something
        });
       }
   })
});