Comment construire un slackbot en Python sur Ubuntu 20.04

L'auteur a choisi le Tech Education Fund comme récipiendaire d'un don dans le cadre du programme Write for DOnations.

Introduction

Slack est une plate-forme de communication conçue pour la productivité sur le lieu de travail. Elle comprend des fonctionnalités telles que la messagerie directe, des chaînes publiques et privées, des appels vocaux et vidéo, et l'intégration de bots. Un Slackbot est un programme automatisé qui peut remplir diverses fonctions en Slack, de l'envoi de messages au déclenchement de tâches en passant par l'alerte sur certains événements.

Dans ce tutoriel, vous allez construire un Slackbot en langage de programmation Python. Python est un langage populaire qui peut s'enorgueillir d'une grande simplicité et lisibilité. Slack fournit une riche API Python Slack qui s'intègre à Slack pour effectuer des tâches courantes telles que l'envoi de messages, l'ajout d'emojis aux messages, et bien plus encore. Slack fournit également une API Python Slack Events pour l'intégration des événements dans Slack, vous permettant d'effectuer des actions sur des événements tels que des messages et des mentions.

Pour une démonstration amusante de la puissance de Python et de ses API Slack, vous construirez un CoinBot – un Slackbot qui surveille un canal et qui, une fois déclenché, tirera à pile ou face pour vous. Vous pouvez ensuite modifier votre CoinBot pour répondre à un certain nombre d'applications un peu plus pratiques.

Notez que ce tutoriel utilise Python 3 et n'est pas compatible avec Python 2.

Conditions préalables

Pour suivre ce guide, vous aurez besoin :

  • Un espace de travail Slack dans lequel vous avez la possibilité d'installer des applications. Si vous avez créé l'espace de travail, vous avez cette capacité. Si vous n'en avez pas déjà un, vous pouvez en créer un sur le site web de Slack.

  • (Facultatif) Un serveur ou un ordinateur doté d'une adresse IP publique pour le développement. Nous recommandons une nouvelle installation d'Ubuntu 20.04, un utilisateur non root avec des privilèges sudo, et SSH activé. Vous pouvez suivre ce guide pour initialiser votre serveur et effectuer ces étapes.

Vous voudrez peut-être tester ce tutoriel sur un serveur qui a une adresse IP publique. Slack devra être capable d'envoyer des événements tels que des messages à votre bot. Si vous effectuez des tests sur une machine locale, vous devrez faire transiter le trafic par votre pare-feu vers votre système local. Si vous cherchez un moyen de développer sur un serveur cloud, consultez ce tutoriel Comment utiliser le code Visual Studio pour le développement à distance via le plugin Remote-SSH.

Étape 1 – Création du slackbot dans l'interface utilisateur de Slack

Créez d'abord votre application Slack dans le panneau de contrôle de l'API Slack. Connectez-vous à votre espace de travail dans Slack via un navigateur web et naviguez jusqu'au panneau de contrôle de l'API. Cliquez maintenant sur le bouton Create an App (Créer une application).

Créez votre application Slack

Ensuite, vous serez invité à indiquer le nom de votre application et à sélectionner un espace de travail Slack de développement. Pour ce tutoriel, nommez votre application CoinBot et sélectionnez un espace de travail auquel vous avez accès en tant qu'administrateur. Une fois que vous avez fait cela, cliquez sur le bouton Create App (Créer une application).

Nommez votre application Slack et sélectionnez un espace de travail

Une fois que votre application est créée, le tableau de bord par défaut suivant vous sera présenté. Ce tableau de bord vous permet de gérer votre application en définissant les autorisations, en vous inscrivant à des événements, en installant l'application dans les espaces de travail, etc.

Tableau de bord par défaut de l'application Slack

Pour que votre app puisse envoyer des messages sur un canal, vous devez lui attribuer des autorisations d'envoi de messages. Pour ce faire, cliquez sur le bouton Permissions dans le panneau de contrôle.

