Python >> Tutoriel Python >  >> Python

Composer des appels téléphoniques sortants avec une application Web Bottle

Les applications Web Python construites avec le framework Web Bottle peuvent envoyer et recevoir des messages texte SMS. Dans ce didacticiel, nous irons au-delà des SMS et apprendrons à composer des appels téléphoniques sortants. Les appels liront un extrait de texte puis liront un fichier MP3, mais ils peuvent ensuite être facilement modifiés pour créer des lignes de conférence et de nombreuses autres fonctionnalités vocales dans vos applications Web Python.

Outils dont nous avons besoin

Vous devez avoir Python 2 ou 3 installé pour créer votre application Bottle, bien que Python 3 soit recommandé pour les nouvelles applications. Nous avons également besoin :

  • pip et virtualenv pour gérer les dépendances des applications
  • Ngrok pour la tunnellisation de l'hôte local vers notre application Bottle pendant qu'elle s'exécute sur notre environnement de développement local
  • Cadre Web de mise en bouteille
  • Compte Twilio gratuit pour utiliser leur API Web d'appel téléphonique
  • Bibliothèque d'assistance Python de Twilio, qui est open source sur GitHuband disponible en téléchargement sur PyPI

Consultez ce guide sur la configuration de Python 3, Bottle et Gunicorn sur Ubuntu 16.04 LTS si vous avez besoin d'aide pour configurer votre environnement de développement avant de continuer avec le reste de ce didacticiel.

Vous pouvez récupérer tout le code open source de ce didacticiel dans le référentiel python-bottle-phoneGitHub sous le répertoire sortant. Utilisez et copiez le code comme vous le souhaitez - tout est open source sous la licence MIT.

Installation de nos dépendances d'application

Notre application Bottle a besoin d'une bibliothèque de codes d'assistance pour faciliter la numérotation des appels téléphoniques sortants. Bottle et la bibliothèque d'assistance Twilio peuvent être installées à partir de PyPI dans un environnement virtuel. Ouvrez votre terminalet utilisez le virtualenv commande pour créer un nouveau virtualenv :

virtualenv bottlephone

Utilisez le activate script dans le virtualenv, ce qui fait de ce virtualenv l'installation active de Python. Notez que vous devez le faire dans chaque fenêtre de terminal où vous souhaitez que cet environnement virtuel soit utilisé.

source bottlephone/bin/activate

L'invite de commande changera après l'activation du virtualenvto quelque chose comme (bottlephone) $ . Voici une capture d'écran de ce à quoi ressemblait mon environnement lorsque j'utilisais le activate script.

Utilisez ensuite le pip commande pour installer les packages Bottle et Twilio Python dans votre environnement virtuel.

pip install bottle twilio==5.7.0

Une fois le script d'installation terminé, nous aurons les dépendances requises pour créer notre application. Il est temps d'écrire du code Python pour passer des appels téléphoniques sortants.

Bouteille et Twilio

Notre simple application Web Bottle aura trois itinéraires :

  • / - renvoie une chaîne de texte pour nous informer que notre application Bottle est en cours d'exécution
  • /twiml - répond avec TwiML (un simple sous-ensemble de XML) qui indique à Twilio quoi faire lorsque quelqu'un décroche l'appel depuis notre application Web Bottle
  • /dial-phone/<outbound_phone_number> , où "outbound_phone_number" est un numéro de téléphone au format "+12025551234" - cette route utilise la bibliothèque Twiliohelper pour envoyer une requête POST à ​​l'API Twilio Voice pour passer un appel téléphonique

Nous pouvons construire la structure de notre application Bottle et le premier itinéraire dès maintenant.Créez un nouveau fichier nommé app.py avec le contenu suivant pour démarrer notre application.

import os
import bottle
from bottle import route, run, post, Response
from twilio import twiml
from twilio.rest import TwilioRestClient


app = bottle.default_app()
# plug in account SID and auth token here if they are not already exposed as
# environment variables
twilio_client = TwilioRestClient()

