Python >> Tutoriel Python >  >> Python

Répondre aux SMS avec Python &Flask

Les messages texte SMS (Short Message Service) sont faciles à envoyer à partir d'applications Python avec une interface de programmation d'applications (API) Web. Les applications Flask peuvent également recevoir des messages texte entrants et répondre à l'expéditeur avec seulement quelques lignes de code Python.

Outils dont nous avons besoin

Ce didacticiel convient à la fois à Python 2 et à Python 3. Assurez-vous que l'une de ces deux versions est installée sur votre système.

  • Python 2 ou 3
  • pip et virtualenv pour gérer les dépendances des applications
  • Micro-structure Web Flask
  • Un compte Twilio gratuit pour utiliser leur API Web SMS
  • Bibliothèque d'assistance open source Twilio Python
  • Ngrok pour la tunnellisation de l'hôte local vers notre application Flask pendant son exécution sur notre environnement de développement local

Si vous avez besoin d'aide pour installer pip et virtualenv, consultez les premières étapes du guide de configuration de Python 3, Flask et Green Unicorn sur Ubuntu 16.04 LTS, qui montre comment installer les packages système pour ces outils.

Installation de nos dépendances

Notre code utilisera une bibliothèque d'assistance pour faciliter la réponse aux messages texte de Python. La dépendance de la bibliothèque d'assistance ainsi que la bibliothèque Flaskcode peuvent être installées à partir de PyPI dans un environnement virtuel. Dans votre terminal, utilisez la commande suivante pour générer un newvirtualenv.

virtualenv respondsms

Activez l'environnement virtuel.

source respondsms/bin/activate

L'invite de commande changera après avoir correctement activé le virtualenvto quelque chose comme ceci :

Installez Flask et la bibliothèque d'assistance Twilio Python dans le virtualenv avec le pip commande.

pip install flask twilio==5.7.0

Les dépendances sont installées afin que nous puissions l'utiliser avec notre code Python. Nous pouvons maintenant écrire notre application Python.

Construire notre application Web Flask

Notre application Flask aura deux itinéraires :un pour s'assurer que l'application Web est en cours d'exécution et un autre qui gère les requêtes HTTP POST entrantes. Créez un nouveau fichier nommé app.py dans votre répertoire personnel ou à l'endroit où vous choisissez de stocker vos fichiers de projet Python.

Dans app.py écrire le code suivant. Vous pouvez également voir ce code dans un GitHub Gistif plus facile à copier et coller.

from flask import Flask, Response, request
from twilio import twiml


app = Flask(__name__)


@app.route("/")
def check_app():
    # returns a simple string stating the app is working
    return Response("It works!"), 200


@app.route("/twilio", methods=["POST"])
def inbound_sms():
    response = twiml.Response()
    # we get the SMS message from the request. we could also get the 
    # "To" and the "From" phone number as well
    inbound_message = request.form.get("Body")
    # we can now use the incoming message text in our Python application
    if inbound_message == "Hello":
        response.message("Hello back to you!")
    else:
        response.message("Hi! Not quite sure what you meant, but okay.")
    # we return back the mimetype because Twilio needs an XML response
    return Response(str(response), mimetype="application/xml"), 200


if __name__ == "__main__":
    app.run(debug=True)

Les commentaires en ligne sur les lignes commençant par # expliquez ce que font les lignes en dessous. Les applications Flask définissent les routes d'URL avec le @app.route décorateur. Notre application a besoin de deux routes donc nous avons défini deux de ces décorateurs.

Essayez l'application en l'exécutant avec python app.py . Si vous rencontrez des problèmes lors de l'exécution du programme, assurez-vous que votre environnement virtuel est toujours actif afin que l'application puisse utiliser les bibliothèques de code Flask et Twilio que nous avons installées précédemment.

Ouvrez un navigateur Web et accédez à localhost:5000 (ou 127.0.0.1:5000). Nous devrions voir "Ça marche !" à l'écran.

Il y a un problème avec notre application qui s'exécute sur notre environnement de développement local :il n'y a aucun moyen pour notre serveur de recevoir des requêtes HTTP POST à ​​moins que nous n'utilisions un tunnel localhost.

Tunneling Localhost avec Ngrok

Ngrok fournit un tunnel localhost afin que les services extérieurs puissent se connecter à un serveur exécuté dans votre environnement de développement local. Téléchargez et installez Ngrok.

Nous pouvons maintenant exécuter Ngrok localement et connecter notre application Flask exécutée sur le port 5000. Dans le répertoire où vous avez extrait Ngrok, exécutez cette commande.

./ngrok http 5000

Génial, nous pouvons maintenant utiliser cette URL de transfert Ngrok pour accéder à notre application à partir de n'importe quelle machine disposant d'une connexion Internet. Remplacez l'URL dans le navigateur Web par votre propre URL de transfert, comme je l'ai fait dans cette capture d'écran.

Nous avons juste besoin d'un numéro de téléphone qui atteindra notre application avec une requête POST pour répondre aux messages texte.

Obtenir notre numéro de téléphone

Nous pouvons utiliser la route de notre application Flask pour répondre aux demandes d'API Web entrantes basées sur les messages SMS entrants vers un numéro de téléphone Twilio. Accédez au site Web de Twilio et créez un compte d'essai gratuit pour utiliser leur API. Si vous avez déjà un compte Twilio, connectez-vous à votre compte existant.

Le compte d'essai Twilio vous permet d'envoyer et de recevoir des SMS vers votre propre numéro de téléphone validé. Pour envoyer et répondre à des SMS vers et depuis n'importe quel numéro de téléphone, vous devez mettre à niveau votre compte. Les comptes d'essai sont parfaits pour le développement initial avant la mise en ligne de votre application.

Lorsque vous vous inscrivez, vous recevez un numéro de téléphone Twilio gratuit. Nous pouvons configurer ce numéro de téléphone pour transmettre les informations SMS à notre application Web en configurant le webhook de réponse.

Accédez à l'écran de gestion des numéros de téléphone et cliquez sur le numéro de téléphone que vous souhaitez configurer pour répondre aux SMS entrants.

Faites défiler vers le bas de la page et recherchez l'en-tête "Messagerie". Modifiez la zone de texte "Un message arrive" afin qu'elle contienne votre URL de transfert ngrok plus l'itinéraire "/ twilio", comme indiqué dans cette capture d'écran.

Appuyez maintenant sur le bouton rouge "Enregistrer" en bas pour que nos modifications prennent effet.

Notre application est prête à fonctionner - il est temps d'essayer notre numéro de téléphone ! Envoyez "Bonjour" ou le texte de votre choix à votre numéro de téléphone. Voici à quoi ressemble le résultat sur mon iPhone.

Cette simple application Flask est un bon début pour créer des réponses plus compliquées telles que l'ajout d'un traitement du langage naturel, la création d'un bot SMS Slack ou le codage de NES Game Genies alimentés par SMS.

Quelle est la prochaine ?

Super, maintenant notre application Web Flask répond automatiquement aux SMS entrants ! C'est assez fou de penser que des entreprises entières telles que SuperPhone et Remind sont construites à partir d'un code qui a commencé très similaire au code que nous venons d'écrire.

Des questions? Contactez-moi via Twitter@fullstackpythonor @mattmakai. Je suis également sur GitHub avec le nom d'utilisateur mattmakai.

Vous voyez quelque chose qui ne va pas dans ce message ? La source de cette page sur GitHuband soumet une pull request.