[PYTHON] Verständnis aus dem Mechanismus Twilio # 2-Kommunikationsflussdatenstruktur

Dieser Artikel ist eine Fortsetzung des folgenden Artikels. Es gibt einige Begriffe, die in der Artikelserie eindeutig definiert sind. Es wird daher empfohlen, sie zuerst zu lesen. Verständnis aus dem Mechanismus Twilio # 1 - Einführung

Dieser Abschnitt beschreibt den Kommunikationsfluss bei Verwendung von Twilio und die zu sendende und zu empfangende Datenstruktur.

―― 1. Einführung ―― 1. Definition der Grundstruktur und der Begriffe bei Verwendung von Twilio ―― 2. Die Umgebung wurde diesmal überprüft ―― 2. ** Kommunikationsflussdatenstruktur ← Jetzt hier **

Der diesmal zu realisierende Twilio-Client zielte darauf ab, dasselbe wie ein normales Telefon tun zu können. Die spezifischen Spezifikationen sind wie folgt.

--Was du tun kannst

Es wird angenommen, dass die Parameter wie die Telefonnummer wie folgt sind.

Parameter Wert Erläuterung / Bemerkungen
Twilio Telefonnummer 050-3123-4567 Die dem Twilio-Client zugewiesene Telefonnummer. Bitte kaufen Sie im Voraus über die Twilio-Konsole.
Client Name DeviceId_0001 Der Name, mit dem der Twilio-Client auf dem Twilio-Server identifiziert und gesteuert wird.
Externes Telefon 090-5987-6543 Telefon außerhalb von Twilio. Bitte benutzen Sie Ihr eigenes Handy.

Authentifizierung / Capability Token-Übertragung

Verarbeitungsablauf

Schauen Sie sich zunächst die folgende Abbildung an. TwilioDiagrams_Fig2-1.png

Der Verarbeitungsablauf ist wie folgt.

--1-1. Anforderung, ein Fähigkeitstoken zu erhalten

Die Implementierung der Kommunikationsmethode zwischen 1-1 und 1-2 liegt ganz beim Benutzer. Es ist auch möglich, HTTP / HTTPS und andere Protokolle für die Kommunikation zu verwenden.

Die Datenstruktur ist ebenfalls völlig willkürlich. Die vom Twilio-Client gesendeten Informationen können einen Benutzernamen, ein Kennwort und andere Informationen zur Identifizierung des Twilio-Clients enthalten. Es ist auch möglich, eine beliebige Authentifizierung / Autorisierung zu realisieren. Capability Token ist als von API Server zurückgegebene Informationen erforderlich, es können jedoch auch alle anderen Informationen zurückgegeben werden.

Bei dieser Überprüfung wurden sowohl Anforderung als auch Antwort in JSON implementiert. Die spezifische Datenstruktur ist wie folgt.

Die Anfrage war einfach eine Twilio-Telefonnummer. Wenn die angegebene Twilio-Telefonnummer bereits erhalten wurde, ist die Authentifizierung erfolgreich.

"+81-50-1234-9876"}



 Die Antwort war das Capability Token und der Erfolg oder Misserfolg des Prozesses.

#### **`{"capabilityToken": capabilityToken, "success": True}`**

Kommunikation 1-3 wurde nicht verifiziert. Details sind unbekannt. Im Fall eines JavaScript-Clients wird anscheinend WebSocket verwendet, um Informationen wie das Capability Token an Twilio Server zu senden. Die Ersteinrichtung erfolgt über verschiedene von Twilio bereitgestellte SDKs, sodass Benutzer sich dessen normalerweise nicht bewusst sein müssen. \ # Ich denke jedoch, dass es Fälle geben kann, in denen diese Informationen bei der Fehlerbehebung benötigt werden.

Capability Token-Erstellung / Datenstruktur

API Server verwendet die Twilio Helper-Bibliothek, um Capability-Token zu generieren.