TWILIO_NUMBER = os.environ.get('TWILIO_NUMBER', '+12025551234')
NGROK_BASE_URL = os.environ.get('NGROK_BASE_URL', 'https://c6c6d4e8.ngrok.io')


@route('/')
def index():
    """
    Returns a standard text response to show the app is up and running.
    """
    return Response("Bottle app running!")


if __name__ == '__main__':
    run(host='127.0.0.1', port=8000, debug=False, reloader=True)

Assurez-vous que vous êtes dans le répertoire où vous avez créé le app.py ci-dessus dossier. Exécutez l'application via le serveur de développement Bottle avec la commande suivante. Assurez-vous que votre environnement virtuel est toujours activé afin que notre code puisse s'appuyer sur la bibliothèque de code Bottle.

python app.py

Nous devrions voir un serveur de développement réussi démarrer comme ceci :

(bottlephone) matt@ubuntu:~/bottlephone$ python app.py 
Bottle v0.12.9 server starting up (using WSGIRefServer())...
Listening on http://127.0.0.1:8000/
Hit Ctrl-C to quit.

Voici à quoi ressemble le message du serveur de développement dans mon environnement sous Ubuntu :

Testons l'application en accédant à "localhost:8000" dans le navigateur Web. Nous devrions recevoir un simple message de réussite indiquant que l'application est en cours d'exécution et répond aux demandes.

Ensuite, nous devons obtenir un numéro de téléphone que notre application Bottle peut utiliser pour appeler d'autres numéros de téléphone.

Obtenir un numéro de téléphone

Notre application Web de base Bottle est en cours d'exécution, mais ce que nous voulons vraiment faire, ce sont les appels sortants, qui seront gérés par Twilio.

Dans votre navigateur Web, accédez au site Web Twilio et créez un compte gratuit. Vous pouvez également vous connecter à votre compte Twilio existant si vous en avez déjà un.

Le compte d'essai Twilio vous permet de composer et de recevoir des appels téléphoniques vers votre propre numéro de téléphone validé. Pour composer et recevoir des appels de n'importe quel numéro de téléphone, vous devez mettre à niveau votre compte (appuyez sur le bouton de mise à niveau dans la barre de navigation supérieure pour le faire). Les comptes d'essai sont parfaits pour le développement initial avant la mise en ligne de votre application, mais les comptes mis à niveau sont là où le vrai pouvoir entre en jeu.

Une fois connecté à votre compte Twilio, accédez à l'écran de gestion des numéros de téléphone. Sur cet écran, vous pouvez acheter un ou plusieurs numéros de téléphone ou cliquer sur un numéro de téléphone existant dans votre compte pour le configurer.

Nous n'avons rien à configurer pour le moment sur la page de configuration des numéros de téléphone, car nous effectuons des appels téléphoniques sortants pour ce didacticiel. Maintenant que nous avons un numéro de téléphone en main, ajoutons le code bitof final à notre application Bottle pour que cette application fonctionne.

Passer des appels téléphoniques

Nous devons ajouter deux nouvelles routes à notre application Bottle afin qu'elle puisse composer des appels téléphoniques sortants. Modifiez votre fichier app.py existant avec les deux nouvelles fonctions ci-dessous, twiml_response et outbound_call . Aucun autre code de ce fichier n'a besoin d'être modifié à part l'ajout de ces deux nouvelles fonctions à ce que nous avons écrit dans la section précédente.

import os
import bottle
from bottle import route, run, post, Response
from twilio import twiml
from twilio.rest import TwilioRestClient


app = bottle.default_app()
# plug in account SID and auth token here if they are not already exposed as
# environment variables
twilio_client = TwilioRestClient()

# add your Twilio phone number here
TWILIO_NUMBER = os.environ.get('TWILIO_NUMBER', '+16093002984')
# plug in your Ngrok Forwarding URL - we'll set it up in a minute
NGROK_BASE_URL = os.environ.get('NGROK_BASE_URL', 'https://c6c6d4e8.ngrok.io')


@route('/')
def index():
    """
    Returns a standard text response to show the app is up and running.
    """
    return Response("Bottle app running!")