Sélectionnez le bouton Permissions dans le panneau de contrôle

Lorsque vous arrivez à la page OAuth & Permissions, faites défiler vers le bas jusqu'à ce que vous trouviez la section Scopes (Champs) de la page. Ensuite, trouvez la sous-section Bot Token Scopes dans le champ et cliquez sur le bouton Add an OAuth Scope.

Sélectionnez le bouton Add an OAuth Scope (Ajouter un champ d'application OAuth)

Cliquez sur ce bouton et tapez ensuite chat:write. Sélectionnez cette autorisation pour l'ajouter à votre bot. Cela permettra à l'application de poster des messages sur les canaux auxquels elle peut accéder. Pour plus d'informations sur les autorisations disponibles, consultez la documentation de Slack.

Ajoutez la permission chat:write

Maintenant que vous avez ajouté la permission appropriée, il est temps d'installer votre application dans votre espace de travail Slack. Faites défiler la page OAuth & Permissions vers le haut et cliquez sur le bouton Install App to Workspace (Installer l'application dans l'espace de travail) en haut.

Installez l'application sur l'espace de travail

Cliquez sur ce bouton et passez en revue les actions que l'app peut effectuer dans le canal. Une fois que vous êtes satisfait, cliquez sur le bouton Allow (Autoriser) pour terminer l'installation.

Installez l'application sur l'espace de travail

Une fois le bot installé, un jeton d'accès OAuth pour l'utilisateur du bot vous sera présenté afin que vous puissiez utiliser votre application pour effectuer des actions dans l'espace de travail. Poursuivez et copiez ce jeton ; vous en aurez besoin plus tard.

Sauvegardez le jeton d'accès

Enfin, ajoutez votre bot nouvellement installé dans un canal de votre espace de travail. Si vous n'avez pas encore créé de canal, vous pouvez utiliser le canal #general qui est créé par défaut dans votre espace de travail Slack. Localisez l'application dans la section Apps de la barre de navigation de votre client Slack et cliquez dessus. Une fois que vous avez fait cela, ouvrez le menu Details (Détails) en haut à droite. Si votre client Slack n'est pas en plein écran, cela ressemblera à un i dans un cercle.

Cliquez sur l'icône Détails de l'application

Pour terminer l'ajout de votre app à un canal, cliquez sur le bouton Plus représenté par trois points dans la page de détails et sélectionnez Add this app to a channel… (Ajouter cette app à un canal…) Tapez votre canal dans le modal qui apparaît et cliquez sur Add (Ajouter).

Ajoutez une application à un canal

Vous avez maintenant réussi à créer votre application et à l'ajouter à un canal dans votre espace de travail Slack. Une fois que vous aurez écrit le code de votre application, celle-ci sera en mesure d'afficher des messages sur ce canal. Dans la section suivante, vous commencerez à écrire le code Python qui fera fonctionner CoinBot.

Étape 2 – Configuration de votre environnement de développement Python

Commençons par configurer votre environnement Python pour que vous puissiez développer le Slackbot.

Ouvrez un terminal et installez Python3 et les outils pertinents sur votre système :

  • sudo apt install python3 python3-venv

Ensuite, vous allez créer un environnement virtuel pour isoler vos paquets Python de l'installation système de Python. Pour ce faire, créez d'abord un répertoire dans lequel vous créerez votre environnement virtuel. Créez un nouveau répertoire à ~/.venvs :

  • mkdir ~/.venvs

Créez maintenant votre environnement virtuel Python :

  • python3 -m venv ~/.venvs/slackbot

Ensuite, activez votre environnement virtuel afin de pouvoir utiliser son installation Python et installer des paquets :

  • source ~/.venvs/slackbot/bin/activate

L'invite de commande de votre shell affichera désormais l'environnement virtuel entre parenthèses. Elle ressemblera à cela :

Utilisez maintenant pip pour installer les paquets Python nécessaires dans votre environnement virtuel :

  • pip install slackclient slackeventsapi Flask

slackclient et slackeventsapi facilitent l'interaction de Python avec les API de Slack. Flask est un micro-cadre web populaire que vous utiliserez pour déployer votre application :

Maintenant que vous avez mis en place votre environnement de développement, vous pouvez commencer à écrire votre Slackbot Python :

Étape 3 – Création de la classe de message Slackbot en Python

Dans Slack, les messages sont envoyés via une charge utile JSON spécifiquement formatée. Voici un exemple de JSON que votre Slackbot va élaborer et envoyer comme message :

{    "channel":"channel",    "blocks":[       {          "type":"section",          "text":{             "type":"mrkdwn",             "text":"Sure! Flipping a coin....nn"          }       },       {          "type":"section",          "text":{             "type":"mrkdwn",             "text":"*flips coin* The result is Tails."          }       }    ] } 

Vous pourriez fabriquer manuellement ce JSON et l'envoyer, mais à la place, construisons une classe Python qui non seulement fabrique cette charge utile, mais simule aussi un tirage au sort.

Utilisez d'abord la commande touch pour créer un fichier nommé coinbot.py :

  • touch coinbot.py

Ensuite, ouvrez le fichier avec nano ou votre éditeur de texte favori :

  • nano coinbot.py

Ajoutez maintenant les lignes de code suivantes pour importer les bibliothèques pertinentes pour votre application. La seule bibliothèque dont vous avez besoin pour cette classe est la bibliothèque aléatoire de la Python Standard Library. Cette bibliothèque nous permettra de simuler un tirage au sort.

Ajoutez les lignes suivantes à coinbot.py pour importer toutes les bibliothèques nécessaires :

coinbot.py

# import the random library to help us generate the random numbers import random 

Ensuite, créez votre classe CoinBot et une instance de cette classe pour élaborer la charge utile du message. Ajoutez les lignes suivantes au site coinbot.py pour créer la classe CoinBot :

coinbot.py

... class CoinBot: 

Maintenant, faites un retrait d'une unité et créez les constantes, les constructeurs et les méthodes nécessaires à votre classe. Commençons par créer la constante qui constituera la base de la charge utile de votre message. Cette section précise que cette constante est du type section et que le texte est formaté via la démarque. Il précise également le texte que vous souhaitez afficher. Vous pouvez en savoir plus sur les différentes options de charge utile dans la documentation officielle de Slack à propos de la charge utile des messages.

Ajoutez les lignes suivantes à coinbot.py pour créer le modèle de base de la charge utile :

coinbot.py

...     # Create a constant that contains the default text for the message     COIN_BLOCK = {         "type": "section",         "text": {             "type": "mrkdwn",             "text": (                 "Sure! Flipping a coin....nn"             ),         },     } 

Ensuite, créez un constructeur pour votre classe afin de pouvoir créer une instance distincte de votre bot pour chaque requête. Ne vous préoccupez pas de la mémoire ici ; le ramasseur d'ordures Python nettoiera ces instances une fois qu'elles ne seront plus nécessaires. Ce code définit le canal destinataire en fonction d'un paramètre transmis au constructeur.

Ajoutez les lignes suivantes à coinbot.py pour créer le constructeur :

coinbot.py

...     # The constructor for the class. It takes the channel name as the a     # parameter and sets it as an instance variable.     def __init__(self, channel):         self.channel = channel 

Maintenant, écrivez le code qui simule le tirage à pile ou face. Nous allons générer aléatoirement un un ou un zéro, représentant respectivement pile ou face.

Ajoutez les lignes suivantes au site coinbot.py pour simuler le tirage au sort et renvoyer la charge utile fabriquée :

coinbot.py

...     # Generate a random number to simulate flipping a coin. Then return the     # crafted slack payload with the coin flip message.     def _flip_coin(self):         rand_int =  random.randint(0,1)         if rand_int == 0:             results = "Heads"         else:             results = "Tails"          text = f"The result is {results}"          return {"type": "section", "text": {"type": "mrkdwn", "text": text}}, 

Enfin, créez une méthode qui fabrique et renvoie la totalité de la charge utile du message, y compris les données de votre constructeur, en appelant votre méthode _flip_coin.

Ajoutez les lignes suivantes au site coinbot.py pour créer la méthode qui générera la charge utile finie :

coinbot.py

...     # Craft and return the entire message payload as a dictionary.     def get_message_payload(self):         return {             "channel": self.channel,             "blocks": [                 self.COIN_BLOCK,                 *self._flip_coin(),             ],         } 

Vous avez maintenant terminé la classe CoinBot et elle est prête à être testée. Avant de continuer, vérifiez que votre fichier fini, coinbot.py, contient les éléments suivants :

coinbot.py

# import the random library to help us generate the random numbers import random  # Create the CoinBot Class class CoinBot:      # Create a constant that contains the default text for the message     COIN_BLOCK = {         "type": "section",         "text": {             "type": "mrkdwn",             "text": (                 "Sure! Flipping a coin....nn"             ),         },     }      # The constructor for the class. It takes the channel name as the a     # parameter and then sets it as an instance variable     def __init__(self, channel):         self.channel = channel      # Generate a random number to simulate flipping a coin. Then return the     # crafted slack payload with the coin flip message.     def _flip_coin(self):         rand_int =  random.randint(0,1)         if rand_int == 0:             results = "Heads"         else:             results = "Tails"          text = f"The result is {results}"          return {"type": "section", "text": {"type": "mrkdwn", "text": text}},      # Craft and return the entire message payload as a dictionary.     def get_message_payload(self):         return {             "channel": self.channel,             "blocks": [                 self.COIN_BLOCK,                 *self._flip_coin(),             ],         } 

Enregistrez et fermez le fichier.

Maintenant que vous avez une classe Python prête à faire le travail pour votre Slackbot, faisons en sorte que cette classe produise une charge utile de messages et que vous puissiez l'envoyer à votre espace de travail.

Étape 4 – Test de votre message

Maintenant, vérifions que cette classe produit une charge utile adéquate. Créez un fichier nommé coinbot_test.py :

  • nano coinbot_test.py

Maintenant ajoutez le code suivant : Assurez-vous de changer le nom du canal dans l'instanciation de la classe coinbot coin_bot = coinbot("#YOUR_CHANNEL_HERE"). Ce code créera un client Slack en Python qui enverra un message au canal que vous aurez spécifié et dans lequel vous aurez déjà installé l'application :

coinbot_test.py

from slack import WebClient from coinbot import CoinBot import os  # Create a slack client slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))  # Get a new CoinBot coin_bot = CoinBot("#YOUR_CHANNEL_HERE")  # Get the onboarding message payload message = coin_bot.get_message_payload()  # Post the onboarding message in Slack slack_web_client.chat_postMessage(**message) 

Enregistrez et fermez le fichier.

Avant de pouvoir exécuter ce fichier, vous devrez exporter le jeton Slack que vous avez enregistré à l'étape 1 en tant que variable d'environnement :

  • export SLACK_TOKEN="your_bot_user_token"

Maintenant, testez ce fichier et vérifiez que la charge utile est produite et envoyée en exécutant le script suivant dans votre terminal. Assurez-vous que votre environnement virtuel est activé. Vous pouvez vérifier cela en voyant le texte (slackbot) au début de l'invite de votre bash. Exécutez cette commande, vous recevrez un message de votre Slackbot avec les résultats d'un tirage au sort :

  • python coinbot_test.py

Vérifiez le canal dans lequel vous avez installé votre application et vérifiez que votre bot a bien envoyé le message de tirage au sort. Votre résultat sera pile ou face.

Test de tirage au sort

Maintenant que vous avez vérifié que votre Slackbot peut tirer à pile ou face, créer un message et le diffuser, créons un Flask pour faire fonctionner cette app en permanence et faisons en sorte qu'elle simule un tirage à pile ou face et partage les résultats chaque fois qu'elle voit un certain texte dans les messages envoyés dans le canal.

Étape 5 – Création d'une application Flask pour exécuter votre slackbot

Maintenant que vous avez une application fonctionnelle qui peut envoyer des messages à votre espace de travail Slack, vous devez créer un processus de longue durée pour que votre bot puisse écouter les messages envoyés dans le canal et y répondre si le texte répond à certains critères. Vous allez utiliser le Flask, le framework web de Python, pour exécuter ce processus et écouter les événements de votre canal.

Dans cette section, vous allez exécuter votre application Flask à partir d'un serveur doté d'une adresse IP publique afin que l'API Slack puisse vous envoyer des événements. Si vous l'exécutez localement sur votre poste de travail personnel, vous devrez transférer le port de votre pare-feu personnel vers le port qui sera exécuté sur votre poste de travail. Ces ports peuvent être les mêmes, et ce tutoriel sera configuré pour utiliser le port 3000.

Réglez d'abord les paramètres de votre pare-feu pour autoriser le trafic par le port 3000 :

  • sudo ufw allow 3000

Vérifiez maintenant le statut de ufw :

  • sudo ufw status

Vous verrez un résultat similaire à ce qui suit :

OutputStatus: active  To                         Action      From --                         ------      ---- OpenSSH                    ALLOW       Anywhere 3000                       ALLOW       Anywhere OpenSSH (v6)               ALLOW       Anywhere (v6) 3000 (v6)                  ALLOW       Anywhere (v6) 

Créez maintenant le fichier pour votre application Flask. Nommez ce fichier app.py :

  • touch app.py

Ensuite, ouvrez ce fichier dans votre éditeur de texte préféré :

  • nano app.py

Ajoutez maintenant les déclarations d'importation suivantes. Vous importerez les bibliothèques ci-après pour les raisons suivantes :

  • import os – Pour accéder aux variables d'environnement
  • import logging – Pour enregistrer les événements de l'application
  • from flask import Flask – Pour créer une application Flask
  • from slack import WebClient – Pour envoyer des messages via Slack
  • from slackeventsapi import SlackEventAdapter – Pour recevoir les événements de Slack et les traiter
  • from coinbot import CoinBot – Pour créer une instance de votre CoinBot et générer la charge utile du message.

Ajoutez les lignes suivantes à app.py pour importer toutes les bibliothèques nécessaires :

app.py

import os import logging from flask import Flask from slack import WebClient from slackeventsapi import SlackEventAdapter from coinbot import CoinBot 

Créez maintenant votre application Flask et enregistrez un adaptateur Slack Event dans votre application Slack sur le point de terminaison /slack/events. Cela créera un itinéraire dans votre app Slack où les événements Slack seront envoyés et ingérés. Pour ce faire, vous devrez obtenir un autre jeton de votre application Slack, ce que vous ferez plus tard dans le tutoriel. Une fois que vous aurez obtenu cette variable, vous l'exporterez en tant que variable d'environnement nommée SLACK_EVENTS_TOKEN. Procédez et écrivez votre code pour le lire lors de la création du SlackEventAdapter, même si vous n'avez pas encore défini le jeton.

Ajoutez les lignes suivantes à app.py pour créer l'application Flask et enregistrez l'adaptateur d'événements dans cette application :

app.py

... # Initialize a Flask app to host the events adapter app = Flask(__name__)  # Create an events adapter and register it to an endpoint in the slack app for event ingestion. slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app) 

Ensuite, créez un objet client web qui permettra à votre application d'effectuer des actions dans l'espace de travail, notamment pour envoyer des messages. Le processus est similaire à ce que vous avez fait lorsque vous avez testé votre fichier coinbot.py précédemment.

Ajoutez la ligne suivante à app.py pour créer ce slack_web_client :

app.py

... # Initialize a Web API client slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN")) 

Créez maintenant une fonction qui peut être appelée et qui créera une instance de CoinBot, puis utilisez cette instance pour créer une charge utile de message et transmettre cette charge utile au client web Slack pour livraison. Cette fonction ne prendra en compte qu'un seul paramètre, channel, qui spécifiera quel canal reçoit le message.

Ajoutez la ligne suivante à app.py pour créer cette fonction :

app.py

... def flip_coin(channel):     """Craft the CoinBot, flip the coin and send the message to the channel     """     # Create a new CoinBot     coin_bot = CoinBot(channel)      # Get the onboarding message payload     message = coin_bot.get_message_payload()      # Post the onboarding message in Slack     slack_web_client.chat_postMessage(**message) 

Maintenant que vous avez créé une fonction pour gérer les aspects de messagerie de votre application, créez-en une qui surveille les événements Slack pour une certaine action et qui exécute ensuite votre bot. Vous allez configurer votre application pour qu'elle réponde avec les résultats d'une simulation de pile ou face lorsqu'elle voit la phrase “Hey Sammy, Flip a coin”. Vous allez accepter que n'importe quelle version de ce cas n'empêche pas l'app de répondre.

Décorez d'abord votre fonction avec la syntaxe @slack_events_adapter.on qui permet à votre fonction de recevoir des événements. Précisez que vous voulez uniquement les événements du message et que votre fonction doit accepter un paramètre de charge utile contenant toutes les informations Slack nécessaires. Une fois que vous aurez cette charge utile, vous analyserez le texte. Ensuite, si elle reçoit la phrase d'activation, votre application enverra les résultats d'un tirage au sort simulé.

Ajoutez le code suivant à app.py pour recevoir, analyser et agir sur les messages entrants :

app.py

# When a 'message' event is detected by the events adapter, forward that payload # to this function. @slack_events_adapter.on("message") def message(payload):     """Parse the message event, and if the activation string is in the text,     simulate a coin flip and send the result.     """      # Get the event data from the payload     event = payload.get("event", {})      # Get the text from the event that came through     text = event.get("text")      # Check and see if the activation phrase was in the text of the message.     # If so, execute the code to flip a coin.     if "hey sammy, flip a coin" in text.lower():         # Since the activation phrase was met, get the channel ID that the event         # was executed on         channel_id = event.get("channel")          # Execute the flip_coin function and send the results of         # flipping a coin to the channel         return flip_coin(channel_id) 

Enfin, créez une section main qui créera un logger afin que vous puissiez voir les éléments internes de votre application ainsi que lancer l'application sur votre adresse IP externe sur le port 3000. Afin d'ingérer les événements de Slack, comme par exemple lorsqu'un nouveau message est envoyé, vous devez tester votre application sur une adresse IP publique.

Ajoutez les lignes suivantes à app.py pour mettre en place votre section main :

app.py

if __name__ == "__main__":     # Create the logging object     logger = logging.getLogger()      # Set the log level to DEBUG. This will increase verbosity of logging messages     logger.setLevel(logging.DEBUG)      # Add the StreamHandler as a logging handler     logger.addHandler(logging.StreamHandler())      # Run your app on your externally facing IP address on port 3000 instead of     # running it on localhost, which is traditional for development.     app.run(host='0.0.0.0', port=3000) 

Vous avez maintenant terminé l'application Flask et elle est prête à être testée. Avant de continuer, vérifiez que votre fichier terminé, app.py contient ce qui suit :

app.py

import os import logging from flask import Flask from slack import WebClient from slackeventsapi import SlackEventAdapter from coinbot import CoinBot  # Initialize a Flask app to host the events adapter app = Flask(__name__) # Create an events adapter and register it to an endpoint in the slack app for event injestion. slack_events_adapter = SlackEventAdapter(os.environ.get("SLACK_EVENTS_TOKEN"), "/slack/events", app)  # Initialize a Web API client slack_web_client = WebClient(token=os.environ.get("SLACK_TOKEN"))  def flip_coin(channel):     """Craft the CoinBot, flip the coin and send the message to the channel     """     # Create a new CoinBot     coin_bot = CoinBot(channel)      # Get the onboarding message payload     message = coin_bot.get_message_payload()      # Post the onboarding message in Slack     slack_web_client.chat_postMessage(**message)   # When a 'message' event is detected by the events adapter, forward that payload # to this function. @slack_events_adapter.on("message") def message(payload):     """Parse the message event, and if the activation string is in the text,     simulate a coin flip and send the result.     """      # Get the event data from the payload     event = payload.get("event", {})      # Get the text from the event that came through     text = event.get("text")      # Check and see if the activation phrase was in the text of the message.     # If so, execute the code to flip a coin.     if "hey sammy, flip a coin" in text.lower():         # Since the activation phrase was met, get the channel ID that the event         # was executed on         channel_id = event.get("channel")          # Execute the flip_coin function and send the results of         # flipping a coin to the channel         return flip_coin(channel_id)  if __name__ == "__main__":     # Create the logging object     logger = logging.getLogger()      # Set the log level to DEBUG. This will increase verbosity of logging messages     logger.setLevel(logging.DEBUG)      # Add the StreamHandler as a logging handler     logger.addHandler(logging.StreamHandler())      # Run our app on our externally facing IP address on port 3000 instead of     # running it on localhost, which is traditional for development.     app.run(host='0.0.0.0', port=3000) 

Enregistrez et fermez le fichier.

Maintenant que votre application Flask est prête à servir votre application, testons-la.

Étape 6 – Exécution de votre application Flask

Enfin, assemblez tout et exécutez votre application.

Premièrement, ajoutez votre application en cours d'exécution en tant que gestionnaire autorisé de votre Slackbot.

Accédez à la section Basic Information (Informations de base) de votre application dans le Slack UI. Faites défiler la page vers le bas jusqu'à ce que vous trouviez la section App Credentials (Identifiants d'application).

