顶顶通呼叫中心中间件(mod_cti基于FreeSWITCH)-自动外呼接口

队列呼叫任务

cti_queue_dialer_task@template [哈希表]

  1. key任务名字
  2. value 任务配置JSON格式

    {
    "params": {
    "enable": true,
    "line_group": ["外呼使用的线路组"],
    "limit":100,
    "start_time": "2020-1-20 12:00",
    "stop_time": "2020-1-22 12:00",
    "work_hour": [{
    "wday":"-1",
    "begin": "8:00",
    "end": "12:00"
    }, {
    "wday":"0",
    "begin": "14:00",
    "end": "18:00"
    }],
    "work_week": [1,2,3,4,5],
    "holiday": [{
    "begin": "2020-1-20 12:00",
    "end": "2020-1-21 12:00"
    }, {
    "begin": "2020-1-21 12:00",
    "end": "2020-1-22 8:00"
    }],
    "number_queue": "号码队列",
    "destination_extension":"8888",
    "destination_dialplan":"XML",
    "destination_context":"default"

    },
    "variables": {
    "origination_caller_id_number": "主叫号码",
    "absolute_codec_string": "pcma,pcmu,g729"
    }
    }
    • params 任务参数
      • enable [布尔] 是否启用任务
      • line_group [数组] 外呼使用的线路组,如果配置多个线路组,第一个线路组呼叫失败,会使用第二个继续呼叫。
      • limit [数字] 任务并发,同时呼叫多少号码。
      • cps [数字] 呼叫速度,1秒最多呼叫多少号码,如果10秒呼叫1个,可以设置0.1。1秒呼叫小于1个的计算方法: 1个÷ 多少秒。比如 20秒呼叫一个,就是1÷20=0.05,CPS 就设置0.05
        • cps和limit 的关系:比如并发设置为100,当前存在的通话是0个,呼叫速度设置为10时,第一秒发起10个呼叫,第二秒再发起10个呼叫,以这样的速度发起呼叫,直到通话总数达到并发就停止发起新的呼叫。如果有电话挂断了,那么以1秒10个的速度继续发起新的呼叫,使通话总数达到并发设置的值。
      • start_time [字符串] 任务启动时间
      • stop_time [字符串] 任务停止时间
      • work_time [数组] 任务工作时间,可以配置多个时间范围
        • wday [字符串] 周几,用来支持根据周几来设置不同的工作时间,-1或者不设置是不管星期几都使用这个时间,0代表星期日,1是星期一,6是星期六,如果设置了只有星期几匹配了,才使用这个时间,work_week也是需要设置的。
        • begin [字符串] 开始时间
        • end [字符串] 结束时间
      • work_week [数组] 工作日,参数是星期,就是每个星期的那些天是工作日。比如 星期一到星期五是工作日,0代表星期日。
      • holiday [数组] 放假时间,参数是具体的放假时间范围。
      • number_queue 任务关联的号码队列。默认使用redis的list,如果使用前缀set:就是使用redis的set作为号码队列。如果需要防止重复号码以及动态删除指定号码以及乱序呼叫可以用set作为号码队列。
        • set: 使用redis的set作为号码队列。如果需要防止重复号码以及动态删除指定号码以及乱序呼叫可以用set作为号码队列。
        • http:// 详细看通过http接口获取号码章节
      • destination_extension 应答后转接目的分机
      • destination_dialplan 应答后转接目的拨号方案类型,比如XML
      • destination_context 应答后转接目的上下文,比如default,public
      • service_line_group 根据空闲座席数量来控制外呼并发
      • call_multiple 一个空闲座席呼叫多少个并发
      • queue_limit 排队中的呼叫大于座席总数乘以这个值就停止呼叫(排队中并发【已经接通进入排队的电话】大于 queue_limit【一般设置0.1到1之间】 乘以 座席总数【不是空闲座席是是座席组的总人数】,就停止呼叫。)防止排队中的电话超过座席数。
      • cps_multiple 一个空闲座席一秒最多呼叫多少个号码,建议设置1-3。
      • blacklist 配置一个redis的set,用于设置禁止呼叫的黑名单号码。
      • ttsconfig 导入的号码变量名如果是tts_前缀,会呼叫前就预先调用TTS,这里可以设置使用哪个话术的TTS配置,变量如果包含url保留字符需要先进行url编码。tts文本内容也不能包含”!”,导入时候需要去除!。
    • variables 任务的通道变量 ,线路配置的通道变量优先级更高
      • origination_caller_id_number [字符串类型] 主叫号码
      • origination_caller_id_name [字符串类型] 主叫名字
      • ignore_early_media=true [字符串类型] 忽略早期媒体
      • absolute_codec_string [字符串类型] 声音编码

cti_queue_dialer_task@domain[哈希表]

  1. key 任务名字
  2. value 任务配置JSON格式,和 cti_queue_dialer_task@template 含义一样,未配置的会使用 cti_queue_dialer_task@template 模板配置。

号码队列 [列表]

