One place for hosting & domains

      Slackbot

      Building Your First Slackbot With Python


      How to Join

      This Tech Talk is free and open to everyone. Register below to get a link to join the live stream or receive the video recording after it airs.

      Date Time RSVP
      July 21, 2021 11:00 a.m.–12:00 p.m. ET / 3:00–4:00 p.m. GMT

      About the Talk

      Use Slack? Want to make a Slackbot to automate all the things? Slack’s amazing Python libraries can help get your bot up and running. See what a Slackbot is, how to configure it in the Slack developer portal, build our first Python Slackbot, and deploy it to production.

      What You’ll Learn

      • How to create a Slackbot in the Slack API Dashboard
      • How to implement a Slackbot in Python
      • Deploy your Slackbot to DigitalOcean’s App Platform

      This Talk Is Designed For

      Any developer who wants to build a Slackbot

      Prerequisites

      Basic Python knowledge and a Slack workspace they can install apps into



      Source link

      Cómo crear un Slackbot en Python en Ubuntu 20.04


      El autor seleccionó el Tech Education Fund para recibir una donación como parte del programa Write for DOnations.

      Introducción

      Slack es una plataforma de comunicación diseñada para la productividad en el lugar de trabajo. Incluye características tales como mensajes directos, canales públicos y privados, llamadas de voz y de video e integraciones bot. Un Slackbot es un programa automatizado que puede realizar múltiples funciones en Slack, desde el envío de mensajes hasta la activación de tareas de alerta en ciertos eventos.

      En este tutorial, creará un Slackbot en el lenguaje de programación Python. Python es un lenguaje popular que se enorgullece de su simplicidad y legibilidad. Slack proporciona una Python Slack API amplia para integrarla con Slack y realizar tareas comunes como enviar mensajes, añadir emojis a los mensajes y mucho más. Slack también proporciona una Python Slack Events API para integrarla con eventos en Slack, lo que le permite realizar acciones en eventos como mensajes y menciones.

      Como una divertida demostración conceptual para ver el poder de Python y sus API de Slack, creará un CoinBot, un Slackbot que supervisa un canal, y, cuando se active, le lanzará una moneda. A continuación, puede modificar su CoinBot para que cumpla con cualquier número de aplicaciones un poco más prácticas.

      Tenga en cuenta que este tutorial utiliza Python 3 y no es compatible con Python 2.

      Requisitos previos

      Para completar los pasos de esta guía, necesitará lo siguiente:

      • Un espacio de trabajo de Slack en el que tiene la capacidad de instalar aplicaciones. Si creó el espacio de trabajo, tiene esta capacidad. Si aún no tiene uno, puede crearlo en el sitio web de Slack.

      • (Opcional) Un servidor o un equipo con una dirección IP pública para su desarrollo. Recomendamos una nueva instalación de Ubuntu 20.04, un usuario no root con privilegios sudo y SSH habilitado. Puede seguir esta guía para inicializar su servidor y completar estos pasos.

      Es posible que quiera probar este tutorial en un servidor que tenga una dirección IP pública. Slack deberá poder enviar eventos como mensajes a su bot. Si está probando en una máquina local, deberá transferir el tráfico por su firewall a su sistema local. Si está buscando una forma de desarrollar en un servidor en la nube, consulte este tutorial sobre Cómo usar Visual Studio Code para el desarrollo remoto a través del complemento Remote-SSH.

      Paso 1: Crear el Slackbot en la IU de Slack

      Primero, cree su aplicación Slack en el Panel de Control de API de Slack. Inicie sesión en su espacio de trabajo en Slack a través de un navegador web y diríjase al Panel de Control de API. Ahora haga clic en el botón Crear una aplicación.

      Crear su aplicación de Slack

      A continuación, se le solicitará el nombre de su aplicación y que seleccione un espacio de trabajo de Slack de desarrollo. Para este tutorial, nombre su aplicación como CoinBot y seleccione un espacio de trabajo al que tenga acceso de administrador. Una vez que haya hecho esto, haga clic en el botón Crear aplicación.

      Nombrar su aplicación de Slack y seleccionar un espacio de trabajo

      Una vez creada su aplicación, verá el siguiente panel de control de aplicación predeterminado. Este panel de control es donde gestiona su aplicación configurando permisos, suscribiéndose a eventos, instalando la aplicación en espacios de trabajo y mucho más.

      Panel de aplicación de Slack predeterminado

      Para que su aplicación pueda enviar mensajes a un canal, deberá conceder permisos de aplicación para ello. Para hacerlo, haga clic en el botón Permisos en el panel de control.

      Seleccionar el botón Permisos en el panel de control

      Cuando llegue a la página OAuth & Permisos, desplácese hacia abajo hasta que encuentre la sección Alcances de la página. A continuación, encuentre la subsección Alcance de token del bot y haga clic en el botón Añadir un alcance de OAuth.

      Seleccionar el botón Añadir un alcance de OAuth

      Haga clic en ese botón y escriba chat:write. Seleccione ese permiso para agregarlo a su bot. Esto permitirá que la aplicación publique mensajes en canales a los que puede acceder. Para obtener más información sobre los permisos disponibles, consulte la documentación de Slack.

      Añada el permiso chat:write

      Ahora que ha agregado el permiso apropiado, es el momento de instalar su aplicación en su espacio de trabajo de Slack. Vuelva a la página OAuth y permisos y haga clic en el botón Instalar aplicación en espacio de trabajo de la parte superior.

      Instalar aplicación en el espacio de trabajo

      Haga clic en este botón y revise las acciones que puede realizar la aplicación en el canal. Una vez que esté satisfecho, haga clic en el botón Permitir para finalizar la instalación.

      Instalar aplicación en el espacio de trabajo

      Una vez instalado el bot verá un Token de acceso OAuth de usuario de bot para que su aplicación lo utilice cuando intente realizar acciones en el espacio de trabajo. Siga y copie este token; lo necesitará más tarde.

      Guardar el Token de acceso

      Por último, añada el bot que acaba de instalar en un canal dentro de su espacio de trabajo. Si aún no ha creado un canal, puede usar el canal #general que se crea de forma predeterminada en su espacio de trabajo de Slack. Busque la aplicación en la sección Apps de la barra de navegación en su cliente Slack y haga clic en ella. Una vez hecho eso, abra el menú Detalles en el lado superior derecho. Si su cliente de Slack no aparece en pantalla completa, tendrá una i en un círculo.

      Hacer clic en el Icono de detalles de la aplicación

      Para terminar de agregar su aplicación a un canal, haga clic en el botón Más representado por tres puntos en la página de detalles y seleccione Añadir esta aplicación a un canal… Escriba su canal en el modal que aparece y haga clic en Añadir.

      Añadir una aplicación a un canal

      Ahora ha creado correctamente su aplicación y la ha añadido a un canal dentro de su espacio de trabajo de Slack. Tras escribir el código para su aplicación, podrá publicar mensajes en ese canal. En la siguiente sección, empezará a escribir el código Python que habilitará CoinBot.

      Paso 2: Configurar su entorno de desarrollo de Python

      Primero, configuraremos su entorno Python para que pueda desarrollar el Slackbot.

      Abra un terminal e instale python3 y las herramientas pertinentes en su sistema:

      • sudo apt install python3 python3-venv

      A continuación, creará un entorno virtual para aislar sus paquetes Python de la instalación del sistema Python. Para hacerlo, primero cree un directorio en el que creará su entorno virtual. Cree un nuevo directorio en ~/.venvs:

      Ahora cree su entorno virtual Python:

      • python3 -m venv ~/.venvs/slackbot

      A continuación, active su entorno virtual para que pueda usar su instalación Python e instale paquetes:

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

      Ahora su mensaje de shell mostrará el entorno virtual entre paréntesis. El aspecto será similar a este:

      Ahora utilice pip para instalar los paquetes Python necesarios en su entorno virtual:

      • pip install slackclient slackeventsapi Flask

      slackclient y slackeventsapi facilitan la interacción de Python con las API de Slack. Flask es un marco microweb popular que utilizará para implementar su aplicación:

      Ahora que tiene su entorno de desarrollo configurado, puede comenzar a escribir su Python Slackbot:

      Paso 3: Crear una clase de mensaje de Slackbot en Python

      Los mensajes en Slack se envían a través de una carga útil JSON de formato específico. Este es un ejemplo del JSON que su Slackbot creará y enviará como un mensaje:

      {
         "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."
               }
            }
         ]
      }
      

      Podría crear manualmente este JSON y enviarlo, pero en vez de eso compilaremos una clase Python que no solo elabora esta carga útil sino que también simula el lanzar una moneda.

      Primero, utilice el comando touch para crear un archivo llamado coinbot.py:

      A continuación, abra el archivo con nano o su editor de texto favorito:

      Ahora añada las siguientes líneas de código para importar las bibliotecas pertinentes para su aplicación. La única biblioteca que necesita para esta clase es la biblioteca random de la Biblioteca Estándar Python. Esta biblioteca nos permitirá simular el lanzamiento de una moneda.

      Añada las siguientes líneas a coinbot.py para importar todas las bibliotecas necesarias:

      coinbot.py

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

      A continuación, cree su clase CoinBot y una instancia de esta clase para crear la carga útil del mensaje. Añada las siguientes líneas a coinbot.py para crear la clase CoinBot:

      coinbot.py

      ...
      class CoinBot:
      

      Ahora ponga la sangría en uno y cree las constantes, los constructores y los métodos necesarios para su clase. Primero, crearemos la constante que mantendrá la base de su carga útil de mensaje. Esta sección especifica que esta constante es del tipo de sección y que el texto se formateará a través de marcado. También especifica el texto que desea mostrar. Puede leer más sobre las diferentes opciones de carga útil en la documentación oficial de carga útil del mensaje de Slack.

      Añada las siguientes líneas a coinbot.py para crear la plantilla base para la carga útil:

      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"
                  ),
              },
          }
      

      A continuación, cree un constructor para su clase para que pueda crear una instancia separada de su bot para cada solicitud. No se preocupe por la sobrecarga de memoria aquí; el recolector de basura Python limpiará estas instancias una vez que ya no se necesiten. Este código establece el canal receptor basado en un parámetro transmitido al constructor.

      Añada las siguientes líneas a coinbot.py para crear el constructor:

      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
      

      Ahora escriba el código que simula lanzar una moneda. Generaremos aleatoriamente un uno o un cero, lo que representa cara o cruz respectivamente.

      Añada las siguientes líneas a coinbot.py para simular el lanzamiento de una moneda y devolver la carga útil creada.

      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}},
      

      Por último, cree un método que elabore y devuelva toda la carga útil del mensaje, incluidos los datos de su constructor, llamando a su método _flip_coin.

      Añada las siguientes líneas a coinbot.py para crear el método que generará la carga útil terminada:

      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(),
                  ],
              }
      

      Ahora ha terminado con la clase CoinBot y está listo para probarlo. Antes de continuar, verifique que su archivo terminado, coinbot.py, contenga lo siguiente:

      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(),
                  ],
              }
      

      Guarde y cierre el archivo.

      Ahora que tiene una clase Python lista para hacer el trabajo para su Slackbot, asegurémonos de que esta clase produzca una carga útil de mensaje y que pueda enviarla a su espacio de trabajo.

      Paso 4: Probar su mensaje

      Ahora vamos a probar que esta clase produzca una carga útil adecuada. Cree un archivo llamado coinbot_test.py:

      Ahora agregue el siguiente código. Asegúrese de cambiar el nombre del canal en la instanciación de la clase coinbot coin_bot = coinbot("#YOUR_CHANNEL_HERE"). Este código creará un cliente Slack en Python que enviará un mensaje al canal en el que especifica que ya ha instalado la aplicación:

      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)
      

      Guarde y cierre el archivo.

      Antes de ejecutar este archivo, deberá exportar el token de Slack que guardó en el paso 1 como variable de entorno:

      • export SLACK_TOKEN="your_bot_user_token"

      Ahora pruebe este archivo y verifique que la carga útil se produzca y se envíe ejecutando la siguiente secuencia de comandos en su terminal. Asegúrese de que su entorno virtual está activado. Puede verificarlo viendo el texto (slackbot) en la parte delantera de su instrucción bash. Ejecute este comando, recibirá un mensaje de su Slackbot con los resultados de lanzar una moneda:

      Compruebe el canal en el que instaló su aplicación y verifique que su bot de hecho envió el mensaje de lanzar una moneda. Su resultado será cara o cruz.

      Prueba de lanzar una moneda

      Ahora que ha verificado que su Slackbot puede lanzar una moneda, crear un mensaje y entregarlo, crearemos un Flask para ejecutar perpetuamente esta aplicación y hacer que simule el lanzamiento de una moneda y que comparta los resultados cuando vea determinado texto en mensajes enviados en el canal.

      Paso 5: Crear una aplicación Flask para ejecutar su Slackbot

      Ahora que tiene una aplicación que funciona y puede enviar mensajes a su espacio de trabajo de Slack, deberá crear un proceso de ejecución largo para que su bot pueda escuchar los mensajes enviados en el canal y responderles si el texto cumple determinados criterios. Usará el marco web Python Flask para ejecutar este proceso y escuchar eventos en su canal.

      En esta sección, ejecutará su aplicación Flask desde un servidor con una dirección IP pública para que la API de Slack pueda enviarle eventos. Si lo está ejecutando localmente en su estación de trabajo personal, deberá reenviar el puerto desde su firewall personal al puerto que se ejecutará en su estación de trabajo. Estos puertos pueden ser iguales, y este tutorial se configurará para usar el puerto 3000.

      Primero, configure su firewall para que permita el tráfico a través del puerto 3000:

      Ahora compruebe el estado de ufw:

      Verá un resultado similar a este:

      Output

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

      Ahora cree el archivo para su aplicación Flask. Llame a este archivo app.py:

      A continuación, abra este archivo en su editor de texto favorito:

      Ahora añada las siguientes statements de importación. Importará las siguientes bibliotecas por las siguientes razones:

      • import os: para acceder a variables de entorno
      • import logging: para registrar los eventos de la aplicación
      • from flask import Flask: para crear una aplicación Flask
      • from slack import WebClient: para enviar mensajes a través de Slack
      • from slackeventsapi import SlackEventAdapter: para recibir eventos de Slack y procesarlos
      • from coinbot import CoinBot: para crear una instancia de su CoinBot y generar la carga útil de mensaje.

      Añada las siguientes líneas a app.py para importar todas las bibliotecas necesarias:

      app.py

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

      Ahora cree su aplicación Flask y registre un adaptador de evento de Slack a su aplicación Slack en el extremo /slack/events. Esto creará una ruta en su aplicación Slack donde se enviarán y consumirán los eventos de Slack. Para hacerlo, deberá obtener otra token desde su aplicación Slack, lo que hará más tarde en el tutorial. Una vez que obtenga esta variable, la exportará como una variable de entorno llamada SLACK_EVENTS_TOKEN. Siga y escriba su código para que lo lea cuando cree el SlackEventAdapter, a pesar de que aún no ha configurado el token.

      Añada las siguientes líneas a app.py para crear la aplicación Flask y registrar el adaptador de eventos en esta aplicación:

      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)
      

      A continuación, cree un objeto cliente web que permitirá a su aplicación realizar acciones en el espacio de trabajo, específicamente para enviar mensajes. Esto es similar a lo que hizo cuando probó su archivo coinbot.py previamente.

      Añada la siguiente línea a app.py para crear este slack_web_client:

      app.py

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

      Ahora cree una función que puede invocarse y que creará una instancia de CoinBot y, luego, utilice esta instancia para crear una carga útil de mensaje y transmitirla al cliente web de Slack para su entrega. Esta función tendrá un solo parámetro, channel, que especificará qué canal recibe el mensaje.

      Añada las siguientes líneas a app.py para crear esta función:

      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)
      

      Ahora que ha creado una función para manejar los aspectos de mensajería de su aplicación, cree una que monitoree los eventos de Slack para cierta acción y ejecute su bot. Va a configurar su aplicación para que responda con los resultados del lanzamiento simulado de una moneda cuando vea la frase “Hola Sammy, lanza una moneda”. Aceptará cualquier versión; no impedirá que la aplicación responda.

      Primero, decore su función con la sintaxis @slack_events_adapter.on que permite a su función recibir eventos. Especifique que solo quiere los eventos message y que su función acepta un parámetro de carga útil que contiene toda la información necesaria de Slack. Una vez que tenga esta carga útil, analizará el texto. Luego, si recibe la frase de activación, su aplicación enviará los resultados de lanzar una moneda simulada.

      Añada el siguiente código a app.py para recibir, analizar y actuar en los mensajes entrantes:

      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)
      

      Por último, cree una sección main que creará un logger para que pueda ver la parte interna de su aplicación, así como lanzar la aplicación en su dirección IP externa en el puerto 3000. Para consumir los eventos desde Slack, como cuando se envía un nuevo mensaje, deberá probar su aplicación en una dirección IP orientada al público.

      Añada las siguientes líneas a app.py para configurar su sección principal:

      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)
      

      Ahora ha terminado con la aplicación Flask y está listo para probarla. Antes de seguir verifique que su archivo terminado, app.py contiene lo siguiente:

      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)
      

      Guarde y cierre el archivo.

      Ahora que su aplicación Flask está lista para servir a su aplicación, vamos a probarla.

      Paso 6: Ejecutar su aplicación Flask

      Por último, reúna todo y ejecute su aplicación.

      Primero, añada su aplicación en ejecución como un controlador autorizado para su Slackbot.

      Diríjase a la sección Información básica de su aplicación en la IU de Slack. Desplácese hasta que encuentre la sección Credenciales de la aplicación.

      Secreto de firma de Slack

      Copie el Secreto de firma y expórtelo como la variable de entorno SLACK_EVENTS_TOKEN:

      • export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"

      Con esto, tiene todas las tokens de API necesarias para ejecutar su aplicación. Consulte el paso 1 si necesita un repaso sobre cómo exportar su SLACK_TOKEN. Ahora puede iniciar su aplicación y verificar que de hecho se está ejecutando. Asegúrese de que su entorno virtual está activado y ejecute el siguiente comando para iniciar su aplicación Flask:

      Verá un resultado similar a este:

      (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)
      

      Para verificar que su aplicación se ha completado, abra una nueva ventana de terminal y curl la dirección IP de su servidor con el puerto correcto en /slack/events:

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

      Curl le mostrará lo siguiente:

      Output

      These are not the slackbots you're looking for.

      Recibiendo el mensaje Estos no son los slackbots que está buscando. indica que su aplicación está en ejecución.

      Ahora deje esta aplicación Flask en ejecución mientras termina de configurar su aplicación en la IU de Slack.

      Primero, conceda a su aplicación los permisos apropiados para que pueda escuchar los mensajes y responder de forma correcta. Haga clic en Suscripciones de eventos en la barra lateral de la IU y cambie el botón de radio Habilitar eventos.

      Botón de habilitar eventos

      Una vez que haya hecho eso, escriba su dirección IP, su puerto y su extremo /slack/events en el campo URL de solicitud. No olvide el prefijo de protocolo HTTP. Slack hará un intento de conectarse a su extremo. Una vez que haya hecho esto correctamente, verá una marca de verificación verde con la palabra Verificada junto a ella.

      URL de solicitud a suscripciones de eventos

      A continuación, amplíe el Suscribir a los eventos bot y añada el permiso message.channels a su aplicación. Esto permitirá a su aplicación recibir mensajes de su canal y procesarlos.

      Suscribirse a permisos de eventos bot

      Una vez que haya hecho esto, verá el evento que aparece en su sección Suscribirse a eventos bot. A continuación, haga clic en el botón verde Guardar cambios en la esquina inferior derecha.

      Confirmar y guardar los cambios

      Una vez hecho, verá un banner amarillo a lo largo de la parte superior de la pantalla, lo que le indica que debe reinstalar su aplicación para que se apliquen los siguientes cambios. Cada vez que cambie los permisos deberá reinstalar su aplicación. Haga clic en el enlace reinstalar su aplicación en este banner para reinstalar su aplicación.

      Banner que indica que debe reinstalar su aplicación

      Verá una pantalla de confirmación que resume los permisos que tendrá su bot y le solicitará si quiere permitir su instalación. Haga clic en el botón verde Permitir para terminar el proceso de instalación.

      Confirmación de reinstalación

      Ahora que ha hecho esto, su aplicación debería estar lista. Vuelva al canal en el que instaló CoinBot y envíe un mensaje que contenga la frase Hola Sammy, lanza una moneda. Su bot lanzará una moneda y responderá con los resultados. ¡Felicidades! ¡Ha creado un Slackbot!

      Hola Sammy, lanza una moneda

      Conclusión

      Una vez que haya terminado de desarrollar su aplicación y esté listo para moverla a producción, deberá implementarla en un servidor. Esto es necesario porque el servidor de desarrollo Flask no es un entorno de producción seguro. Será mejor si implementa su aplicación usando un WSGI e incluso asegurando un nombre de dominio y dando a su servidor un registro DNS. Existen muchas opciones para implementar aplicaciones Flask, algunas de las cuales se enumeran a continuación:

      Hay muchas otras formas de implementar su aplicación, no solo estas. Como siempre, cuando se trata de implementaciones e infraestructura, haga lo que mejor le funcione.

      En cualquier caso, ahora tiene un Slackbot que puede usar para lanzar una moneda para ayudarle a tomar decisiones, como lo que debe comer.

      También puede tomar este código base y modificarlo para que se ajuste a sus necesidades, ya sea soporte automatizado, gestión de recursos, imágenes de gatos o lo que se le ocurra. Aquí puede ver los documentos completos de Python Slack API.



      Source link

      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 :

      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 :

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

      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 :

      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 :

      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 :

      Vérifiez maintenant le statut de ufw :

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

      Output

      Status: 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 :

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

      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 :

      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 :

      Output

      These 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 :

      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.



      Source link