dgalan
dgalan

Reputation: 79

How to make an outbound call with Twilio and detect if it has been answered

I am trying to develop a simple application with Twilio and I have some issues. I have the code made with Python to make the call.

def makeCall(self, phoneNumber, from_num, message):
        call = self.client.calls.create(
                        method='POST',
                        machine_detection='Enable',     
                        to= phoneNumber,
                        from_= from_num,
                        url= self.url + urlencode({'Message' : message}),
                        status_callback= self.url_callback,
                        status_callback_method = 'POST'
                    )

        return call.sid

And I also have a Node.js application with the Twiml response.

const express = require('express');
const VoiceResponse = require('twilio').twiml.VoiceResponse;
const urlencoded = require('body-parser').urlencoded;

const app = express();

app.post('/start', (request, response) => {

  const twiml = new VoiceResponse();

  const gather = twiml.gather({
    numDigits: 1,
    action: '/confirmation'
  });

  gather.say({
    language:'en-EN'
  }, 'Hello, are you ok?' );

  gather.pause({
    length: 1
  });

  gather.say({
    language:'en-EN'
  }, 'If no press one, if yes press two');

  response.type('text/xml');
  response.send(twiml.toString());

});

app.post('/confirmation', (request, response) => {

    const twiml = new VoiceResponse();

    if (request.body.Digits) {

        switch (request.body.Digits) {

            case '2':
                twiml.say({
                    language:'en-EN'
                }, 'I am sorry to hear that');


            case '1':
                twiml.say({
                    language:'en-EN'
                }, 'Perfect!');

            default:
                twiml.say({
                    language:'en-EN'
                }, 'Sorry, I don't understand you.');
                twiml.pause({
                    length: 1
                });
                twiml.say({
                    language: 'en-EN'
                }, 'Repeat please');

        }
    }

  response.type('text/xml');
  response.send(twiml.toString());

});

app.post('/callback', (request, response) => {

    console.log(request.body.CallStatus);
    console.log('--------------------');
    console.log(request.body.AnsweredBy);
    console.log('--------------------');

    response.type('text/xml')
    response.send(request.AnsweredBy)
});

app.listen(3000);

The problem is that when I execute the python function. If the user reject the call or doesn't answer, it sends a voicemessage to the answering machine and I would like to avoid it. I would also like to detect in the python code, if the call is rejected or not answered.

Thanks in advance

Upvotes: 0

Views: 1034

Answers (1)

philnash
philnash

Reputation: 73057

Twilio developer evangelist here.

You can't detect whether the call was answered in your python code that creates the call. That will queue up the call to be dispatched by Twilio, so all further events will happen asynchronously to that API call.

For your Node.js application that is receiving the webhook you can check what the current status of the call is by inspecting the CallStatus parameter that is sent as part of the body of the request. The CallStatus can be one of: "queued", "ringing", "in-progress", "completed", "busy", "failed" or "no-answer" and you can see more about the CallStatus parameter in the documentation.

To read the CallStatus parameter, you'll need to ensure you are using the body-parser middleware properly, urlencoded is a function and you need to set the express app to use it.

const urlencoded = require('body-parser').urlencoded;

const app = express();
app.use(urlencoded({ extended: false });

You can then get the call status in your response function.

app.post('/start', (request, response) => {
  console.log(request.body.CallStatus);
  // and so on

Then you can handle it from there.

Upvotes: 1

Related Questions