c# - 呼叫连接或挂断上的 Twilio 获取呼叫详细信息
问题描述
我正在使用带有 Twilio 的 ASP.NET MVC Web 调用
这是我的连接功能
function callCustomer(phoneNumber) {
updateCallStatus("Calling " + phoneNumber + "...");
phoneNumber = phoneNumber.replace(/ /g, '');
var params = { To: phoneNumber };
Twilio.Device.connect(params);
}
这是我的挂断功能
function hangUp() {
Twilio.Device.disconnectAll();
}
这是我的 TwiML Bin
<?xml version="1.0" encoding="UTF-8"?>
<Response>
<Dial callerId="++516xxx9999" record="record-from-answer">{{To}}</Dial>
</Response>
我正在使用 Twilio 客户端 v1.6
//media.twiliocdn.com/sdk/js/client/v1.6/twilio.min.js
我想在连接到呼叫或挂断呼叫时收集每个呼叫的完整信息,例如呼叫持续时间、呼叫 Sid、记录 Sid、呼叫至等。然后有了这些信息,我想在我的应用程序中实现播放录音通话。
我相信一种方法是在 Voice & Fax 下设置 CALL STATUS CHANGES 并接收所有参数。
解决方案
这就是我最终处理它的方式。
/* Callback for when a call ends */
Twilio.Device.disconnect(function (connection) {
console.log(connection);
// Disable the hangup button and enable the call buttons
hangUpButton.prop("disabled", true);
callCustomerButtons.prop("disabled", false);
callSupportButton.prop("disabled", false);
updateCallStatus("Ready");
addCallLog(connection.parameters.CallSid);
});
addCallLog 函数
function addCallLog(id) {
var type = "";
var entityId = Number($("#Id").val());
$.ajax({
url: "/Phone/AddCallLog?callId=" + id,
type: "POST",
contentType: "application/json;",
success: function (data) {
// Handle Success Event
},
error: function (data) {
// Handle Error Event
}
});
}
控制器方法
[HttpPost]
public ActionResult AddCallLog(string callId,string type,int entityId)
{
TwilioClient.Init(_callSetting.Twilio.AccountSid, _callSetting.Twilio.Authtoken);
var records = CallResource.Read(parentCallSid: callId).ToList();
if (records.Any())
{
var callResource= records[0];
var parentRecord = CallResource.Fetch(pathSid: callId);
if (callResource.Status.ToString().Equals("completed", StringComparison.OrdinalIgnoreCase))
{
CallRecord callRecord = new CallRecord
{
EntityKey = entityId,
EntityType = type,
CallDateTimeUtc = callResource.DateCreated ?? DateTime.UtcNow,
CallSId = callResource.Sid,
ParentCallSId = callResource.ParentCallSid,
CalledById = _operatingUser.Id,
DurationInSeconds = parentRecord==null? Convert.ToDouble(callResource.Duration): Convert.ToDouble(parentRecord.Duration),
ToPhone = callResource.To,
CompanyId = _operatingUser.CompanyId
};
var callRecordResult= _callRecordService.Add(callRecord);
var recording = RecordingResource.Read(callSid: callId).ToList();
if (!recording.Any()) return Json(true);
foreach (RecordingResource recordingResource in recording)
{
using (var client = new WebClient())
{
var url =
"https://api.twilio.com" + recordingResource.Uri.Replace(".json", ".mp3");
var content = client.DownloadData(url);
CallRecordMedia callRecordMedia = new CallRecordMedia
{
CallRecordId = callRecordResult.Id,
ContentType = "audio/mpeg",
RecordingSId = recordingResource.Sid,
RecordingCallSId = recordingResource.CallSid,
FileType = "mp3",
Data = content,
Price = Convert.ToDouble(recordingResource.Price),
PriceUnit = recordingResource.PriceUnit,
DurationInSeconds = Convert.ToDouble(recordingResource.Duration)
};
_callRecordService.AddCallRecording(callRecordMedia);
}
}
}
}
return Json(true);
}
推荐阅读
- python - 使用现代 OpenGL 绘图时的点云失真
- python - 如何在Python中获取变量的内存位置
- typescript - 如何定义这个打字稿接口类型
- go - 是否可以获得返回值的源代码行?
- java - 在android studio中上传图片
- wildfly - Javax.naming.NameNotFoundException:尝试在 JavaEE 和 Wildfly 中查找 jndi 名称时
- mysql - 如何使用 Antlr4 的访问者模型在翻译器中添加注释/空格
- html - 为什么我的按钮将我带到页面顶部,为什么它只允许我点击最左边的边缘?
- c++ - char* 和 void* 在所有情况下都可以互换用作缓冲区吗?C++
- flutter - 错误:无法调用需要 const 表达式的非“const”构造函数