https://d226lax1qjow5r.cloudfront.net/blog/blogposts/dial-a-christmas-carol-with-nexmo-and-python-dr/Dial-a-Christmas-Carol.png

Wählen Sie ein Weihnachtslied mit Nexmo und Python

Zuletzt aktualisiert am May 4, 2021

Lesedauer: 3 Minuten

Anmerkung des Herausgebers: Sie möchten gebenTony's Dial-a-Carol-Dienst ausprobieren? Wir werden ihn den ganzen Dezember über anbieten, damit Sie anrufen können! Wählen Sie einfach?? (44)-203-905-1327 oder?? (1)-201-355-3236 und verbreiten Sie Weihnachtsstimmung!

Es ist fast Weihnachten und ein weiteres Jahr ist fast vorbei!

Ich dachte, ich würde das Jahr mit einem lustigen und einfachen Stück Python-Code ausklingen lassen, mit dem Sie ein Weihnachtslied wählen können, das Ihnen ein Lächeln ins Gesicht zaubert - oder Sie erschaudern lässt...

Das ist der Grundgedanke:

  1. Sie wählen eine Nexmo-Nummer

  2. Sie hören ein Auswahlmenü

  3. Sie treffen Ihre Wahl

  4. Sie hören ein schauriges Lied!

Fantastisch!

Einrichten

Vonage API-Konto

Um dieses Tutorial durchzuführen, benötigen Sie ein Vonage API-Konto. Wenn Sie noch keines haben, können Sie sich noch heute anmelden und mit einem kostenlosen Guthaben beginnen. Sobald Sie ein Konto haben, finden Sie Ihren API-Schlüssel und Ihr API-Geheimnis oben auf dem Vonage-API-Dashboard.

In diesem Lernprogramm wird auch eine virtuelle Telefonnummer verwendet. Um eine zu erwerben, gehen Sie zu Rufnummern > Rufnummern kaufen und suchen Sie nach einer Nummer, die Ihren Anforderungen entspricht.

Wenn Sie bisher noch nicht mit Nexmo gespielt haben, empfehle ich Ihnen unsere Dokumentation als erste Anlaufstelle.

Ich gehe auch davon aus, dass Sie wissen, wie Sie Ihre Webhooks. Sie können Ihren Webhook-Server auch auf einer Plattform Ihrer Wahl hosten, oder Sie können ihn lokal mit Ngrok testen. Wenn Sie Ngrok noch nicht verwendet haben, empfehle ich Ihnen einen Blick in unser Ngrok-Anleitung Blogbeitrag und lesen Sie auch unsere Dokumentation zu lesen.

Konfigurieren Ihrer Webhooks

Jetzt können Sie sicherstellen, dass Sie Ihre Webhooks konfigurieren. Ich gehe davon aus, dass Sie lokal mit Ngrok testen und sie wie folgt eingestellt haben:

Webhook | URL

---- | ----

Antwort | https://abcdef1.ngrok.io:3000/webhooks/answer

Veranstaltung | https://abcdef1.ngrok.io:3000/webhooks/event

HINWEIS: Es wird davon ausgegangen, dass Ihr Webhook-Server auf Port 3000 läuft, aber es kann jeder geeignete Port sein.

Es gibt noch einen weiteren Webhook, der in diesem Tutorial von Interesse ist, den Sie aber nicht auf die gleiche Weise einstellen wie die URLs des Antwort-Webhooks oder des Ereignis-Webhooks. Es handelt sich um den DTMF-Webhook, den Sie im nächsten Abschnitt sehen werden.

Der Antwort-Webhook

Wenn Sie Ihre Nexmo-Nummer einwählen, hören Sie ein Optionsmenü. Sie können dann Ihr Lied auswählen, indem Sie eine Taste auf Ihrer Telefontastatur drücken. Diese Eingabe wird an Ihre Anwendung über einen POST auf dem DTMF-Webhook gesendet, der die folgende Form hat https://abcdef1.ngrok.io:3000/webhooks/dtmf.

