javascript - 我正在用 Twilio.Device Js 构建一个自动拨号器
问题描述
我正在用 twilio 构建一个自动拨号器,但我有点卡住了。我成功地从我的浏览器接到了 2 个出站电话,当第一个电话挂断或忙时,第二个电话开始了。但我想为我的 sql Db 中一系列电话的许多呼叫实现它。
这是我的代码 - 我首先连接到 twilio 并获取令牌,然后我使用 AJAX 调用我的数据库和 php 代码来制作一系列手机,然后我首先发出 $GetJson 请求电话和 Db 中的下一部电话(如果存在),最后我开始 twilio.device.connect 并且当第一个断开连接时第二个开始:
status_progress.php
/********TWILIO **********/
$.getJSON('../../twilio/token.php').done(function (data) {
console.log('Token: ' + data.token);
console.log('Identity: ' + data.identity);
// Setup Twilio.Device
Twilio.Device.setup(data.token);
Twilio.Device.ready(function (device) {
console.log('Twilio.Device Ready!');
});
Twilio.Device.error(function (error) {
console.log('Twilio.Device Error: ' + error.message);
});
Twilio.Device.connect(function (conn) {
console.log('Successfully established call!');
});
Twilio.Device.disconnect(function (conn) {
console.log('Call ended.');
});
Twilio.Device.incoming(function (conn) {
console.log('Incoming connection from ' + conn.parameters.From);
var archEnemyPhoneNumber = '+12099517118';
if (conn.parameters.From === archEnemyPhoneNumber) {
conn.reject();
console.log('It\'s your nemesis. Rejected call.');
} else {
// accept the incoming connection and start two-way audio
conn.accept();
}
});
//setClientNameUI(data.identity);
})
.fail(function () {
console.log('Could not get a token from server!');
});
// Bind button to hangup call
document.getElementById('closeCall').onclick = function () {
console.log('Hanging up...');
Twilio.Device.disconnectAll();
};
$("#phoneThem").live("click", function() {
var arr = [];
var i =0;
$('.checkDeal:checked').each(function () {
arr[i++] = $(this).val();
});
var arr_value = JSON.stringify(arr);
var conected = 'no';
$.ajax({
type: "POST",
url: 'make_call_list.php',
data: {arr_checked : arr_value}, // serializes the form's elements.
success: function(calls)
{
$.getJSON('make_a_call.php').done(function (data) {
var arr = data.arr;
var params = {
To: data.phone + '-' + data.crm
};
console.log('Calling ' + params.To + '...' );
var connection = Twilio.Device.connect(params);
connection.on('disconnect', function(conn) {
console.log("the call has ended");
var params2 = {
To: data.phone_next + '-' + data.crm
};
console.log('Calling ' + params2.To + '...' );
var connection_2 = Twilio.Device.connect(params2);
});
});
}, // SUCCES MAKE A CALL LIST
});
});
这是 twiml 代码:
<?php
require_once 'twilio-php-master/Twilio/autoload.php';
use Twilio\TwiML\VoiceResponse;
$break = $_POST['To'];
$break_arr = explode('-',$break);
$prefix = '+972';
$response = new VoiceResponse();
$dial = $response->dial('', ['callerId' => '+972 50-225-8234']);
$break_arr[0] = ltrim($break_arr[0] , '0');
$break_arr[0] = $prefix.$break_arr[0] ;
$dial->number($break_arr[0], ['statusCallbackEvent' => 'initiated
ringing answered completed',
'statusCallback' =>
'https://crm.unic.co.il/crm_test_zone/handleDialCallStatus.php?
crm='.$break_arr[1].'',
'statusCallbackMethod' => 'POST']);
echo $response;
?>
解决方案
Twilio 开发人员布道者在这里。
您可以使用 Twilio 设备中的回调函数来触发下一次呼叫,而不是编写代码来顺序拨打所有号码。
我要做的是将所有要拨打的号码以数组的形式加载到前端。
然后,我将创建一个带有两个参数的函数;您正在拨打的号码的当前索引和号码数组。该函数将检查以确保当前索引仍在数组中,如果它没有返回(所有号码都已拨打)。否则,它将生成对数组中数字的调用。它还将为该呼叫的断开事件设置一个侦听器。当它断开连接时,它再次调用相同的函数,但将索引移到 1。
最后,使用初始索引 0 和数字数组调用该函数。有点像这样:
const array = getArrayOfNumbers();
function dialNumber(index, array) {
if (index > array.length) return;
const connection = Twilio.Device.connect({ number: array[index] });
connection.on('disconnected', function() {
dialNumber(index+1, array);
});
}
dialNumber(0, array);
让我知道这是否有帮助。
推荐阅读
- gnuplot - 如何在 gnuplot 中绘制文件?
- ionic3 - Ionic Native:尝试调用 Device.uuid,但 Cordova 不可用
- c# - 如何获取与linux/windows兼容的硬盘序列号
- java - Gson.fromJson(json, Custom.class) 空字符串
- c# - 如何在 C# ASP.Net MVC 中导航到另一个网站、传递登录信息和完成登录表单
- javascript - 添加一个公式以通过 inputBox 从值中计算价格 onkeyup
- java - 该字段的问题是其类型是另一个类
- laravel - 无法使用 laravel 检索上传到 aws 实例的图像
- c++ - 用空实现替换“定义宏”
- jquery - Bootstrap 垂直滚动选项卡