
Composez un chant de Noël avec Nexmo et Python
Temps de lecture : 4 minutes
Note de l'éditeur : Vous voulez donnerTony's Vous souhaitez essayer le service Dial-a-Carol ? Nous l'accueillerons tout au long du mois de décembre pour que vous puissiez l'appeler ! Il suffit de composer? ? (44)-203-905-1327 ou? ? (1)-201-355-3236 et répandre la joie de Noël !
C'est bientôt Noël et une autre année s'est presque écoulée !
J'ai pensé terminer l'année avec un morceau de code Python amusant et facile pour vous permettre de composer un chant de Noël qui vous fera sourire - ou vous fera grimacer...
Voici l'idée principale :
Vous composez un Numbers Nexmo
Vous entendez un menu de sélection
Vous faites votre choix
Vous entendez un chant de circonstance !
Génial !
Mise en place
Vonage API Account
To complete this tutorial, you will need a Vonage API account. If you don’t have one already, you can sign up today and start building with free credit. Once you have an account, you can find your API Key and API Secret at the top of the Vonage API Dashboard.
This tutorial also uses a virtual phone number. To purchase one, go to Numbers > Buy Numbers and search for one that meets your needs.
Si vous n'avez pas encore joué avec Nexmo, je vous recommande de consulter d'abord notre documentation.
Je vais également supposer que vous savez comment configurer vos webhooks. Vous pouvez également héberger votre serveur webhook sur une plateforme de votre choix, ou vous pouvez tester localement en utilisant Ngrok. Si vous n'avez jamais utilisé Ngrok, je vous recommande de jeter un coup d'œil à notre tutoriel Ngrok et de lire notre documentation à ce sujet.
Configuration des Webhooks
Vous êtes maintenant prêt à configurer vos webhooks. Je vais supposer que vous testez localement avec Ngrok et que vous les avez configurés de la manière suivante :
Webhook | URL
---- | ----
réponse | https://abcdef1.ngrok.io:3000/webhooks/answer
événement | https://abcdef1.ngrok.io:3000/webhooks/event
REMARQUE : Cela suppose que votre serveur webhook fonctionne sur le port 3000, mais il peut s'agir de n'importe quel port approprié.
Il existe un autre webhook intéressant dans ce tutoriel, mais vous ne le définissez pas de la même manière que les URL du webhook de réponse ou du webhook d'événement. Il s'agit du webhook DTMF que vous verrez dans la section suivante.
Le Webhook de la réponse
Lorsque vous composez votre numéro Nexmo, vous entendez un menu d'options. Vous pouvez alors sélectionner votre chant en appuyant sur une touche du clavier de votre téléphone. Cette entrée est envoyée à votre application par l'intermédiaire d'un POST sur le webhook DTMF, qui a la forme suivante https://abcdef1.ngrok.io:3000/webhooks/dtmf.
Comment Nexmo sait-il rappeler cette URL ? Vous devez définir le webhook DTMF dans votre code webhook Answer.
En regardant le webhook Answer, vous voyez ce qui suit :
@app.route("/webhooks/answer")
def answer_call():
params = request.args
input_webhook_url = request.url_root + "webhooks/dtmf"
ncco = [
{
"action": "talk",
"bargeIn": "true",
"text": menu
},
{
"action": "input",
"maxDigits": 1,
"timeOut": 5,
"eventUrl": [input_webhook_url]
}
]
return jsonify(ncco)En regardant ce code, vous pouvez voir que lorsque votre appel entrant est pris, le NCCO qui contrôle l'appel vous envoie le menu d'options via les capacités Text-To-Speech de Nexmo, et active également le webhook DTMF. C'est ainsi que Nexmo sait où rappeler à partir du clavier du téléphone.
Quelques paramètres sont également spécifiés. Le paramètre timeOut est légèrement plus long que la valeur par défaut de trois secondes. Dans ce cas, il vous donne un délai de cinq secondes pour répondre par une pression sur une touche avant que le système ne se mette en attente d'une entrée. maxDigits En réglant ce paramètre, on s'assure qu'un seul chiffre est accepté comme entrée.
L'autre paramètre qui mérite d'être mentionné est bargeIn qui est fixé à true dans ce cas. Cela vous permet d'interrompre le menu d'options pour les cas où vous ne pouvez pas attendre d'entendre votre chant préféré !
Il existe également une documentation plus détaillée documentation sur les DTMF que vous pouvez lire à loisir. Je me suis contenté de couvrir les bases ici.
Le Webhook DTMF
Vous venez de voir comment fonctionne le webhook Answer. Vous allez maintenant voir comment fonctionne le webhook DTMF.
Voici d'abord le code :
@app.route("/webhooks/dtmf", methods=['POST'])
def dtmf_webhook():
data = request.get_json()
selection = data['dtmf']
if selection == "":
selection = "1"
index = int(selection)-1
if index < 0 or index > len(tunes)-1:
index = 0
carol_url = base_url + tunes[index][1]
print(tunes[index][1])
msg = "Playing Christmas carol " + str(index+1)
ncco = [
{
"action": "talk",
"text": msg
},
{
"action": "stream",
"streamUrl": [carol_url]
}
]
return jsonify(ncco)
Vous pouvez voir que nous ne sommes intéressés que par un POST sur cette URL. Ce code sert principalement à s'assurer que nous gérons le cas où l'utilisateur n'entre pas d'option du tout, ou sélectionne une option qui est en dehors de la plage présentée dans le menu d'option. L'action réelle se déroule à nouveau dans le NCCO.
Dans le NCCO, un petit message d'invite annonce le chant qui va être joué. Ensuite, l'action stream est utilisée pour jouer un fichier MP3 dans l'appel. Cette fonction est très utile pour des choses telles que la musique d'attente, mais nous pouvons l'utiliser dans ce cas pour obtenir notre dose de fête. Il vous suffit de spécifier l'URL et la musique est, par la magie de Nexmo, jouée dans votre appel.
Le code complet
J'ai couvert les parties les plus importantes du code. Voici le code complet pour votre commodité :
#!/usr/bin/env python3
from flask import Flask, request, jsonify
from pprint import pprint
app = Flask(__name__)
base_url = 'https://raw.githubusercontent.com/tbedford/git-testing-repo/master/tunes/xmas/'
# Tunes courtesy http://www.freexmasmp3.com/
tunes = [
["Little Town of Bethlehem", "bethlem-jazz.mp3"],
["Ding Dong Merrily", "ding-dong-merrily.mp3"],
["First Noel", "first-noel-r-and-b.mp3"],
["Jingle Bells", "jingle-bells-country.mp3"],
["Silent Night", "silent-night-piano.mp3"],
["Twelve Days of Christmas", "twelve-days-funk.mp3"]
]
# Build options menu
menu = "Welcome to dial a Christmas carol. You can choose from the following cheesy carols."
i = 1
for t in tunes:
menu = menu + " Option " + str(i) + " is " + t[0] +"."
i = i + 1
menu = menu + " Please make your selection now."
@app.route("/webhooks/answer")
def answer_call():
params = request.args
input_webhook_url = request.url_root + "webhooks/dtmf"
ncco = [
{
"action": "talk",
"bargeIn": "true",
"text": menu
},
{
"action": "input",
"maxDigits": 1,
"timeOut": 5,
"eventUrl": [input_webhook_url]
}
]
return jsonify(ncco)
@app.route("/webhooks/dtmf", methods=['POST'])
def dtmf_webhook():
data = request.get_json()
selection = data['dtmf']
if selection == "":
selection = "1"
index = int(selection)-1
if index < 0 or index > len(tunes)-1:
index = 0
carol_url = base_url + tunes[index][1]
print(tunes[index][1])
msg = "Playing Christmas carol " + str(index+1)
ncco = [
{
"action": "talk",
"text": msg
},
{
"action": "stream",
"streamUrl": [carol_url]
}
]
return jsonify(ncco)
@app.route("/webhooks/event", methods=['POST'])
def events():
data = request.get_json()
pprint(data)
return ("OK")
if __name__ == '__main__':
app.run(port=3000)
Une fois votre application lancée, il vous suffit de composer votre numéro Nexmo, de faire votre choix parmi les options proposées via le clavier de votre téléphone, et d'écouter les plaisirs de la fête.
J'espère que vous avez apprécié ce code de Noël.
Je profite de l'occasion pour vous souhaiter à tous un très joyeux Noël et une bonne année !
Quelle est la prochaine étape ?
Le code source est disponible sur GitHub :
Voici quelques ressources qui vous seront utiles si vous souhaitez aller plus loin :
Référence NCCO - Ce document décrit l'action en détail.
inputen détail.Tutoriel Ngrok - un guide utile pour tester votre application localement.
Crochets Web - Tout ce que vous avez toujours voulu savoir sur les Webhooks sans jamais oser le demander.
