Comment écrire une commande Slash avec Flask et Python 3 sur Ubuntu 16.04

introduction

Slack est une plateforme de communication pour les équipes. Slack propose de nombreux ajouts qui permettent aux équipes d'étendre Slack et de l'intégrer à d'autres programmes. Slackslash commands sont un moyen rapide et facile d'effectuer des actions dans la zone de saisie de message. Par exemple, la saisie de/who répertorie tous les utilisateurs du canal actuel. Vous pouvez trouver une liste complète des commandes slash intégrées àhttps://get.slack.help/hc/en-us/articles/201259356-Slash-commands.

Vous pouvez créer vos propres commandes slash utiles aux membres de votre espace de travail Slack. Lorsque vous installez la commande sur votre espace de travail et que vous l'invoquez, vous pouvez demander à Slack de demander à un programme que vous avez écrit. Ce programme reçoit les informations de Slack et renvoie une réponse, qui est affichée dans Slack. Vous pouvez en savoir plus sur les commandes Slack slash en lisant lesAPI documentation.

Dans ce didacticiel, vous allez créer une commande Slack slash appelée/slash, alimentée par une applicationFlask exécutée sur un serveur Ubuntu 16.04 et installer cette commande dans votre espace de travail Slack. Une fois que vous avez terminé, taper/slash dans la zone de saisie du message enverra des informations à l'application Flask qui traitera la demande et renverra un court message à Slack vous informant que cela a fonctionné.

Vous diffuserez cette application Flask à l'aide d'un serveur d'applicationsuWSGI et utiliserezNginx comme proxy inverse.

Conditions préalables

Pour compléter ce tutoriel, vous aurez besoin de:

[[step-1 -—- creation-and-installation-the-slack-app]] == Étape 1 - Création et installation de l'application Slack

Avant d'écrire notre code, nous allons d'abord créer unSlack app, qui fournit des fonctionnalités supplémentaires à Slack, et l'installer dans un espace de travail de développement Slack. Ensuite, nous définirons la commande et spécifierons l’URL que la commande doit demander lors de l’appel de la commande.

Pour créer une application Slack, visitezhttps://api.slack.com/apps et cliquez sur le bouton vertCreate New App. Dans le formulaire qui apparaît, entrez les détails suivants:

  • PourApp Name, entrezDigitalOcean Slack slash command.

  • PourDevelopment Slack Workspace, sélectionnez votre espace de travail de développement.

Cliquez ensuite sur le bouton vertCreate App.

Une fois l'application créée, cliquez surSlash Commands puis sur le boutonCreate New Command. Vous verrez la page suivante:

Page for creating new command.

Pour ce didacticiel, vous allez créer une commande appelée/slash, qui enverra des données via HTTP POST à ​​une URL de requête qui esthttp://server_domain_or_IP/slash. Pour cela, renseignez les informations suivantes:

  • Remplissez le champCommand avec/slash.

  • PourRequest URL, entrezhttp://your_server_ip_or_domain/slash.

  • PourShort Description, entrezDigitalOcean Slack slash command.

Puis sur le bouton vertSave pour terminer la création de la commande slash.

Installez maintenant l'application sur votre espace de travail en cliquant sur le lienInstall App. Appuyez sur le bouton vertInstall App to Workspace. Appuyez ensuite sur le bouton vertAuthorize.

Nous avons maintenant créé et installé une application Slack dans l’espace de travail de développement Slack., Mais la commande ne fonctionnera pas tant que nous n'aurons pas créé une application Web qui traite la commande slash. Avant de pouvoir créer l'application, nous devons configurer votre environnement Python.

