
Erstellen einer SMS-to-Google-Sheets-Applikation mit AWS Lambda
In diesem Tutorial zeigen wir, wie Sie SMS-Nachrichten, die an Ihre eigene Nexmo-Nummer gesendet werden, erfassen und mit einem in Python geschriebenen AWS Lambda in eine Google-Tabelle protokollieren können. Dies kann für die Erfassung von Feedback, die Registrierung für weitere Informationen, die Aufzeichnung von Abstimmungen oder jede andere Form der Datenerfassung verwendet werden. Das Tolle daran ist, dass Sie keinen eigenen dedizierten Server benötigen, sondern nur ein kleines Stück Code, das auf AWS Lambda gehostet wird, und einen Nexmo Account.
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.
Wir werden das Thema behandeln:
Wenn Sie einfach nur eintauchen wollen, können Sie jederzeit Schnappen Sie sich den Code!
Warum Lambda?
Serverlose Technologien sind ein schnell aufkommender Trend. Eng verwandt mit dem Konzept der Microservices ist die Idee, dass Sie statt einer monolithischen Anwendung, die alles tut, was Ihr Unternehmen will, eine Reihe von diskreten kleineren Anwendungen erstellen, die jeweils eine einzelne Funktion erfüllen und diese dann miteinander verbinden.
Eine Herausforderung bei der Entwicklung dieser Microservices besteht darin, dass der Overhead für den Betrieb eines kompletten Server-Stacks (Betriebssystem, Webserver, Datenbank, Anwendung usw.) eine große Menge an Arbeit und Kosten verursachen kann. Hier zeichnet sich ein neuer Trend im Cloud Computing hin zu serverlosen Technologien ab, von denen eine der interessantesten ist AWS Lambda von Amazon. Sie können jetzt eine einfache Funktion entweder in Python, Java oder Javascript schreiben und diese entweder durch einen externen API-Aufruf oder einen anderen Teil von AWS, wie z. B. eine in S3 hochgeladene Datei, aufrufen lassen.
Da Sie keine eigenen Server betreiben müssen, können Sie auch die Kosten niedrig halten: Sie zahlen nur für die Zeit, in der Ihr Code ausgeführt wird, und zwar in 100ms-Intervallen. Das bedeutet, dass es für einfache Funktionen, die kleine Datenmengen mit sehr stoßweisem Datenverkehr verarbeiten, recht erschwinglich sein kann und dennoch die Kapazität hat, Spitzen im Datenverkehr zu bewältigen. Dieses Modell macht Lambda zu einer idealen Plattform für die Entwicklung einer Anwendung zum Empfang von SMS-Nachrichten.
Protokollierung eingehender SMS mit AWS Lambda
Für unsere Demo werden wir die Anwendung in Python schreiben. Lambda ermöglicht es Ihnen, beliebige Bibliotheken von Drittanbietern als Teil Ihres Anwendungspakets zu verwenden. In der ersten Version werden wir einfach eine SMS empfangen, die an eine Nexmo-Nummer gesendet wird, und diese Nachricht in den Lambda-Protokollen protokollieren. Das folgende Video zeigt Ihnen, wie Sie Ihre erste Lambda-Anwendung erstellen und sie so einrichten, dass sie \[webhooks] (https://docs.nexmo.com/messaging/setup-callbacks) von der Nexmo API empfängt. Außerdem benötigen Sie einen Nexmo Account (${CUSTOMER_DASHBOARD_URL}/sign-up?icid=tryitfree_api-developer-adp_nexmodashbdfreetrialsignup_nav) und müssen dafür eine Nummer kaufen.
Weitere Informationen über die ersten Schritte mit AWS Lambda finden Sie im Leitfaden für den Einstieg.
Hier ein Überblick über die wichtigsten Punkte des Videos:
import json
print('Loading function')
def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
return "OK"Lambda ist so konfiguriert, dass es eine Funktion namens lambda_handler aufruft und ihr ein Objekt namens event übergibt. Dieses Ereignis enthält die Parameter, die wir über die API-Gateway-Integrationsanforderung zuordnen werden
{
"type" : "$input.params('type')",
"to" : "$input.params('to')",
"msisdn" : "$input.params('msisdn')",
"messageId" : "$input.params('messageId')",
"message-timestamp" : "$input.params('message-timestamp')",
"text" : "$input.params('text')"
}Die lambda_handler nimmt einfach die Ereignisdaten und druckt sie als JSON-Objekt in das Protokoll, dann gibt es einen OK String zurück, der durch das API-Gateway läuft und an Nexmo zurückgegeben wird.
Einrichten von Google Sheets
Das obige Beispiel ist ziemlich einfach, wir protokollieren lediglich die Nachricht in den Lambda-Protokolldateien, für ein reales Beispiel müssen wir etwas Nützlicheres tun.
Nehmen wir das Szenario einer Veranstaltung, bei der Sie den Teilnehmern die Möglichkeit geben wollen, schnell per SMS Feedback zu geben. Eine gute Möglichkeit, diese Informationen zu speichern und weiterzugeben, ist in Google Sheets und zum Glück für uns gibt es eine API die es uns ermöglicht, direkt in das Blatt zu schreiben.
Im vorigen Video begannen wir in der Google-Entwicklerkonsole (erstellen Sie ein Konto hier), wo Sie ein neues Projekt erstellen, die Drive API für dieses Projekt aktivieren und dann einen Service Account Key einrichten müssen. Diese Art des Zugriffs ist für Server-zu-Server-Anwendungen gedacht. Genau das werden wir verwenden, da die Lambda-Anwendung eine Verbindung zu Google Docs herstellen wird.
Sobald der Account-Schlüssel für den Dienst erstellt ist, erhalten Sie eine Reihe von Anmeldedaten, die in einer JSON-Datei heruntergeladen werden. Einer der Parameter in dieser Datei heißt client_emailgenannt, der in Form einer E-Mail-Adresse vorliegt. Notieren Sie sich diese Adresse.
Anmeldung bei Ihrem Google Drive und erstellen Sie ein neues Arbeitsblatt mit dem Namen nexmosms. Sie müssen es mit der Adresse freigeben, die mit dem Service Account Key verknüpft ist, und Bearbeitungsrechte erteilen. Jetzt verhält sich Lambda wie ein anderer Nutzer, der mit Ihnen an dem Dokument zusammenarbeitet.
Hinzufügen von SMS-Nachrichten zu einem Google Sheet
Da wir nun mit einigen externen APIs arbeiten, muss unser Lambda-Code etwas komplexer sein. Wir werden nun einige Bibliotheken von Drittanbietern verwenden, was bedeutet, dass wir unseren Code nicht mehr nur im Browser schreiben können. Stattdessen müssen wir ein gezipptes Bundle erstellen unseres Codes und der zusätzlichen Bibliotheken, die wir verwenden, erstellen.
Wir überspringen das Video für diese Kodierungsschritte. Stattdessen finden Sie die detaillierten Schritte unten. Wir beginnen mit einem leeren Verzeichnis und erstellen darin eine Datei namens lambda_function.py
Wir können die Bibliotheken, die wir in unserem Bundle verwenden werden, von der Kommandozeile aus mit dem Pip-Paketmanager installieren. Wir müssen sie in den lokalen Ordner installieren und nicht in den regulären Systempfad, indem wir das -t Flagge und können das aktuelle Verzeichnis pwd in Backticks angeben. Um also die nexmo Bibliothek zum Paket hinzuzufügen, verwenden Sie den Befehl:
Wir müssen diesen Befehl für die anderen Bibliotheken, die wir verwenden wollen, wiederholen:
Da wir nun einen Ordner mit unseren Bibliotheken haben, müssen wir sie nur noch in unserer lambda_function.py Datei verwenden:
Unser Lambda-Funktionscode ist nun etwas detaillierter:
import json
import requests
from time import strftime as timestamp
from oauth2client.service_account import ServiceAccountCredentials
import gspread
import nexmo
from creds import *Der erste Teil importiert die Bibliotheken, die wir benötigen, aber Sie werden auch bemerken, dass es einige Dinge gibt, wie time die wir nicht in unser Pip-Bundle aufgenommen haben. Das liegt daran, dass Lambda alles von Python 2.7 Standard-Laufzeit.
Als Nächstes müssen wir den Zugang zu Google Sheets einrichten und unseren Nexmo API-Schlüssel und das API-Geheimnis in die Datei eingeben. Ersetzen Sie im folgenden Code die X's durch Ihre Angaben im Beispiel unten.
# Setup access to Google sheets
scopes = ['https://spreadsheets.google.com/feeds']
credentials = ServiceAccountCredentials.from_json_keyfile_name('creds.json', scopes=scopes)
#Nexmo Credentials
nexmo_key = 'XXXXXX'
nexmo_secret = 'XXXXXX"Die Datei mit den Anmeldeinformationen, die Sie beim Einrichten des Google Service Account-Schlüssels heruntergeladen haben, sollte umbenannt werden in creds.json umbenannt und in das Paket aufgenommen werden.
Und fügen Sie eine Funktion namens addrow zu unserem Bundle hinzu, mit der wir eine Zeile zu unserem Google Sheet hinzufügen können:
def addrow(sender, text):
gc = gspread.authorize(credentials)
sheet = gc.open('nexmosms').worksheet("Sheet1")
sheet.append_row([timestamp('%Y-%m-%d %H:%M:%S'), sender, text])Dieser Funktion werden 2 Werte übergeben, sender die Mobilfunknummer (MSISDN), die die Nachricht gesendet hat, und text den Text der Nachricht. Die Funktion erstellt ein gc Objekt, das die Verbindung zu Google Sheets darstellt, ein sheet Objekt, das ein Dokument in diesem Account namens nexmosms und wählt das Blatt mit der Bezeichnung Sheet1. Schließlich fügen wir eine neue Zeile zu diesem Blatt hinzu, indem wir eine timestamp als erste Spalte hinzu, gefolgt vom Absender und dem Nachrichtentext.
Wir können dann unseren ursprünglichen Lambda-Handler aktualisieren, um unsere neue Funktion zu verwenden:
def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
addrow(event['msisdn'], event['text'])
client = nexmo.Client(key=nexmo_key, secret=nexmo_secret)
client.send_message({'from': event['to'], 'to': event['msisdn'], 'text': 'Thanks for your feedback!'})
return "OK"Im obigen Code geben wir die empfangenen Daten immer noch in das Protokoll ein, um die Fehlersuche zu erleichtern, aber wir rufen jetzt auch die addrow Funktion auf, die wir gerade erstellt haben.
Wir verwenden dann die offizielle Nexmo Python-Bibliothek (die wir veröffentlicht haben rechtzeitig zur PyCon 2016 veröffentlicht haben), um eine Antwort an den Absender der Nachricht von der Lambda-Funktion zurückzusenden. Wir erstellen eine nexmo.Client Instanz und rufen client.send_message und setzen unsere from Nummer auf die Nexmo-Nummer, an die der Nutzer die Nachricht geschickt hat. Das "to" ist die Telefonnummer des Benutzers, von der aus er die Nachricht gesendet hat (MSISDN) und der Text der Nachricht text sagt nur Thanks for your feedback!. Schließlich geben wir eine "OK" an die Nexmo-API zurück, um die Anfrage zu löschen.
Das war's! Sie können nun eine SMS an eine bei Nexmo registrierte Nummer senden und diese Textnachricht über einen Nexmo-Webhook an eine AWS-Lambda-Funktion senden lassen. Lambda wird den Inhalt der Nachricht in einem Google Sheet protokollieren und eine Antwort senden.
Das folgende Video zeigt das Hochladen des Pakets und eine Demonstration des Codes in Aktion:
Schnappen Sie sich den Code!
Sie können ein Bündel des gesamten Codes von meinem GitHub. Bitte lassen Sie mich wissen, was Sie denken, ich bin @sammachin auf Twitter.