@post('/twiml')
def twiml_response():
    """
    Provides TwiML instructions in response to a Twilio POST webhook
    event so that Twilio knows how to handle the outbound phone call
    when someone picks up the phone.
    """
    response = twiml.Response()
    response.say("Sweet, this phone call is answered by your Bottle app!")
    response.play("https://api.twilio.com/cowbell.mp3", loop=10)
    return Response(str(response))


@route('/dial-phone/<outbound_phone_number>')
def outbound_call(outbound_phone_number):
    """
    Uses the Twilio Python helper library to send a POST request to
    Twilio telling it to dial an outbound phone call from our specific
    Twilio phone number (that phone number must be owned by our Twilio 
    account).
    """
    # the url must match the Ngrok Forwarding URL plus the route defined in
    # the previous function that responds with TwiML instructions
    twilio_client.calls.create(to=outbound_phone_number, 
                               from_=BLOG_POST_NUMBER,
                               url=NGROK_BASE_URL + '/twiml')
    return Response('phone call placed to ' + outbound_phone_number + '!')


if __name__ == '__main__':
    run(host='127.0.0.1', port=8000, debug=False, reloader=True)

Il y a juste un problème avec notre configuration actuelle si vous développez sur un environnement local :Twilio ne pourra pas atteindre ce /twiml route.Nous devons déployer notre application sur un serveur accessible ou simplement utiliser un outil de tunnellisation localhost tel que Ngrok. Ngrok fournit une URL externe qui se connecte à un port s'exécutant sur votre machine. Téléchargez et installez l'application Ngrok adaptée à votre système d'exploitation.

Nous exécutons Ngrok localement et exposons notre application Bottle qui s'exécute sur le port 8000. Exécutez cette commande dans le répertoire où se trouve l'exécutable Ngrok.

./ngrok http 8000

Ngrok démarrera et nous fournira une URL de transfert, avec les versions HTTP et HTTPS.

Nous pouvons utiliser l'URL de transfert pour indiquer à Twilio comment gérer l'appel téléphonique sortant lorsque quelqu'un décroche. Insérez l'URL de transfert Ngrok dans le app.py fichier où NGROK_BASE_URL est spécifié.

Si Ngrok vous est utile, assurez-vous de lire ces 6 excellentes raisons d'utiliser Ngrok lors du test de publication de webhooks pour en savoir encore plus sur l'outil.

Il est temps de tester notre application, essayons-la rapidement.

Passer des appels téléphoniques

Assurez-vous que votre serveur de développement Bottle est toujours en cours d'exécution ou relancez-le avec le python app.py commande dans un shell où votre virtualenv est toujours activé.

Affichez l'application dans un navigateur, cette fois testez les capacités d'appel téléphonique. Allez dans "localhost:8000/dial-phone/my-phone-number", où "my-phone-number" est un numéro au format "+12025551234". Par exemple, voici ce qui se passe lorsque j'ai composé le +12023351278 :

Et voici l'appel téléphonique entrant !

Lorsque nous prenons l'appel téléphonique, nous voyons également le /twiml l'itinéraire est appelé viaNgrok.

Avec seulement deux itinéraires dans notre application Bottle et Twilio, nous avons pu passer des appels téléphoniques sortants. Pas mal !

Quelle est la prochaine ?

Super, nous pouvons désormais passer des appels téléphoniques sortants vers n'importe qui numéro de téléphone de notre application Web Bottle. Ensuite, vous voudrez peut-être essayer l'un de ces didacticiels pour ajouter encore plus de fonctionnalités à votre application :

  • Mettre à niveau votre application Bottle pour envoyer et répondre également aux SMS
  • Créer un robot Slack pour les appels téléphoniques
  • Mettez en œuvre le suivi des appels pour les appels téléphoniques entrants et sortants effectués via votre application

Des questions? Contactez-moi via Twitter@fullstackpythonor @mattmakai. Je suis aussi sur GitHub asmattmakai.

Vous voyez quelque chose qui ne va pas dans ce message ? La source de cette page sur GitHuband soumet une pull request.