
Share:
Aaron war ein Entwickler-Befürworter bei Nexmo. Aaron ist ein erfahrener Software-Ingenieur und Möchtegern-Digitalkünstler, der häufig Dinge mit Code oder Elektronik entwickelt, manchmal auch beides. Wenn er an etwas Neuem arbeitet, erkennt man das in der Regel am Geruch von brennenden Bauteilen in der Luft.
Weiterleitung eines Telefonanrufs über Voice Proxy mit Python und Starlette
Lesedauer: 4 Minuten
Es gibt einige Situationen, in denen wir es brauchen, dass ein Fremder uns anruft oder dass wir ihn anrufen können. Ein Lieferfahrer muss Sie vielleicht wegen Ihres Pakets anrufen; Sie müssen vielleicht Ihren Taxifahrer anrufen, weil Sie Ihren Regenschirm vergessen haben. In solchen Situationen ist es praktisch, wenn man anrufen und mit der tatsächlichen Person sprechen kann und nicht mit einem Callcenter. Keiner möchte jedoch, dass ein Fremder seine Privatnummer hat.
Mit einer Anrufweiterleitung können Sie es Personen ermöglichen, sich gegenseitig anzurufen, ohne dass einer der Beteiligten die Telefonnummer des anderen kennt. Diese Art der Anrufweiterleitung wird als Voice Proxy bezeichnet.
Bevor Sie beginnen
Es gibt einige Dinge, die Sie benötigen, bevor Sie beginnen:
Python 3.6+. Dieses Beispiel verwendet die asynchrone Starlette Framework, daher ist eine aktuelle Version von Python ein Muss.
Wenn Sie das Beispiel in Ihrer lokalen Entwicklungsumgebung ausführen, benötigen Sie eine Möglichkeit, es dem Internet zugänglich zu machen, z. B. durch die Verwendung von ngrok.
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.
Download des Kodex
Der gesamte Code für dieses Beispiel ist in der Nexmo Community Organisation auf Github verfügbar. Klonen Sie das Repository jetzt:
git clone git@github.com:nexmo-community/nexmo-python-voiceproxy.git
cd nexmo-python-voiceproxy
Sobald Sie das Repository geklont haben, sollten Sie seine Abhängigkeiten installieren. Ich empfehle, dass Sie dies immer in einer neuen virtuellen Umgebung tun.
python -m venv nexmo-voiceproxy
source nexmo-voiceproxy/bin/activate
pip install -r requirements.txt
Einen Starlette-Server erstellen
Wir stellen Anweisungen für die Nexmo Voice API über ein Nexmo Anrufsteuerungsobjekt (NCCO). Das NCCO ist eine JSON-Datei, die eine Liste von Aktionen enthält, die Nexmo ausführen soll, wenn ein Benutzer eine virtuelle Nummer von Nexmo anruft. In diesem Beispiel hat das NCCO eine einzige Aktion, connect
. Die connect
Aktion ermöglicht es uns, den Anruf mit verschiedenen Endpunkten zu verbinden. Ein Endpunkt könnte eine andere Nummer, ein WebSocket oder ein SIP-Endpunkt sein. In diesem Beispiel verwenden Sie den number
Typ. Die Weiterleitung eines Anrufs an eine andere Nummer auf diese Weise ist für den Benutzer nicht sichtbar.
async def get(self, request):
return JSONResponse(
[
{
"action": "connect",
"from": os.getenv("NEXMO_NUMBER_FROM"),
"endpoint": [
{"type": "phone", "number": os.getenv("NEXMO_NUMBER_TO")}
],
}
]
)
Der obige Code hat zwei Umgebungsvariablen, die Sie angeben müssen. NEXMO_NUMBER_FROM
Dies ist die Telefonnummer, die der Benutzer anruft, um den Proxy zu initiieren, es ist auch die Nummer, die der andere Benutzer als den Anrufer sieht. Diese Nummer muss eine virtuelle Nummer von Nexmo sein; ich werde später im Artikel erklären, wie Sie eine virtuelle Nummer mieten und mit Ihrer Anwendung verknüpfen können.
NEXMO_NUMBER_TO
ist die Telefonnummer des Benutzers, der den vermittelten Anruf erhält. Diese Nummer kann eine beliebige E.164-formatierte Telefonnummer sein.
Sprach-API-Ereignisse
Sie können den Status Ihres Proxy-Anrufs mit Hilfe des Event-Webhooks verfolgen. Wann immer sich der Status des Anrufs ändert, benachrichtigt Nexmo Sie über einen Webhook. Die an den Webhook gelieferten Informationen unterscheiden sich je nach aktuellem Status, eine vollständige Liste finden Sie in der Sprach-API-Dokumentation.
In diesem Beispiel werden die Informationen auf dem Terminal protokolliert, so dass Sie die Ereignisse in Echtzeit verfolgen können. Es ist erwähnenswert, dass Sie immer eine 200 OK
HTTP-Antwort an alle Nexmo-Webhooks zurückgeben. Wenn Sie keine 200 OK
Antwort zurückgeben, geht die Nexmo-API davon aus, dass ein Fehler aufgetreten ist, und versucht nach einer kurzen Verzögerung erneut, den Endpunkt zu erreichen. Um Mehrfachanfragen und doppelte Daten zu vermeiden, sollten Sie immer eine 200 OK
.
async def post(self, request):
event = await request.json()
log.msg("Voice Proxy", **event)
return PlainTextResponse()
Standardmäßig fordert die Nexmo-API die NCCO-Datei über GET
an und benachrichtigt den Ereignis-Webhook über eine POST
Anfrage mit einem JSON-Body. Sie können dies in Ihren Anwendungseinstellungen ändern, aber der Code für dieses Tutorial geht davon aus, dass GET
Anfragen für das NCCO sind und POST
Anfragen Ereignisbenachrichtigungen sind.
Verknüpfung einer virtuellen Nummer mit einer Sprachanwendung
Die Nexmo-API muss auf Ihren Starlette-Server zugreifen können. Wenn Sie dieses Beispiel lokal ausführen, müssen Sie Ihren Server dem öffentlichen Internet aussetzen. Für weitere Informationen, wie Sie einen Tunnel zu localhost erstellen, lesen Sie unseren Blog-Beitrag über ngrok.
Stellen Sie sicher, dass Ihr Server läuft python server.py
und öffnen Sie dann ein neues Terminal für ngrok
:
ngrok http 8000
Jetzt, wo Ihr Proxy-Server läuft und über die Nexmo API erreichbar ist, können Sie eine virtuelle Nexmo-Nummer mieten und eine neue Sprachanwendung über das Nexmo Dashboardoder über die Vonage CLI. Weitere Informationen über die Installation der Vonage CLI finden Sie finden Sie hier.
Um dies über die CLI zu tun, müssen Sie mehrere Befehle ausführen:
vonage numbers:search [COUNTRYCODE]
vonage numbers:buy [NUMBER] [COUNTRYCODE]
vonage apps:create
vonage apps:link [APPLICATION_ID] --number=number
Die obigen Befehle führen Folgendes aus:
Suche nach einer verfügbaren Nummer mit
COUNTRYCODE
. EinreichenGB
für britische virtuelle Nummern undUS
für Nummern in den USA.Wenn Sie eine passende Nummer gefunden haben, kaufen Sie sie mit
vonage numbers:buy [NUMBER] [COUNTRYCODE]
Wenn Sie eine neue Sprachanwendung erstellen, führen Sie
vonage apps:create
und folgen Sie den Anweisungen. Sie müssen einen Namen für die Anwendung, die URL Ihrer NCCO-Datei, die URL Ihres Ereignis-Webhooks und einen Ort zum Speichern Ihres privaten Schlüssels angeben. Der private Schlüssel wird für die Authentifizierung bei der Nexmo Voice API verwendet, wenn Sie ausgehende Anrufe tätigen. Da dieses Beispiel nur eingehende Anrufe verarbeitet, benötigen Sie diesen privaten Schlüssel diesmal nicht.Verknüpfen Sie schließlich die virtuelle Nummer mit Ihrer neuen Anwendung. Es können mehrere Nummern mit einer einzigen Anwendung verknüpft werden, z. B. wenn Sie verschiedene lokale Nummern für Benutzer in verschiedenen Ländern haben möchten.
Alles zusammenfügen
Sobald Sie eine virtuelle Nummer mit Ihrer Sprachanwendung verknüpft haben und Ihr Proxyserver läuft und für das öffentliche Internet zugänglich ist, können Sie Ihren ersten Anruf proxysieren.
Wenn Sie ein zweites Gerät verwenden, um die mit Ihrer Anwendung verbundene virtuelle Nexmo-Nummer anzurufen, können Sie die Anfrage für das NCCO im Starlette-Terminal sehen.
Wenn der Anruf weitergeleitet wird und Ihr anderes Telefon zu klingeln beginnt, überprüfen Sie die angezeigte Nummer des Anrufers. Die angezeigte Nummer ist nicht die Telefonnummer des Telefons, von dem der Anruf ausgeht, sondern die virtuelle Nexmo-Nummer, die Sie als Ihre NEXMO_NUMBER_FROM
Nummer. Mit einem Dutzend Codezeilen haben Sie einen anonymen Sprach-Proxy erstellt!
Weitere Lektüre
Die Anrufweiterleitung ist nur eine der vielen Möglichkeiten, die Sie mit der Nexmo Voice API nutzen können. Sie sollten versuchen, den Anruf mit einem WebSocket zu verbinden, oder den Events-Webhook modifizieren, um Statistiken über Ihre Anrufe zu verfolgen. Sie könnten sogar eine Echtzeit-Stimmungsanalyse des Anrufs.
Kontakt aufnehmen
Wenn Sie Fragen oder Kommentare zu diesem Beitrag haben, oder wenn Sie als Erster erfahren wollen, wenn wir etwas Neues schreiben oder eine coole Technologie finden, dann folgen Sie uns auf Twitter: @NexmoDev
Share:
Aaron war ein Entwickler-Befürworter bei Nexmo. Aaron ist ein erfahrener Software-Ingenieur und Möchtegern-Digitalkünstler, der häufig Dinge mit Code oder Elektronik entwickelt, manchmal auch beides. Wenn er an etwas Neuem arbeitet, erkennt man das in der Regel am Geruch von brennenden Bauteilen in der Luft.