Как начать запись исходящих звонков в процессе работы в Twilio? - PullRequest
0 голосов
/ 18 января 2019

Twilio запускает, приостанавливает, возобновляет и останавливает запись входящих вызовов. Однако, когда я использую тот же подход, тот же код, для записи исходящих вызовов, я получаю ошибку 20404.

Я понимаю, что могу записывать исходящие вызовы с самого начала, используя глагол <record>, но мне нужно иметь возможность выборочно записывать исходящие исходящие вызовы.

Как я уже сказал, он работает для записи входящих вызовов, поэтому я не понимаю, почему тот же подход не работает для исходящих вызовов.

Это мой javascript для инициации записи звонка:

document.getElementById('button-record-start').onclick = function () {

    var call_id = $('#call-id').val();
    var csrf_token = $('meta[name="csrf-token"]').attr('content');

    console.log(call_id);
    console.log(csrf_token);

    $.ajax({
        url: 'https://my-url.ngrok.io/twilio/recording/start',
        type: 'POST',
        headers: {
            'X-CSRF-TOKEN': csrf_token
        },
        data: {
            call_id: call_id
        },
        dataType: 'JSON',
        success: function (data) { 
            $('#recording-id').val(data.sid);
            console.log(data);
        },
        error: function(xhr, status, error) {
            console.log('error:');
            console.log(xhr);
        }
    });
};

Ajax вызывает этот метод в моем php (Laravel):

public $twilio_api_base_url = 'https://api.twilio.com/2010-04-01/Accounts/';

public function start(Request $request)
{
    $call_id = $request->input('call_id');

    $url  =  $this->twilio_api_base_url . env('TWILIO_ACCOUNT_SID');
    $url .= '/Calls/' . $call_id . '/Recordings.json';

    $params = [ 'RecordingStatusCallback'=>'https://myapp.com/recording-events', 
                'RecordingStatusCallbackEvent' => 'in-progress'
              ];

    $this->send_request_to_twilio($url, $params);
}

Метод send_request_to_twilio выглядит так:

public static function send_request_to_twilio($url, $params)
{
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
    curl_setopt($ch, CURLOPT_USERPWD, env('TWILIO_ACCOUNT_SID') . ':' . env('TWILIO_AUTH_TOKEN') );

    curl_exec($ch);
    curl_close($ch);        
}

$url формулируется правильно. Единственное, о чем я могу думать, это то, что, возможно, поскольку я нахожусь на пробной учетной записи, в тот момент, когда Twilio меняет CallSid, когда он заканчивает обязательную запись, сообщая, что я нахожусь на пробной учетной записи, а затем инициирую фактический вызов. Это правильно? Если так, как я узнаю новый идентификатор, когда это произойдет?

Edit:

Добавление этого, чтобы показать, как я получаю вызов sid:

$.getJSON('twilio/token')

    .then(function (data) {

        device = new Twilio.Device(data.token);

        device.on('ready',function (device) {
            console.log('device.on ready')
        });

        device.on('error', function (error) {
            console.log('device.on error');
        });

        device.on('connect', function (conn) {
            console.log('device.on connect');

            var twilio_call_sid = conn.parameters.CallSid;

            log_call_to_database(twilio_call_sid, 'connect');

        });

        // other stuff

  });

И вот как выглядит мой twilio/token, который вызывает getJSON:

public function new_twilio_token()
{
    $twilio_account_sid = env('TWILIO_ACCOUNT_SID');
    $twilio_auth_token  = env('TWILIO_AUTH_TOKEN');
    $twilio_application_sid = env('TWILIO_APPLICATION_SID');

    $capability = new ClientToken($twilio_account_sid, $twilio_auth_token);
    $capability->allowClientOutgoing($twilio_application_sid);

    $identity = 'tom';
    $capability->allowClientIncoming($identity);
    $token = $capability->generateToken();

    return response()->json(['token' => $token, 'identity' => $identity]);
}
...