Signature Secrète Slack

Copiez la signature secrète et exportez-la en tant que variable d'environnement SLACK_EVENTS_TOKEN :

  • export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"

Vous disposez ainsi de tous les jetons d'API nécessaires pour exécuter votre application. Reportez-vous à l'étape 1 si vous avez besoin d'un rafraîchissement sur la façon d'exporter votre SLACK_TOKEN. Vous pouvez maintenant lancer votre application et vérifier qu'elle fonctionne bien. Assurez-vous que votre environnement virtuel est activé et exécutez la commande suivante pour lancer votre application Flask :

  • python3 app.py

Vous verrez un résultat similaire à ce qui suit :

(slackbot) [20:04:03] sammy:coinbot$ python app.py  * Serving Flask app "app" (lazy loading)  * Environment: production    WARNING: This is a development server. Do not use it in a production deployment.    Use a production WSGI server instead.  * Debug mode: off  * Running on http://0.0.0.0:3000/ (Press CTRL+C to quit) 

Pour vérifier que votre application est bien configurée, ouvrez une nouvelle fenêtre de terminal et curl l'adresse IP de votre serveur avec le bon port sur /slack/events :

  • curl http://YOUR_IP_ADDRESS:3000/slack/events

curl renverra ce qui suit :

OutputThese are not the slackbots you're looking for. 

