My FeedDiscussionsHeadless CMS
New
Sign in
Log inSign up
Learn more about Hashnode Headless CMSHashnode Headless CMS
Collaborate seamlessly with Hashnode Headless CMS for Enterprise.
Upgrade ✨Learn more
How to Receive a Phone Call in Python with Flask and Plivo

How to Receive a Phone Call in Python with Flask and Plivo

Nixon Samuel's photo
Nixon Samuel
·Oct 26, 2021·

4 min read

Making an outbound phone call using the Plivo Voice platform is easy, but communication should be a two-way street. Customers should be able to call you back, and you should answer the calls and address their concerns. This guide shows you how to receive incoming calls on Plivo numbers and manage the call flow once a call reaches the Plivo voice platform. To see how to do this, we’ll build a Python Flask application to receive an incoming call and greet the caller with a text-to-speech (TTS) message.

Prerequisites

Before you get started, you’ll need:

  • A Plivo account — sign up for one for free if you don’t have one already.
  • A voice-enabled Plivo phone number if you want to receive incoming calls. To search for and buy a number, go to Phone Numbers > Buy Numbers on the Plivo console.
  • Flask and Plivo Python packages — run pip3 install plivo flask to install them.
  • ngrok — a utility that exposes your local development server to the internet over secure tunnels.

Create a Flask application to receive incoming calls and play a TTS message

Once you’ve installed Flask and the Plivo Python SDK, create a simple Flask application to handle incoming calls on a Plivo number. To handle an incoming call, you need to return an XML document from the URL configured as the Answer URL in the application assigned to the Plivo number. The Python SDK can manage the XML document generation, and you can use the Speak XML element to play a text-to-speech message to the caller. Use this code:

from flask import Flask, request, make_response
from plivo import plivoxml

app = Flask(__name__)

@app.route('/receive_call/', methods=['GET','POST'])
def speak_xml():
    # Generate a Speak XML with the details of the text to play on the call.
    response = (plivoxml.ResponseElement()
            .add(plivoxml.SpeakElement('Hello, you just received your first call')))
    return(response.to_string())

if __name__ == "__main__":
    app.run(host='0.0.0.0', debug=True)

Test the code locally

Save the code in any file — we named the file receive_call.py. To run the code on the server, go to the folder where the file resides and use the command

$ python receive_call.py

You should see your basic server application in action on localhost:5000/receive_call.

Expose the local server to the internet using ngrok

Once you see the application working locally, the next step is to connect the application to the internet to return the XML document to process the incoming call. For that, we recommend using ngrok, which exposes local servers behind NATs and firewalls to the public internet over secure tunnels. Install it and run ngrok on the command line, specifying the port that hosts the application on which you want to handle incoming calls (5000 in this case, as our local Python application is running there):

$ ./ngrok http 5000

Ngrok CLI

Ngrok will display a forwarding link that you can use as a webhook to access your local server over the public network.

Test the link by opening the ngrok URL (b51dbc9d904c.ngrok.io/receive_call) in a browser. We used HTTPie to check the XML response from the ngrok URL.

XML document with Speak XML element

Connect the Flask application to a Plivo number

The final step is to configure the application as a Plivo voice application and assign it to a Plivo number on which you want to receive incoming calls.

Go to the Plivo console and navigate to Voice > Applications > XML, then click on the Add New Application button in the upper right.

Provide a friendly name for the application — we used “App-Incoming-call” — and configure the ngrok URL b51dbc9d904c.ngrok.io/receive_call as the Answer URL. Select the HTTP verb as POST, then click Create Application.

Create Plivo App to handle incoming calls

Now go to Phone Numbers > Your Numbers and click on the number to which you want to assign the application. From the Plivo Application drop-down, choose the voice application you just created. Finally, click Update Number.

Assign the Plivo App to a Plivo Number

Test the application

Make a phone call to the Plivo number you selected. You should see that the Flask application automatically greets the caller with the text-to-speech message configured in the app.

And that’s how simple it is to receive an incoming call on a Plivo number and handle it using XML documents using Plivo’s Python SDK and a Flask application. You can implement other use cases on the Plivo Voice platform, such as phone system IVR, call forwarding, and number masking, as your business requires.

Haven’t tried Plivo yet? Getting started is easy and only takes five minutes. Sign up today.