首页 > 解决方案 > 呼叫连接或挂断上的 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 并接收所有参数。

标签: c#asp.net-mvctwilio

解决方案


这就是我最终处理它的方式。

/* 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);
        }

推荐阅读