
Marca un Cuento de Navidad con Nexmo y Python
Tiempo de lectura: 4 minutos
Nota del editor: Quieres darTony's ¿Quieres probar el servicio "Llama a Carol"? Lo ofreceremos durante todo el mes de diciembre para que puedas llamar. Sólo tienes que marcar?? (44)-203-905-1327 o?? (1)-201-355-3236 ¡y difunde un poco de alegría navideña!
Ya casi es Navidad y casi ha pasado otro año.
He pensado despedir el año con un divertido y sencillo fragmento de código Python que te permitirá marcar un villancico navideño para poner una sonrisa en tu cara... o hacer que te descojones...
Esta es la idea principal:
Usted marca un Número Nexmo
Se escucha un menú de selección
Tú eliges
¡Oyes un villancico de mala muerte!
¡Impresionante!
Puesta en marcha
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 no has jugado con Nexmo hasta la fecha, te recomiendo nuestra documentación como primer puerto de escala.
También voy a suponer que usted sabe cómo configurar su webhooks. También puedes alojar tu servidor de webhooks en una plataforma de tu elección, o puedes probar localmente usando Ngrok. Si no has utilizado Ngrok antes te recomiendo que eches un vistazo a nuestro tutorial de Ngrok y también leer nuestra documentación al respecto.
Configuración de los Webhooks
Por lo tanto, ahora está listo para asegurarse de configurar sus webhooks. Asumiré que estás probando localmente con Ngrok y que los tienes configurados de la siguiente manera:
Webhook | URL
---- | ----
respuesta | https://abcdef1.ngrok.io:3000/webhooks/answer
evento | https://abcdef1.ngrok.io:3000/webhooks/event
NOTA: Esto supone que su servidor webhook se está ejecutando en el puerto 3000, pero puede ser cualquier puerto adecuado.
Hay otro webhook de interés en este tutorial, pero no se configura de la misma manera que el webhook de Respuesta o el webhook de Evento. Es el webhook DTMF que verás en la siguiente sección.
El webhook de respuesta
Cuando marque su número Nexmo, escuchará un menú de opciones. A continuación, puede seleccionar su villancico pulsando una tecla del teclado de su teléfono. Esta entrada se envía a su aplicación a través de un POST en el webhook DTMF, que tiene la forma https://abcdef1.ngrok.io:3000/webhooks/dtmf.
Entonces, ¿cómo sabe Nexmo cómo devolver la llamada en esta URL? Tiene que configurar el webhook DTMF en su código webhook de respuesta.
Mirando el webhook Respuesta se ve lo siguiente:
@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)Observando este código se puede ver que cuando se contesta la llamada entrante, el código NCCO que controla la llamada le envía el menú de opciones a través de las capacidades de texto a voz de Nexmo, y también establece el webhook DTMF. Así es como Nexmo sabe dónde volver a llamar con la entrada del teclado del teléfono.
También hay un par de parámetros especificados. El parámetro timeOut en este caso es ligeramente más largo que el predeterminado de tres segundos. En este caso le da un período de cinco segundos en el que responder con una pulsación de tecla antes de que el sistema agote el tiempo de espera de entrada. maxDigits De esta forma se asegurará de que sólo se acepte un dígito como entrada.
El otro parámetro digno de mención es bargeIn que en este caso se establece en true en este caso. Esto le permite interrumpir el menú de opciones para aquellos casos en los que simplemente no puede esperar a escuchar su villancico favorito.
También existe documentación más detallada documentación sobre DTMF que puede leer en su tiempo libre. Yo sólo cubrí lo básico aquí.
El webhook DTMF
Acabas de ver cómo funciona el webhook Respuesta. Ahora verás cómo funciona el webhook DTMF.
Primero aquí está el código:
@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)
Puedes ver que sólo estamos interesados en un POST en esta URL. Principalmente este código es para asegurarnos de que manejamos el caso en el que el usuario no introduce ninguna opción, o selecciona una opción que está fuera del rango presentado en el menú de opciones. La acción real ocurre de nuevo en la OCNC.
En la OCNC hay un pequeño mensaje que anuncia qué villancico va a sonar. A continuación, la acción stream se utiliza para reproducir un archivo MP3 en la llamada. Esta función es bastante útil para cosas como la música en espera, etc., pero podemos utilizarla en este caso para obtener nuestra dosis festiva. Sólo tiene que especificar la dirección URL y la música es, por magia Nexmo increíble, jugó en su llamada.
El código completo
He cubierto las partes más importantes del código. Aquí está el código completo para su conveniencia:
#!/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)
Una vez que tenga su aplicación en marcha, sólo tiene que marcar en Nexmo utilizando su número Nexmo, hacer su selección de las opciones proporcionadas a través del teclado del teléfono, y escuchar un poco de diversión festiva.
Así pues, espero que haya disfrutado de este código navideño.
Aprovecho la ocasión para desearles a todos una Feliz Navidad y un próspero Año Nuevo.
¿Y ahora qué?
El código fuente está disponible en GitHub:
Aquí tiene algunos recursos que le serán útiles si quiere profundizar en el tema:
Referencia OCNC - describe la
inputacción en detalle.Tutorial de Ngrok - una guía útil para probar tu aplicación localmente.
Webhooks - Todo lo que siempre quiso saber sobre Webhooks pero no se atrevió a preguntar.