[[step-2 -—- configuration-de-l'environnement-python]] == Étape 2 - Configuration de l'environnement Python

Après avoir terminé le didacticiel deHow To Serve Flask Applications with uWSGI and Nginx on Ubuntu 16.04, vous avez une application Flask située dans~/myproject/. Ce répertoire contient les fichiers et le répertoire suivants:

  • myproject.ini

  • myproject.py

  • wsgi.py

  • myprojectenv/

Nous allons modifier l'application Flask dansmyproject.py pour agir sur les données envoyées par la commande Slack slash et renvoyer une réponse JSON à Slack.

LeAPI documentation for commands indique que nous devons valider la commande slash à l'aide du jeton de vérification associé au commnd, fourni par Slack.

Ce jeton de vérification doit rester secret. Nous l'enregistrerons donc dans un nouveau fichier appelé.env file qui n'est pas conservé sous le contrôle de version. Nous utiliserons le packagepython-dotenv pour exporter les paires clé-valeur dans.env en tant que variables d'environnement, et nous accéderons à ces variables d'environnement dansmyproject.py.

Tout d’abord, activez l’environnement virtuel Python en lançant:

source myprojectenv/bin/activate

Pour confirmer que virtualenv est activé, vous devriez voir(myprojectenv) sur le côté gauche de l'invite Bash. Des secrets tels que le jeton de vérification ne doivent pas être stockés sous contrôle de version. Pour ce faire, nous utilisons le packagepython-dotenv qui exporte les secrets en tant que variables d'environnement. En utilisantpip, nous installons le packagepython-dotenv:

pip install python-dotenv

À l'aide de nano ou de votre éditeur de texte préféré, créez le fichier.env:

nano .env

Obtenez le jeton de vérification en visitanthttps://api.slack.com/apps. Cliquez sur l'appliDigitalOcean Slack slash command puis surBasic Information. Recherchez ensuiteVerification Token.

The verification token

Copiez la valeur du jeton et placez-la dans le fichier.env, en affectant la valeur à une variable d'environnement appeléeVERIFICATION_TOKEN:

~/myproject/.env

VERIFICATION_TOKEN=your_verification_token

Enregistrez le fichier et quittez l'éditeur.

Lorsque vous développez une application Flask, vous souhaiterez que le serveur uWSGI se recharge automatiquement lorsque vous apportez des modifications à l’application. Pour ce faire, ouvrez d'abordmyproject.ini dans votre éditeur:

nano myproject.ini

Ajoutez cette ligne à la fin du fichier pour vous assurer que uWSGI se recharge automatiquement lorsque voustouch ou modifiez l'application Flask dansmyproject.py

~/myproject/myproject.ini

...

touch-reload = myproject.py

Enregistrez le fichier et quittez l'éditeur.

Nous allons maintenant créer l’application Flask qui reçoit et traite les informations envoyées par la commande slash et renvoie une réponse appropriée à Slack.

[[step-3 -–- creating-the-flask-app]] == Étape 3 - Création de l'application Flask

Lorsque nous invoquons la commande/slash dans Slack, Slack fera une requête à notre serveur. Nous avons configuré la commande pour atteindre l'url/slash, nous allons donc modifier l'application Flask que nous avons créée pour répondre à ce point de terminaison.

Ouvrezmyproject.py dans votre éditeur:

nano myproject.py

Supprimer le contenu du fichier. Nous allons créer une nouvelle application à partir de zéro.

Ajoutez ce code qui importe Flask et charge des modules supplémentaires pour la gestion des données JSON et les requêtes Web:

~/myproject/myproject.py

#!/usr/bin/env python

from flask import Flask, jsonify, request

Ajoutez ensuite ce code qui charge le moduledotenv. lit le contenu du fichier.env que vous avez créé. charge son contenu dans des variables d'environnement, puis récupère le jeton de vérification de l'environnement, en le stockant dans la variableverification_token:

~/myproject/myproject.py

...
import os
import dotenv


dotenv_path = os.path.join(os.path.dirname(__file__), '.env')
dotenv.load_dotenv(dotenv_path)
verification_token = os.environ['VERIFICATION_TOKEN']

Ajoutez maintenant ce code pour configurer l’application Flask afin qu’elle réponde à la commande slack slash en envoyant une réponse textuelle indiquant que «La commande slash de DigitalOcean est réussie!»:

~/myproject/myproject.py

...

app = Flask(__name__)

@app.route('/slash', methods=['POST'])
def slash():
    if request.form['token'] == verification_token:
        payload = {'text': 'DigitalOcean Slack slash command is successful!'}
        return jsonify(payload)


if __name__ == '__main__':
    app.run()

Enregistrez le fichier et quittez l'éditeur.

Redémarrez le service systemd demyproject pour vous assurer que la dernière version de votre code est en cours d'exécution:

sudo systemctl restart myproject

Modifions maintenant la configuration de Nginx pour prendre en charge notre commande slash.

[[step-4 -–- configuring-nginx-to-serve-the-command]] == Étape 4 - Configuration de Nginx pour servir la commande

Puisque notre URL de demande esthttp://server_domain_or_IP/slash, nous devons changer la valeur delocation dans notre bloc de serveur Nginx de/ à/slash.

Ouvrez le fichier/etc/nginx/sites-available/myproject dans votre éditeur:

sudo nano /etc/nginx/sites-available/myproject

Modifiez la valeur delocation de/ à/slash:

/etc/nginx/sites-available/myproject

...

    location /slash {
        include uwsgi_params;
        uwsgi_pass unix:/home/sammy/myproject/myproject.sock;
    }
}

Enregistrez le fichier et quittez l'éditeur.

Ensuite, vérifiez les erreurs de syntaxe dans le fichier de configuration Nginx:

sudo nginx -t

S'il n'y a pas d'erreur de syntaxe avec le fichier de configuration Nginx, redémarrez le service Nginx:

sudo systemctl restart nginx

Accédez à votre espace de travail Slack de développement et saisissez/slash dans n'importe quel canal. Vous devriez voir la réponse suivante:

Slack slash command is successful!

Si vous recevez un message indiquant que la commande a échoué, vérifiez le code dansmyproject.py pour toute erreur ou problème de syntaxe. Puis réessaye.

Enfin, une fois que vous avez fini de développer votre commande, désactivez l’environnement virtuel Python afin que les futures commandes Python utilisent l’interpréteur Python du système:

deactivate

Vous venez de créer une application Flask qui reçoit les informations de la commande slash/slash et renvoie une réponse à Slack.

[.note] #Pour vous assurer que la communication entre votre serveur et Slack est sécurisée, cryptez la connexion pour la commande slash en utilisant HTTPS pour l'URL de la requête. Vous pouvez le faire parinstalling a free SSL certificate issued by Let’s Encrypt on the Nginx server. Lorsque vous avez terminé, assurez-vous de modifier l'URL de votre application Slack et de remplacerhttp:// parhttps://.
#

Conclusion

Dans ce didacticiel, vous avez implémenté une commande slack slash en configurant une application Flask servie par un serveur d'applications uWSGI et un serveur proxy inverse Nginx.

Maintenant que vous connaissez les bases de la création de commandes slash, vous pouvez implémenter toutes les commandes slash dont votre équipe a besoin. Vous pouvez créer des commandes permettant d'extraire des données de bases de données, interagir avec d'autres API ou même créer des commandes de déploiement de code.