1.1.65 • Published 6 months ago

agent-sdk v1.1.65

Weekly downloads
-
License
MIT
Repository
-
Last release
6 months ago

座席端SDK

适用版本agent-sdk_1.1.65

使用SDK之前,请确保你有一个可使用的SIP话机或使用WebRTC插件, 用于完成通话

DEMO获取

获取demo, 点击下载

安装

<script src="/agent-sdk/agent-sdk_1.1.65.js"></script>

or

// 仅支持私服
npm install agent-sdk

快速使用

import AgentSdk from 'agent-sdk';

const op = {
    el: '#ElementId',
    url: 'WS地址',
    agentNumber: '座席工号',
    password: '座席密码',
    companyShortName: '企业简称'
}
const agentSdk = new AgentSdk(op);

agentSdk.call('21000');
agentSdk.on('MakeCall', (res) => {
    // 外呼发起
});
agentSdk.on('After', (res) => {
    // 通话结束
});

初始化配置 SDKOptions

new AgentSdk(options)中,options配置项如下:

  • url: string 必传

    远程websocket服务地址

  • companyShortName: string 必传

    使用该应用的企业简称,可以在OBC查看。

  • agentNumber: string 必传

    登录的目标坐席工号。

  • agentPassword: string 必传

    登录的目标坐席密码。

  • connectAccount: string 必传

    远程队列服务账号。

  • connectPassword: string 非必传

    远程队列服务密码。

  • subscribePath: string 必传

    远程队列服务订阅地址。

  • host: string 必传

    远程队列服务连接Virtual Host地址。

  • el: string default: ''

    接收一个元素选择器,用于指定SDK的UI控件的显示位置, 不传则不展示UI控件。

<div id="sdk-box"></div>

const sdk = new AgentSdk({
    el: '#sdk-box',
    ...
});

如果配置正确, 会有如图控件出现在页面上的指定元素内。

npm.io

  • pingInterval: number default: 10000

    ws链接心跳间隔, 必须大于0

  • timeout: number default: 5000

    请求超时时间。

  • maxReconnect: number default: 10

    最大重连次数, 当链接失败或链接关闭时, 会自动发起重新链接, 连续重连次数达到该值的时候会停止重连, 连接成功之后会重新计算, 配置时请注意不要超过浏览器的最大链接数量, 以下是各个浏览器的最大链接数量, 以供参考: Chrome: 256个 FireFox: 200个 safari: 1273个

  • unDownloadLog: boolean default: false

    是否关闭下载日志

  • phoneEncryption: boolean default: true

    是否开启手机号脱敏

  • softPhoneFactory: Function

    只有当loginType3的时候才生效

    指定WebRTC话机构造函数, 未指定则在全局对象`window`上查找 `SoftPhoneSdk`, 当座席成功登录之后, 话机会自动注册, 并用采用默认配置进行通话
import AgentSdk from 'agent-sdk';
import SoftPhoneSdk from 'soft-phone-sdk';

const agentSdk = new AgentSdk({
	loginType: 3,
	softPhoneFactory: SoftPhoneSdk,
	...
});

const loginAndReconnect = () => {
	// 获取软话机实例, 用于对话机操作
	const softPhoneInstance = agentSdk.getSoftPhoneInstance();
	
	softPhoneInstance.on('Registered', () => {
		console.log('话机注册完成');
	})
}

agentSdk.on('Login', () => loginAndReconnect());
agentSdk.on('Reconnect', () => loginAndReconnect());
  • autoAnswer: boolean default: false

    	开启自动应答, 默认关闭, 仅`WebRTC`话机生效, 当座席发起外呼时强制使用

配合WebRTC话机

当前版本SDK内置了WebRTC话机, 在https环境中使用loginType: 3, 自动就会使用WebRTC话机

API