Die Erklärung basiert auf der Implementierung in Python 2.7. Es wird davon ausgegangen, dass die erforderlichen Bibliotheken bereits installiert und verfügbar sind. https://www.twilio.com/docs/libraries/python#help Außerdem wird davon ausgegangen, dass das Twilio-Konto eröffnet und die Konto-SID und das Authentifizierungstoken bestätigt wurden und dass die TwiML-App erstellt und die App-SID bestätigt wurde.

    from twilio.util import TwilioCapability
    import json

    def generate_capability_token(twilio_phone_number):

        #Stellen Sie die erforderlichen Parameter ein.
        twilio_account_sid = "{{twilio_accound_sid}}"  #Geben Sie die SID Ihres Twilio-Kontos an.
        twilio_auth_token = "{{twilio_account_auth_token}}" #Geben Sie das Auth-Token an, das Ihrem Twilio-Konto zugeordnet ist.
        twilio_app_sid = "{{twilio_app_sid}}"  #Geben Sie die zuvor erstellte App Sid an.
        expiration_time_for_capability_token = 3600  #Gibt das Ablaufdatum des Capability-Tokens an.

        #Generieren Sie ein Capability Token und erteilen Sie die erforderlichen Berechtigungen.
        capability = TwilioCapability(twilio_account_sid, twilio_auth_token)
        capability.allow_client_incoming(get_client_name_by_phone_number(twilio_phone_number)) #Ruft den Twilio-Client-Namen basierend auf der angegebenen Twilio-Telefonnummer ab. erhalten_client_name_by_phone_number ist eine Funktion, die Sie individuell implementiert haben.
        capability.allow_client_outgoing(twilio_app_sid)
        capabilityToken = capability.generate(expiration_time_for_capability_token)

        #In die Standardstruktur konvertieren und zurückgeben.
        res = {"capabilityToken": capabilityToken, "success": True}
        return json.dumps(res)

Grundsätzlich wird es gemäß folgendem Dokument implementiert. Generate Capability Tokens http://twilio-python.readthedocs.io/en/latest/usage/token-generation.html

Gewähren Sie nach dem Generieren der Twilio-Fähigkeit basierend auf der SID und dem Authentifizierungstoken des Twilio-Kontos Berechtigungen mit den Methoden allow_client_incoming und allow_client_outgoing. Schließlich können Sie ein Capability-Token generieren, indem Sie die Twilio Capability-Generierungsmethode ausführen. Sie können das Ablaufdatum in Sekunden als Argument angeben.

Details zum Capability Token finden Sie in den folgenden Dokumenten.

Twilio Client: Capability Tokens https://www.twilio.com/docs/api/client/capability-tokens

Capbility Token ist im JWT-Format (Json Web Token). Für die Generierung ist keine Kommunikation mit Twilio Server erforderlich. Obwohl es nicht verifiziert wurde, wird angenommen, dass die erforderlichen Informationen in JSON konvertiert werden, eine elektronische Signatur mit Auth Token generiert und angegeben wird und anschließend die Base64-Decodierung durchgeführt wird.

Die wichtigen Punkte hier sind wie folgt.

Schauen wir uns als nächstes an, wie Twilio Client andere Telefone anruft.

Anruf von einem externen Telefon zu einem Twilio-Client (eingehender Anruf)

Verarbeitungsablauf

Schauen Sie sich zunächst die folgende Abbildung an. TwilioDiagrams_Fig2-2.png

Denken Sie auch an die URL, die Sie eingerichtet haben, als Sie Ihr Twilio-Konto eingerichtet und Ihre Telefonnummer erhalten haben. Die unter "A CALL COMES IN" angegebene URL wird beim Empfang eines Anrufs verwendet. 2016-10-16_03h52_20.png

Der Verarbeitungsablauf ist wie folgt. ** Um TwiML zu erhalten, wird die in der Twilio-Telefonnummer des Empfängers festgelegte URL verwendet. ** **.

--2-1. Rufen Sie Twilio Client von einem tatsächlichen Telefon aus an

