
Création d'une application SMS vers Google Sheets avec AWS Lambda
Dans ce tutoriel, nous allons montrer comment vous pouvez capturer les Messages SMS envoyés à votre propre numéro Nexmo et enregistrer ceux-ci dans une feuille de calcul Google à l'aide d'un AWS Lambda écrit en Python. Cela peut être utilisé pour capturer les commentaires, l'inscription pour plus d'informations, l'enregistrement des votes, ou toute forme de collecte de données. Ce qui est génial, c'est que vous n'avez pas besoin de votre propre serveur dédié, juste d'un petit morceau de code hébergé sur AWS Lambda et d'un compte Nexmo.
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.
Nous couvrirons :
Si vous souhaitez vous lancer, vous pouvez toujours Obtenir le code!
Pourquoi Lambda ?
Les technologies sans serveur sont une tendance qui émerge rapidement. Étroitement liée au concept de microservices, l'idée est qu'au lieu de construire une application monolithique qui fait tout ce que votre entreprise veut, vous construisez un certain nombre de petites applications discrètes qui font chacune une seule fonction, puis les lient ensemble.
L'un des défis de la construction de ces microservices est que les frais généraux liés à l'exécution d'une pile de serveurs complète (OS, serveur Web, base de données, application, etc.) peuvent ajouter une grande quantité de travail et de coûts. C'est là que nous voyons une nouvelle tendance dans le cloud computing vers les technologies sans serveur, l'une des plus intéressantes d'entre elles est AWS Lambda d'Amazon. Vous pouvez désormais écrire une fonction simple en Python, Java ou Javascript et la faire invoquer par un appel API externe ou une autre partie d'AWS, comme un fichier téléchargé sur S3.
En plus d'éliminer la nécessité d'exploiter vos propres serveurs, vous pouvez également réduire les coûts ; vous n'êtes facturé que pour le temps d'exécution de votre code, par intervalles de 100 ms. Cela signifie que pour les fonctions simples qui traitent de petites quantités de données avec un trafic très irrégulier, cela peut s'avérer très abordable tout en ayant la capacité de gérer les pics de trafic. Ce modèle fait de Lambda une plateforme idéale pour construire une application de réception de SMS.
Enregistrer les SMS entrants avec AWS Lambda
Pour notre démo, nous allons écrire l'application en Python. Lambda vous permet d'utiliser les bibliothèques tierces que vous souhaitez dans le cadre de votre bundle d'application. Pour la première version, nous allons simplement recevoir un SMS envoyé à un numéro Numbers et enregistrer ce message dans les logs Lambda. La vidéo ci-dessous vous guidera dans la création de votre première application Lambda et dans sa configuration pour recevoir des \[webhooks](https://docs.nexmo.com/messaging/setup-callbacks) de l'API Nexmo. Vous aurez également besoin d'un \N[compte Nexmo](${CUSTOMER_DASHBOARD_URL}/sign-up?icid=tryitfree_api-developer-adp_nexmodashbdfreetrialsignup_nav) et vous devrez acheter un numéro pour cela.
Pour en savoir plus sur la façon de démarrer avec AWS Lambda, consultez leur guide de démarrage.
Voici un aperçu des points clés de la Video :
import json
print('Loading function')
def lambda_handler(event, context):
print("Received SMS: " + json.dumps(event, indent=2))
return "OK"Lambda est configuré pour appeler une fonction nommée lambda_handler et lui transmet un objet appelé event. Cet événement contient les paramètres que nous allons mapper sur la requête d'intégration de la passerelle API.
{
"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')"
}La fonction lambda_handler prend simplement les données de l'événement et les imprime dans le journal sous la forme d'un objet JSON, puis renvoie une chaîne de caractères OK qui passera par la passerelle API et sera renvoyée à Nexmo.
Configuration de Google Sheets
L'exemple ci-dessus est assez basique, tout ce que nous faisons est d'enregistrer le message dans les fichiers journaux Lambda, pour un exemple réel, nous devons faire quelque chose d'un peu plus utile.
Prenons l'exemple d'un événement pour lequel vous souhaitez que les participants puissent donner leur avis rapidement par SMS. Un excellent moyen de stocker et de partager ces informations est d'utiliser Google Sheets et heureusement pour nous, il existe une API qui nous permet d'écrire directement dans la feuille.
Dans la vidéo précédente, nous avons commencé dans la console des développeurs de Google (obtenez un Account ici) où vous devez créer un nouveau projet, activer l'API Drive pour ce projet, puis configurer une clé de compte de service. Ce type d'accès est conçu pour les applications de serveur à serveur. C'est ce que nous allons utiliser car l'application Lambda se connectera à Google Docs.
Une fois cette clé de compte de service créée, vous recevrez un ensemble d'informations d'identification téléchargées dans un fichier JSON. L'un des paramètres de ce fichier s'appelle client_emailqui se présente sous la forme d'une adresse électronique. Prenez note de cette adresse.
Connectez-vous à votre Google Drive et créez une nouvelle feuille de calcul appelée nexmosms. Vous devez la partager avec l'adresse liée à la clé du compte de service et donner des autorisations de modification. Lambda agit maintenant comme un autre utilisateur qui collabore avec vous sur le document.
Ajout de messages SMS à une feuille Google
Maintenant que nous travaillons avec des API externes, notre code Lambda doit être un peu plus complexe. Nous allons maintenant utiliser des bibliothèques tierces, ce qui signifie que nous ne pouvons plus nous contenter d'écrire notre code dans le navigateur. Au lieu de cela, nous devons créer un paquetage zippé de notre code et des bibliothèques supplémentaires que nous utilisons.
Nous n'avons pas besoin de vidéo pour ces étapes de codage. A la place, les étapes détaillées sont ci-dessous. Nous commencerons par un répertoire vide et nous y créerons un fichier appelé lambda_function.py
Nous pouvons installer les bibliothèques que nous allons utiliser dans notre bundle à partir de la ligne de commande en utilisant le gestionnaire de paquets pip. Nous devons les installer dans le dossier local plutôt que dans le chemin système habituel en utilisant l'option -t et nous pouvons spécifier le répertoire courant pwd entre parenthèses. Ainsi, pour ajouter la bibliothèque nexmo au paquetage, utilisez la commande :
Nous devrons répéter cette commande pour les autres bibliothèques que nous voulons utiliser :
Maintenant que nous disposons d'un dossier contenant nos bibliothèques, il nous suffit de les utiliser dans notre lambda_function.py dans notre fichier
Notre code de fonction lambda est maintenant un peu plus détaillé :
import json
import requests
from time import strftime as timestamp
from oauth2client.service_account import ServiceAccountCredentials
import gspread
import nexmo
from creds import *La première partie importe les bibliothèques dont nous avons besoin, mais vous remarquerez aussi qu'il y a des choses comme time que nous n'avons pas inclus dans notre bundle avec pip. Ceci est dû au fait que Lambda fournit tout ce qui est nécessaire à l'exécution de L'exécution standard de Python 2.7.
Ensuite, nous devons configurer l'accès à Google Sheets et mettre notre clé API Nexmo et notre secret API dans le fichier. Dans le code ci-dessous, remplacez les X par vos coordonnées dans l'exemple ci-dessous.
# 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"Le fichier d'informations d'identification que vous avez téléchargé lors de la configuration de la clé du compte de service Google doit être renommé en creds.json et être inclus dans le paquet.
Et ajouter une fonction appelée addrow à notre bundle qui nous permet d'ajouter une ligne à notre Google Sheet :
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])Deux valeurs sont transmises à cette fonction, sender le numéro de téléphone mobile (MSISDN) qui a envoyé le message et text qui est le corps du message. La fonction crée un objet gc pour représenter la connexion à Google Sheets, un objet sheet qui ouvrira un document dans ce compte appelé nexmosms et sélectionnera la feuille appelée Sheet1. Enfin, nous ajoutons une nouvelle ligne à cette feuille en ajoutant un timestamp comme première colonne, suivie de l'expéditeur et du texte du message.
Nous pouvons ensuite mettre à jour notre gestionnaire Lambda original pour utiliser notre nouvelle fonction :
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"Dans le code ci-dessus, nous imprimons toujours les données reçues dans le journal pour faciliter le débogage, mais nous invoquons également la fonction addrow que nous venons de créer.
Nous utilisons ensuite la bibliothèque officielle bibliothèque officielle Nexmo Python (que nous avons publiée juste à temps pour la PyCon 2016) pour renvoyer une réponse à l'auteur du message de la fonction Lambda. Nous créons une instance nexmo.Client et appelons client.send_message en définissant notre from numéro pour être le numéro de Numbers auquel l'utilisateur a envoyé le message. Le 'to' est le numéro de téléphone de l'utilisateur à partir duquel il a envoyé le message (MSISDN) et le corps du message text dit simplement Thanks for your feedback!. Enfin, nous renvoyons un "OK" à l'API Nexmo pour clôturer la demande.
C'est fait ! Vous pouvez désormais envoyer un SMS à un numéro enregistré chez Numbers, et faire en sorte que ce message texte soit envoyé à une fonction AWS Lambda via un webhook Nexmo. Lambda enregistrera le contenu du message dans une feuille Google et enverra une réponse.
La Video suivante montre le téléchargement du paquet et une démonstration du code en action :
Saisissez le code !
Vous pouvez télécharger un paquet de tout le code à partir de mon site GitHub. N'hésitez pas à me faire part de vos commentaires, je suis @sammachin sur Twitter.