支持文本和JSON 2中格式。如果不需要给单独号码设置通道变量,可以直接用文本格式,直接插入号码文本到list。

    {
"params": {
"number":"被叫号码"
},
"variables": {
"origination_caller_id_number": "主叫号码",
"absolute_codec_string": "pcma,pcmu,g729",
"origination_uuid":"uuid"
}
}
`

  • number 被叫号码
  • variables 通道变量,优先级 号码配置(本配置) < cti_queue_dialer_task@domain < cti_queue_dialer_task@template < cti_line@domain
  • origination_uuid 可以通过设置号码变量origination_uui来设置呼叫这个号码时候的call id。注意需要使用UUID,来保证唯一性。

通过http接口获取号码

  1. 取号

    POST或者GET方式,URL参数地址:http://第三方服务器地址?action=take&task=外呼任务号&maxmum=本次可返回的最大号码量&sequence=上一次返回的顺序号
    返回内容要求

{
"sequence":1,
"code":0,
"msg":"",
"interval":10000,
"numberlist":[
{
"params": {
"number":"10001"
},
"variables": {
"numberid": "1"
}
},
{
"params": {
"number":"10002"
},
"variables": {
"numberid": "2"
}
},
"1003"
]
}
- sequence: 顺序号,第一次请求sequence为0,后台返回一个序号,接口记录下这个序号,下一次请求的时候使用sequence设置为最后一次请求响应的序号。假设一个请求接收数据的时候网络故障了或者出错了,如果没有ACK确认机制,后台就没办法判断是否取号成功了,就会出现丢号。
  有了顺序号,就可以实现类似ACK的机制,后台如果发现请求的顺序号是上上次次的,就可以认为最后一次取号失败,重新返回最后一次的号码。
  如果顺序号是最后一次响应的,就可以认为上一次区号成功了。
- code:返回码, 小于0:错误,错误信息再msg里面。0:表示正常返回,1:停止任务。
- msg:错误信息
- numberlist:号码列表,请看上面 号码队列 节 的号码格式,支持JSON和文本格式。
- interval:下次取号最小间隔,可防止接口调用太频繁,单位毫秒。
  1. 回收号码
    任务停止时,还未呼叫的号码会回退给号码接口。
    POST方式,URL参数地址:http://第三方服务器地址?action=back&task=外呼任务号&sequence=上一次返回的顺序号
    post的数据内容:
    {
    "numberlist":[
    "被叫号码1","被叫号码2",{josn格式的号码数据}
    ]
    }

如果没有未呼叫完的号码,numberlist为空。

定时呼叫

cti_schedule_dialer_config@domain [哈希表]

  1. key 配置名字
  2. value 配置信息,JSON格式
      {
    "params": {
    "line_group": ["外呼使用的线路组"],
    "destination_extension":"8888",
    "destination_dialplan":"XML",
    "destination_context":"default"

    },
    "variables": {
    "origination_caller_id_number": "主叫号码",
    "absolute_codec_string": "pcma,pcmu,g729"
    }
    }

cti_schedule_dialer_number@domain [有序集合]

  1. score 计划呼叫的时间戳
  2. string 号码配置json,和号码队列的号码配置一样。

    {
    "params": {
    "number":"被叫号码",
    "expires":0,
    "config":"cti_schedule_dialer_config@domain里面的任务名字"
    },
    "variables": {
    "origination_caller_id_number": "被叫号码",
    "absolute_codec_string": "pcma,pcmu,g729"
    }
    }
    • expires 过期时间(unix时间戳,1970年1月1日(UTC/GMT的午夜)开始所经过的秒数),当前时间超过这个时间,就不会呼叫这个号码了,如果值为0,忽略这个参数。如果没可用线路时,重新写回redis,score设置为当前时间+60,如果expires为0,或者超过了expires,就不会写会redis了。

配置改变通知

config@all config@domain [通道]

cti_queue_dialer_task@template改变PUBLISH 通知到 config@all,cti_queue_dialer_task@domain改变PUBLISH 通知到 config@domain。

{
"type":"config_change",
"table":"cti_queue_dialer_task",
"key":"test"
}
  • type,config_change:配置改变
  • table,那个表修改了,只需要@前面的。
  • key table的主键,比如任务表名字。

查看fs内存中外呼任务信息

有时候为了诊断问题需要查看 内存中外呼任务的信息,可以执行fs控制台命令 cti show queue_dialer 任务名 或者shell执行 fs_cli -x "cti show queue_dialer 任务名"可以输出外呼任务的配置信息和统计信息。

  • enable:false (任务是否启用)
  • call_limit:1 (任务最大并发)
  • number_queue:number_robot (号码队列)
  • line_group:[default(idle=0)] (外线线路空闲的并发,idle要大于0)
  • start_time:2021-07-28 08:52:20 (开始时间)
  • stop_time:2023-07-28 08:52:22 (停止时间)
  • work_hour:[wday:-1 08:00-23:00] (上班时间)
  • work_week:[0,1,2,3,4,5,6] (工作日)
  • service_line_group: (坐席线路组)
  • service_line_group_idle:0 (坐席线路组空闲坐席个数)
  • call_count: 当前呼叫中的总数(包含未接通和已接通)
  • answer_count: 外呼接通的总数
  • bridge_count: 和坐席通话中的总数
  • cps_last: 最近一个CPS周期发起了多少个呼叫(如果cps大于1,cps周期就是1秒,如果cps小于就是1÷cps)

image-20220903100930179