La réception du message These are not the slackbots you're looking for. (Ce ne sont pas les slackbots que vous recherchez), indique que votre app est opérationnelle.

Maintenant, laissez cette application Flask tourner pendant que vous finissez de configurer votre application dans l’interface utilisateur Slack.

Donnez d'abord à votre application les permissions nécessaires pour qu'elle puisse écouter les messages et répondre en conséquence. Cliquez sur Event Subscriptions (Abonnements aux événements) dans la barre latérale de l'interface utilisateur et activez le bouton radio Enable Events (Activer les événements).

Activez le bouton Events

Une fois que vous avez fait cela, tapez votre adresse IP, le port et le point final /slack/events dans le champ Request URL. N'oubliez pas le préfixe du protocole HTTP. Slack fera une tentative de connexion à votre terminal. Une fois qu'il l'aura fait avec succès, vous verrez une coche verte avec le mot Verified à côté.

Demande d'abonnements aux événements URL

Ensuite, développez la rubrique Subscribe to bot events (S'abonner aux événements du bot) et ajoutez la permission message.channels à votre application. Cela permettra à votre app de recevoir des messages de votre canal et de les traiter.

S'abonner aux permissions pour les événements du bot

Une fois que vous aurez fait cela, vous verrez l'événement répertorié dans votre section Subscribe to bot events (S'abonner aux événements du bot). Cliquez ensuite sur le bouton vert Save Changes (Enregistrer les modifications) dans le coin inférieur droit.