const sdk = new AgentSdk(options)中,可以通过sdk直接调用的方法。

  • getVersion(): string

    获取当前SDK版本号。

  • getLoginType(): LoginType

    获取当前登录类型

  • init(sdkOption ?: SDKOptions)

    接收一个SDK配置对象,将当前实例再次初始化,new AgentSdk(options)会自动调用,当你需要重新初始化SDK的时候可以使用, 失败会抛异常。

  • connect()

    发起ws连接请求,返回一个连接实例,new AgentSdk(options)会自动调用,当你需要手动建立新连接的时候可以使用。

  • login(loginConfig ?: LoginOptions)

    使用初始化时候的配置进行登录, 或指定配置进行登陆。 LoginOptions成员如下:

属性名类型含义是否必填
agentNumberstring座席工号
passwordstring座席密码
companyShortNamestring企业简称
loginTypenumber登录话机类型1 sip话机; 2 手机; 3 WebRTC话机
  • logout()

    退出当前座席。

  • break()

    退出并断开连接,通话期间不允许断开。

  • call(called: string, calledType: number = 2, caller ?: string)

    指定被叫,发起呼叫, calledType是呼叫类型 1为坐席号,2为手机。caller是透传指定主叫号码

  • hangup()

    挂断当前通话,拨通与呼叫中都可以使用。

  • busy(busyType ?: string)

    将当前座席的状态设置为忙碌Busy, 可以指定忙碌类型, 登录时会返回可选的忙碌类型。

  • idle()

    将当前座席的状态设置为空闲Idle

  • mute()

    开启静音, 通话中可使用。

  • unMute()

    解除静音, 开启静音后可使用。

  • transferCall (target: string, transferType: number)

    转接当前正在进行的通话,target表示要转接的目标,transferType表示转接目标的号码类型,1座席工号, 2手机号, 3技能组ID, 4 IVR模版ID。

  • consult(consultTarget: string)

    发起咨询,consultTarget表示要咨询的目标。

  • consultTransfer()

    咨询转接。

  • tripartiteCall()

    会议或三方通话。

  • 	对`sdk`的事件进行监听,当事件触发时调用`callback`, 返回一个监听的`uuid`用于取消监听, 支持的事件名称在[EventMap](#EventMap)部分找到。
const uuid = sdk.on('Open', data => {
    // 链接建立成功
})
  • 	对`sdk`的事件进行监听,当事件触发时调用`callback`, 返回一个监听的`uuid`用于取消监听, 支持的事件名称在[EventMap](#EventMap)部分找到, 与`on`不同的是, `once`绑定的事件在触发之后会自动解绑, 一次绑定只会触发一次。
const uuid = sdk.once('Open', data => {
    // 链接建立成功
})
  • off(eventName: string, uuidOrFn: string | Function): boolean

    取消一个SDK的事件监听, 需要指定eventName, 可以使用指定函数引用或监听的uuid
sdk.off('Open', uuid);
// or
sdk.off('Open', functionPointer);
  • isConnected(): boolean

    是否已链接

  • isLogin(): boolean

    是否已登录

  • getSoftPhoneInstance(): object

    当前使用的软话机实例, 用于对话机操作

班长座席 API

以下AIP的使用,需要当前登录座席是班长。

  • surveillance()

    发起一次监控请求。

  • surveillanceStart(filter ?: SurveillanceFilter, interval: number = 2000)

    开启监控, 自动发起监控请求 interval 是请求间隔, 默认两秒, filter 是监控信息的过滤, 当传递filter时, 必须包含groupId

属性名类型含义
SurveillanceFilter.groupIdstring技能组ID
SurveillanceFilter.agentNumberstring座席工号
SurveillanceFilter.agentNamestring座席名称
SurveillanceFilter.agentStatestring座席状态
SurveillanceFilter.callDirectionnumber呼入方向,0 呼入,1 呼出
  • surveillanceEnd()

    关闭监控

  • forceIdle(target: string)

    强制空闲,target表示目标座席工号。

  • forceBusy(target: string)

    强制忙碌,target表示目标座席工号。

  • forceLogout(target: string)

    强制退出,target表示目标座席工号。

  • listen(target: string)

    监听通话,target表示目标座席工号,目标必须处于通话中。

  • forceBreak(target: string)

    强制挂断通话,target表示目标座席工号,目标必须处于通话中。

  • forceInsert(target: string)

    强制插入通话,target表示目标座席工号,目标必须处于通话中。

  • intercept(target: string)

    拦截通话,target表示目标座席工号,目标必须处于通话中。

  • getStateByAgentId(agentNumber: string)

    获取指定座席工号的状态。

  • getIdleAgentByGroupId(groupId: string)

    获取技能组下的空闲坐席, 通过监听IdleAgent事件拿到数据。

  • getGroups()

    获取所有技能组, 通过监听GroupInfo事件拿到数据。

  • getAutoGroups()

    获取可预测外呼的技能组。

WebRTC话机相关API

当使用内置WebRTC话机时, 可以使用一下方法快速操作话机, 更多操作话机的方法请使用getSoftPhoneInstance

  • isRegistered()

    获取话机是否注册

  • register()

    发起话机注册

  • unregister()

    取消话机注册

  • stop()

    取消话机注册, 并断开链接

可以通过sdk.on方法绑定或解绑并取得响应数据的事件名称集合。

sdk.on('Login', res => { ... })

所有事件都会包含以下公共信息:

属性名类型含义
sequencenumber请求发起时间戳
eventTimenumber事件触发时间戳
nowStatestring座席当前状态
userdatastring用户透传数据, 使用setUserdata指定
typestring事件标识, 固定取值event
eventstring事件名称
dataany事件数据, 具体类型查看对应事件的回传数据
ivrParamstring一个json字符串, ivr交互参数,只有AgentRinging AgentAnswer Conversation After事件会携带

可监听的事件名称如下:

  • Open

    成功建立链接 回传数据类型: Frame 链接相关信息

  • Error

    建立链接失败 回传数据类型: Event 错误信息

  • Close

    链接关闭 回传数据类型: Frame 链接相关信息

  • Login

    登陆成功 回传数据类型: Object

属性名类型含义
domainstringSIP话机注册域
sipIdstringSIP号
sipPasswordstringSIP密码
tokenstring登陆SDK身份标识
agentTypenumber座席类型 0 普通座席;1 班长
groupIdListArray<string>座席所属技能组Id集合
busyTypestring所在企业配置的可选忙碌类型
  • Logout

    退出成功 回传数据类型: null

  • Reconnect

    重链成功, 只有首次登录和退出后的登录会触发Login, 在缓存token信息失效之前, 都会触发Reconnect, 用于恢复座席状态

    回传数据类型: `Object`
属性名类型含义
domainstringSIP话机注册域
sipIdstringSIP号
sipPasswordstringSIP密码
tokenstring登陆SDK身份标识
agentTypenumber座席类型 0 普通座席;1 班长
groupIdListArray<string>座席所属技能组Id集合
busyTypestring所在企业配置的可选忙碌类型
  • Idle

    制闲操作成功 回传数据类型: null

  • Busy

    制忙操作成功 回传数据类型: null

  • MakeCall

    发起通话成功 回传数据类型: null

  • MakeCallFail

    发起通话失败 回传数据类型: Object

属性名类型含义
causestring失败原因描述
  • AgentRinging

    座席振铃 回传数据类型: Object
属性名类型含义
callerstring主叫
calledstring被叫
inQueueTimenumber进入队列时间戳
callDirectionnumber呼叫方向(1: 呼入 2: 呼出)
  • AgentAnswer

    座席应答 回传数据类型: Object
属性名类型含义
callerstring主叫
calledstring被叫
inQueueTimenumber进入队列时间戳
callDirectionnumber呼叫方向(1: 呼入 2: 呼出)
  • CalledRinging

    被叫振铃 回传数据类型: Object
属性名类型含义
callerstring主叫
calledstring被叫
inQueueTimenumber进入队列时间戳
callDirectionnumber呼叫方向(1: 呼入 2: 呼出)
  • CalledAnswer

    被叫应答 回传数据类型: Object
属性名类型含义
callerstring主叫
calledstring被叫
inQueueTimenumber进入队列时间戳
callDirectionnumber呼叫方向(1: 呼入 2: 呼出)
  • Conversation

    通话中 回传数据类型: Object
属性名类型含义
callerstring主叫
calledstring被叫
inQueueTimenumber进入队列时间戳
callDirectionnumber呼叫方向(1: 呼入 2: 呼出)
callTypestringnormal(正常呼叫),consult(咨询),transfer(转接)listen(监听),forceInsert(强插),intercept(拦截)
  • TransferCall

    发起转接, 只有在通话中才能发起 回传数据类型: null

  • TransferCalling

    转接中 回传数据类型: null

  • TransferCallFail

    转接失败 回传数据类型: null

  • Listen

    发起监听 回传数据类型: null

  • Listening

    监听中 回传数据类型: null

  • ListenFail

    监听失败 回传数据类型: null

  • ForceBreak

    强制断开通话 回传数据类型: null

  • ForceInsert

    强制插入通话 回传数据类型: null

  • ForceInserting

    强制插入通话中 回传数据类型: null

  • ForceInsertFail

    强制插入通话失败 回传数据类型: null

  • Intercept

    拦截通话 回传数据类型: null

  • Intercepting

    拦截通话中 回传数据类型: null

  • InterceptFail

    拦截失败 回传数据类型: null

  • 	话后
    	回传数据类型: `Object`
属性名类型含义
callerstring主叫
calledstring被叫
occCallIdstring呼叫唯一标识
inQueueTimenumber进入队列时间戳
callDirectionnumber呼叫方向(1: 呼入 2: 呼出)
recordPathstring录音文件路径
hangupDirectionnumber挂机方向,0本端,1对端
beginTimenumber开始时间
ringTimenumber振铃时间
answerTimenumber应答时间
endTimenumber结束时间
causenumber挂机原因cause码
datanumber挂机原因说明
callTypestringnormal(正常呼叫),consult(咨询),transfer(转接)listen(监听),forceInsert(强插),intercept(拦截)
agentAutoIdlenumber是否开启自动空闲, 1 开启 0 关闭
agentAutoIdleTimenumber自动空闲间隔秒, agentAutoIdle0时不生效
  • Kick

    被踢出 回传数据类型: undefined

  • SipError

    话机异常, 当话机取消注册时触发, 同时座席会退出 回传数据类型: null

  • QueueInfo

    队列等待消息 回传数据类型: Object

属性名类型含义
groupIDnumber技能组
groupWaitNumbernumber当前技能组等待数量
isInQueuenumber1加入队列,0移出队列
handleAgentIDstring分配的座席工号
dataArray<Info>分配的座席工号
Info.callerstring主叫
Info.calledstring被叫
Info.groupIDnumber技能组ID
Info.inQueueTimenumber加入队列时间
  • 技能组信息 回传数据类型: Object

属性名类型含义
groupListArray<Group>座席信息集合
Group.idstring技能组ID
Group.namestring技能组名称
Group.typenumber技能组类型
  • 技能组信息 回传数据类型: Object

属性名类型含义
agentListArray<Agent>指定技能组下的空闲座席集合
Agent.agentIdstring座席工号
Agent.agentNumberstring座席工号
Agent.agentNamestring座席名称
  • Surveillance

    座席监控信息 回传数据类型: Object
属性名类型含义
infoListArray<AgentInfo>分配的座席工号
AgentInfo.companyIdnumber座席企业ID
AgentInfo.agentIDnumber座席ID
AgentInfo.agentNumberstring座席工号
AgentInfo.agentNamestring座席姓名
AgentInfo.nowStatestring当前状态
AgentInfo.operatingTimenumber当前状态维持时间毫秒数
AgentInfo.peerIdstring通话对端(非通话中为空)
AgentInfo.groupListArray<GroupInfo>座席所属技能组
GroupInfo.idstring座席所属技能组id
GroupInfo.namestring座席所属技能组名称
  • Exception

    UI操作异常事件 回传数据类型: Exception
属性名类型含义
versionstring当前SDK版本信息
messagestring错误描述信息
  • 异常处理

    异常通常产生自非法的数据, 配置, 参数和方法调用的时机与顺序, 目前可能需要捕获的异常有三个场景, 捕获这些异常可以提供给使用者更多提示信息。 1. 通过sdk句柄调用方法; 2. sdk自带UI使用过程中; 3. 发送命令之后, 来自远端回执的异常;

  • 调用SDK方法中的异常捕获

const agentSdk = new AgentSdk({...});
/**
  * 因为call方法需要传入一个被叫, 这里没有传入, 所以会抛出一个异常
  */
agentSdk.call();
/**
  * 捕获异常
  */
try {
	agentSdk.call();
} catch (e) {
	console.log(e.message); // 被叫不能为空
}
  • SDK提供UI使用过程中的异常捕获

  • 来自远端回执的异常捕获

    使用sdk自带UI过程中和来自远端回执的异常捕获方式相同, 由于方法不被开发人员调用, 所以不能直接使用try catch, 监听Exception事件捕获异常。
// <div id="sdk-box"></div>
const agentSdk = new AgentSdk({ el: '#sdk-box', ... });
/**
  * 操作控件, 不填写被叫号码的情况, 直接点击呼叫按钮
  *
  * 捕获异常
  */
  agentSdk.on('Exception', e => {
  	console.log(e.message); // 被叫不能为空
  })

进入话后状态时, 会携带causedata, 说明进入话后的原因, 以下是对照表:

枚举cause说明
NORMAL_CLEARING0正常结束
FILE PLAYED0正常结束
NONE0正常结束
OK0正常结束
SESSION_TIME_OUT901session超时
ORIGINATE_TIME_OUT902发起呼叫超时
UNALLOCATED_NUMBER1001主叫号码不可用
NO_ROUTE_TRANSIT_NET1002被叫号码不可用
NO_ROUTE_DESTINATION1003找不到被叫
NO_ROUTE1004找不到路由
CHANNEL_UNACCEPTABLE1006通话失败
CALL_AWARDED_DELIVERED1007呼叫前转
USER_BUSY1017用户忙
BUSY1017用户忙
NO_USER_RESPONSE1018被叫无响应
NO_ANSWER1019久叫不应
CAUSE4801016被叫未应答
SUBSCRIBER_ABSENT1020被叫号码无效
CALL_REJECTED1021拒绝应答
NUMBER_CHANGED1022号码改变
REDIRECTION_TO_NEW_DESTINATION1023重定向到新的号码
EXCHANGE_ROUTING_ERROR1025路由错误
DESTINATION_OUT_OF_ORDER1027呼叫受限
INVALID_NUMBER_FORMAT1028无效的号码格式
FACILITY_REJECTED1029被叫拒接
RESPONSE_TO_STATUS_ENQUIRY1030状态查询响应
NORMAL_UNSPECIFIED1031未指定错误
NORMAL_CIRCUIT_CONGESTION1034通信电路错误
NETWORK_OUT_OF_ORDER1038网络不可达
NORMAL_TEMPORARY_FAILURE1041临时故障
SWITCH_CONGESTION1042交换机繁忙
ACCESS_INFO_DISCARDED1043访问信息被丢弃
REQUESTED_CHAN_UNAVAIL1044请求不可用
PRE_EMPTED1045
FACILITY_NOT_SUBSCRIBED1050设备受限
OUTGOING_CALL_BARRED1052外呼阻塞
INCOMING_CALL_BARRED1054呼入阻塞
BEARERCAPABILITY_NOTAUTH1057承载能力未经授权
BEARERCAPABILITY_NOTAVAIL1058目前暂不提供承载能力
SERVICE_UNAVAILABLE1063服务不可用
UNKNOWN1063服务不可用
BEARERCAPABILITY_NOTIMPL1065没有权限使用该功能
USER_NOT_REGISTERED1066话机未注册
CHAN_NOT_IMPLEMENTED1067找不到路由
FACILITY_NOT_IMPLEMENTED1069设备不支持所请求的服务
SERVICE_NOT_IMPLEMENTED1079未实现所请求的服务
INVALID_CALL_REFERENCE1081当前网络不支持此功能
INCOMPATIBLE_DESTINATION1088不兼容的目的地
INVALID_MSG_UNSPECIFIED1095无效消息
MANDATORY_IE_MISSING1096消息不完整
MESSAGE_TYPE_NONEXIST1097无法识别的消息类型
WRONG_MESSAGE1098当前状态下不能处理该消息
IE_NONEXIST1099未识别的参数
INVALID_IE_CONTENTS1100编码未实现
WRONG_CALL_STATE1101消息与呼叫状态不兼容
RECOVERY_ON_TIMER_EXPIRE1102呼叫超时
MANDATORY_IE_LENGTH_ERROR1103参数不存在或未实现
PROTOCOL_ERROR1111协议错误
INTERWORKING1127已完成互通呼叫
NO_CALLNUM1128未获取到码号配置
SUCCESS0成功//1142
FILE NOT FOUND1401文件不存在
PLAYBACK ERROR1402放音失败
ORIGINATOR_CANCEL1487呼叫取消
CANCEL1487呼叫取消
CRASH1500紧急故障
SYSTEM_SHUTDOWN1501系统关闭
LOSE_RACE1502丢失呼叫
MANAGER_REQUEST1503强制挂机
BLIND_TRANSFER1600盲转
ATTENDED_TRANSFER1601咨询转
ALLOTTED_TIMEOUT1602分配超时
USER_CHALLENGE1603用户竞争
MEDIA_TIMEOUT1604媒体超时
PICKED_OFF1605被拦截
PROGRESS_TIMEOUT1607振铃超时
INVALID_GATEWAY1608网关不可用
GATEWAY_DOWN1609网关关闭
INVALID_URL1610错误的URL
INVALID_PROFILE1611错误的配置
NO_PICKUP1612没有摘机
SRTP_READ_ERROR1613SRTP读取错误
NO_SIPGATEWAY1614未获取到可用网关
INVALID_UUID_ERROR1615无效的uuid
Cannot stop record session!3000无法停止录音
No such channel!1004呼叫不存在
NONE0
NO_SUCH_FS1129找不到fs
NO_PNS3001未找到绑定的隐私号信息
NO_CALL_LOG3005未找到回拨信息
NO_PNS_ERROR3002隐私号绑定信息有误
DISPLAY_CALLER_EMPTY3003外显号码池为空
TEL_X_IS_NULL3004隐私号小号为空
INBOUND_BRIDGE_ERROR3100呼入转接失败
NO_REASON8888未找到该错误原因
EXECUTE_SERVICE_OFFLINE2002转接到的模块不在线
RS_FLOW_TIMEOUT2003机器人配置错误
RS_FLOW_BRIDGE_FAILURE2004机器人转接失败
RS_FLOW_RESPONSE_TIMEOUT2005机器人响应超时
RINGING_BUSY2101用户占线
RINGING_NOANSWER2102无人接听
LINE_BUSY2103网络忙
LINE_FAULT2104线路故障
STATUS_NOTINAREA2105不在服务区
STATUS_PAUSE2106暂停服务
STATUS_STOP2107停机
STATUS_UNABLECONNECT2108暂时无法接通
STATUS_SHUTDOWN2109关机
STATUS_STOPANDKEEP2110停机保号
STATUS_LIMITED2111呼叫受限
STATUS_WAITING2112呼叫等待
STATUS_TRANSFER2113呼叫转移
NUMBER_EMPTY2114空号
NUMBER_WRONG2115号码错误
NUMBER_INVALID2116号码无效
NUMBER_FOREIGN2117外地号码需加零
NUMBER_LOCAL2118本地不需加零
GLOBAL_BLACKLIST4001全局黑名单
GROUP_BLACKLIST4002技能组黑名单
1.1.65

6 months ago

1.1.63

10 months ago

1.0.0

3 years ago