Woher weiß Nexmo also, wie man diese URL zurückruft? Sie müssen den DTMF-Webhook in Ihrem Antwort-Webhook-Code einstellen.

Ein Blick auf den Webhook Antwort zeigt Folgendes:

@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)

Anhand dieses Codes können Sie sehen, dass bei der Beantwortung Ihres eingehenden Anrufs die NCCO das den Anruf steuert, Ihnen das Optionsmenü über die Text-To-Speech-Funktionen von Nexmo sendet und auch den DTMF-Webhook setzt. Auf diese Weise weiß Nexmo, wo er bei einer Eingabe über die Telefontastatur zurückrufen muss.

Es sind auch einige Parameter angegeben. Der timeOut Parameter ist in diesem Fall etwas länger als der Standardwert von drei Sekunden eingestellt. In diesem Fall gibt er Ihnen fünf Sekunden Zeit, um mit einem Tastendruck zu reagieren, bevor das System eine Zeitüberschreitung beim Warten auf die Eingabe eintritt. maxDigits Auf diese Weise wird sichergestellt, dass nur eine Ziffer als Eingabe akzeptiert wird.

Der andere erwähnenswerte Parameter ist bargeIn der in diesem Fall auf true eingestellt ist. Damit können Sie das Optionsmenü unterbrechen, wenn Sie es nicht erwarten können, Ihr Lieblingslied zu hören!

Es gibt auch eine ausführlichere Dokumentation über DTMF die Sie in Ruhe lesen können. Ich habe hier nur die Grundlagen behandelt.

Der DTMF-Webhook

Sie haben gerade gesehen, wie der Antwort-Webhook funktioniert. Jetzt werden Sie sehen, wie der DTMF-Webhook funktioniert.

Hier ist zunächst der 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)

Wie Sie sehen können, sind wir nur an einem POST Callback auf diese URL. Dieser Code dient hauptsächlich dazu, sicherzustellen, dass wir den Fall behandeln, dass der Benutzer überhaupt keine Option eingibt oder eine Option auswählt, die außerhalb des im Optionsmenü dargestellten Bereichs liegt. Die eigentliche Aktion findet wieder in der NCCO statt.

Im NCCO gibt es eine kleine Meldung, die ankündigt, welches Lied gespielt werden soll. Dann wird die stream wird eine MP3-Datei in den Anruf eingespielt. Diese Funktion ist recht nützlich für Dinge wie Warteschleifenmusik und so weiter, aber wir können sie in diesem Fall nutzen, um unsere festliche Stimmung zu erhalten. Sie müssen nur die URL angeben, und die Musik wird auf wundersame Weise von Nexmo in Ihren Anruf eingespielt.

Der vollständige Code

Ich habe die wichtigsten Teile des Codes abgedeckt. Hier ist der vollständige Code für Ihre Bequemlichkeit:

#!/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)

Sobald die Anwendung läuft, wählst du dich mit deiner Nexmo-Nummer in Nexmo ein, wählst über die Tastatur deines Telefons aus den angebotenen Optionen aus und hörst dir ein paar lustige Lieder an.

Ich hoffe, Sie haben diesen Weihnachtscode genossen.

Ich möchte diese Gelegenheit nutzen, um Ihnen allen ein frohes Weihnachtsfest und ein gutes neues Jahr zu wünschen!

Wie geht es weiter?

Der Quellcode ist auf GitHub verfügbar:

Hier finden Sie einige nützliche Ressourcen, wenn Sie die Dinge weiter erforschen möchten:

  • NCCO-Referenz - Dies beschreibt die input Aktion im Detail.

  • Ngrok-Tutorial - eine nützliche Anleitung zum lokalen Testen Ihrer Anwendung.

  • Webhooks - Alles, was Sie schon immer über Webhooks wissen wollten, aber nicht zu fragen wagten.

Teilen Sie:

https://a.storyblok.com/f/270183/150x150/931b34422e/abedford.png
Tony BedfordVonage Ehemalige