TwiML, das vom API-Server zurückgegeben werden soll

Das von API Server in Nr. 2-3 zurückgegebene TwiML lautet wie folgt. Diese TwiML bedeutet, den angegebenen Twilio-Client aufzurufen.

<?xml version="1.0\" encoding="UTF-8"?>
<Response>
  <Dial timeout="60">
    <Client>DeviceId_0001</Client>
  </Dial>
</Response>

Die Twilio-Telefonnummer selbst kann nicht im Element \ angegeben werden. Sie müssen den Client-Namen des Twilio-Clients eingeben, der Ihrer Twilio-Telefonnummer zugeordnet ist. \ # Hier wird angenommen, dass es sich um "DeviceId_0001" handelt.

Daher muss API Server den Client-Namen basierend auf den Twilio-Telefonnummerninformationen des Empfängers in Nr. 2-3 ermitteln. Es ist besser, die Zuordnungsinformationen im Voraus in der Datenbank usw. zu speichern und bei der Generierung von TwiML abzurufen.

Darüber hinaus kann TwiML verschiedene Steuerelemente ausführen. Einzelheiten entnehmen Sie bitte dem offiziellen Dokument.

https://www.twilio.com/docs/api/twiml/dial https://www.twilio.com/docs/api/twiml/client

HTTP-POST-Anfrage von Twilio Server

Anfragen von Twilio Server an API Server sind etwas Besonderes. Außerdem konnte ich in der offiziellen Dokumentation keine detaillierten Informationen finden. Das Folgende ist eine Erklärung basierend auf den vom Paket erfassten Informationen.

2016-10-16_04h19_49.png

Die obige Abbildung zeigt eine Paketerfassung einer HTTP-POST-Anforderung von Twilio Server. Die Punkte sind wie folgt.

--Content-Type: muss application / x-www-form-urlencoded sein

Schauen wir uns die Details der einzelnen Parameter an. Die Telefonnummer des Absenders lautet "090-5987-6543" und die Twilio-Telefonnummer des Empfängers lautet "050-3123-4567".

Parameter Beschreibung (basierend auf Vermutungen)
AccountSid=AC3xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Die SID Ihres Twilio-Kontos.
ApiVersion=2010-04-01 Ist es die API-Version von Twilio?
Called=%2B815031234567 Twilio-Telefonnummer des Empfängers. E..164 Format. Es scheint, dass der gleiche Wert wie To eingegeben wird.
CalledCity=
CalledCountry=JP
CalledState=
CalledVia=05031234567 Unbekannt. Wird es verwendet, wenn der Anruf innerhalb von Twilio weitergeleitet wird?
CalledZip=
Caller=%2B819059876543 Die Telefonnummer des anrufenden Telefons. Es scheint, dass der gleiche Wert wie Von eingegeben wird.
CallerCity=
CallerCountry=JP
CallerState=
CallerZip=
CallSid=CA86nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Ist es eine eindeutige ID für den Anruf?
CallStatus=ringing
Direction=inbound Ist es die Richtung des Anrufs?
ForwardedFrom=05031234567 Unbekannt. Wird es verwendet, wenn der Anruf innerhalb von Twilio weitergeleitet wird?
From=%2B819059876543 Die Telefonnummer des anrufenden Telefons. E..164 Format. Es scheint, dass der gleiche Wert wie Anrufer eingegeben wird.
FromCity=
FromCountry=JP
FromState=
FromZip=
To=%2B815031234567 Twilio-Telefonnummer des Empfängers. Es scheint, dass der gleiche Wert wie "Angerufen" eingegeben wird.
ToCity=
ToCountry=JP
ToState=
ToZip=

Hier gibt es vier wichtige Parameter: Anrufer / Von / Angerufen / An. Generieren Sie in API Server TwiML basierend auf diesen Informationen.

Die Schnellstart-App von Python scheint Caller als Quellinformationen und To als Empfängerinformationen zu verwenden. Daher sollte bei der Implementierung der TwiML-Rückgabe-API für eingehende Anrufe auch dieser Parameter verwendet werden.

