持续创作,加速成长!这是我参与「掘金日新计划 · 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
});
}
})
});