Confirmer et enregistrer les modifications

Une fois que vous aurez fait cela, vous verrez une bannière jaune en haut de l'écran vous informant que vous devez réinstaller votre application pour que les changements suivants soient appliqués. Chaque fois que vous modifiez les autorisations, vous devez réinstaller votre application. Cliquez sur le lien reinstall your app (réinstaller votre application) dans cette bannière pour réinstaller votre application.

Bannière Reinstaller votre application

Un écran de confirmation vous sera présenté, résumant les autorisations dont disposera votre bot et vous demandant si vous souhaitez autoriser son installation. Cliquez sur le bouton vert Allow (Autoriser) pour terminer le processus d'installation.

Confirmation de réinstallation

Maintenant que vous avez fait cela, votre application devrait être prête. Retournez sur le canal où vous avez installé CoinBot et envoyez un message contenant la phrase Hey Sammy, Flip a coin. Votre bot tirera à pile ou face et répondra avec les résultats. Félicitations ! Vous avez créé un Slackbot !

Hey Sammy, Flip a coin

Conclusion

Une fois que vous avez terminé le développement de votre application et que vous êtes prêt à la mettre en production, vous devez la déployer sur un serveur. C'est nécessaire, car le serveur de développement de Flask n'est pas un environnement de production sécurisé. Vous serez mieux servi si vous déployez votre application en utilisant un WSGI et peut-être même en sécurisant un nom de domaine et en donnant à votre serveur un enregistrement DNS. Il existe de nombreuses options pour déployer les applications Flask, dont certaines sont énumérées ci-dessous :

  • Déployer votre application Flask sur Ubuntu 20.04 en utilisant Gunicorn et Nginx
  • Déployer votre application Flask sur Ubuntu 20.04 en utilisant uWSGI et Nginx
  • Déployez votre application Flask en utilisant Docker sur Ubuntu 18.04

Il existe bien d'autres façons de déployer votre application. Comme toujours, lorsqu'il s'agit de déploiements et d'infrastructures, faites ce qui fonctionne le mieux pour vous.

En tout cas, vous disposez maintenant d'un Slackbot que vous pouvez utiliser pour tirer à pile ou face afin de vous aider à prendre des décisions, par exemple sur ce qu'il faut manger pour le déjeuner.

Vous pouvez également prendre ce code de base et le modifier pour l'adapter à vos besoins, qu'il s'agisse de support automatisé, de gestion des ressources, d'images de chats, ou de tout ce à quoi vous pouvez penser. Vous pouvez consulter la documentation complète de l'API Python Slack ici.