https://github.com/TwilioDevEd/client-quickstart-python

Anruf vom Twilio-Client zum externen Telefon (OutgoingCall)

Verarbeitungsablauf

Schauen Sie sich zunächst die folgende Abbildung an. TwilioDiagrams_Fig2-3.png

Denken Sie auch an die URL, die Sie beim Einrichten Ihres Twilio-Kontos und beim Erstellen der TwiML-App eingerichtet haben. 2016-10-16_05h14_56.png

Der Verarbeitungsablauf ist wie folgt. ** Um TwiML zu erhalten, wird die in der TwiML-App festgelegte URL verwendet. ** **.

--3-1. Stellen Sie eine ausgehende Anfrage vom Twilio Client

TwiML, das vom API-Server zurückgegeben werden soll

Das von API Server in Nr. 3-3 zurückgegebene TwiML lautet wie folgt. Die anrufende Twilio-Telefonnummer lautet "050-3123-4567" und die anrufende Telefonnummer lautet "090-5987-6543".

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial timeout="60" callerId="+81-50-3123-4567">
    <Number>+81-90-5987-6543</Number>
  </Dial>
</Response>

Geben Sie im Element \ die anzurufende Telefonnummer an. Das callerId-Attribut des \ -Elements muss immer eine Twilio-Telefonnummer angeben. https://jp.twilio.com/docs/api/twiml/dial#examples-3

HTTP-POST-Anfrage von Twilio Server

In der offiziellen Dokumentation wurden keine detaillierten Informationen gefunden. Das Folgende ist eine Erklärung basierend auf den vom Paket erfassten Informationen. 2016-10-16_05h30_26.png

Schauen wir uns die Details der einzelnen Parameter an. Die folgenden Parameter werden hinzugefügt, wenn die Verbindung vom Twilio Client ausgeführt wird.

--callerPhoneNumber: Die mit Ihnen verknüpfte Telefonnummer des Anrufers. --callOutgoingPhoneNumber: Die tatsächlich anzurufende Telefonnummer.

Parameter Beschreibung (basierend auf Vermutungen)
AccountSid=AC3exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Die SID Ihres Twilio-Kontos.
ApiVersion=2010-04-01 Ist es die API-Version von Twilio?
ApplicationSid=AP75zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz Mit CapabilityToken verknüpfte TwiML-App-SID
Called=
Caller=client%3ADeviceId_0001 Client Name des Quell-Twilio-Clients.
CallSid=CA06nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn Ist es eine eindeutige ID für den Anruf?
CallStatus=ringing
Direction=inbound
From=client%3ADeviceId_0001 Client Name des Quell-Twilio-Clients. Es scheint, dass der gleiche Wert wie Anrufer eingegeben wird.
To=
callerPhoneNumber=%2B81-50-3123-4567 Benutzerdefinierte Parameter, die im Twilio-Client angegeben sind
callOutgoingPhoneNumber=%2B81-90-5987-6543 Benutzerdefinierte Parameter, die im Twilio-Client angegeben sind

Standardmäßig sind Anrufer und Von auf Clientname eingestellt. Bei Bedarf können Sie die erforderlichen Parameter in der Twilio Client-Implementierung angeben. Wie oben erwähnt, kann der API-Server einen beliebigen Wert in der Kommunikation zurückgeben, wenn der Twilio-Client das Fähigkeitstoken erwirbt, sodass Sie hier auch die erforderlichen Parameter zum Zeitpunkt der Verbindung übergeben können.

Schließlich

Das ist alles für den Kommunikationsfluss und die Datenstruktur. Von nun an werden wir endlich mit der Implementierung beginnen. Walkthrough zur Implementierung von AWS API Gateway + Lambda (Teil 1)

Recommended Posts

Verständnis aus dem Mechanismus Twilio # 2-Kommunikationsflussdatenstruktur
Verständnis aus dem Mechanismus Twilio # 1 - Einführung