One place for hosting & domains

      Slackbot

      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

      Como construir um Slackbot em Python no Ubuntu 20.04


      O autor selecionou a Tech Education Fund para receber uma doação como parte do programa Write for DOnations.

      Introdução

      O Slack é uma plataforma de comunicação projetada para a produtividade no trabalho. Ele inclui recursos como mensagens diretas, canais públicos e privados, chamadas de voz e de vídeo e integrações de bot. Um Slackbot é um programa automatizado que pode executar uma variedade de funções no Slack, desde o envio de mensagens até acionar tarefas para alertar em determinados eventos.

      Neste tutorial, você irá construir um Slackbot na linguagem de programação Python. O Python é uma linguagem popular que se orgulha da simplicidade e da legibilidade. O Slack fornece uma API Python Slack rica para integração com o Slack para executar tarefas comuns, como enviar mensagens, adicionar emojis às mensagens e muito mais. O Slack também fornece uma API de eventos Slack para Python para integração com eventos no Slack, permitindo que você realize ações em eventos como mensagens e menções.

      Como uma prova de conceito divertida que irá demonstrar o poder do Python e suas APIs Slack você irá construir um CoinBot; um Slackbot que monitora um canal e, quando acionado, irá jogar uma moeda para você. Em seguida, você pode modificar seu CoinBot para atender a qualquer número de aplicações um pouco mais práticas.

      Observe que este tutorial usa o Python 3 e não é compatível com o Python 2.

      Pré-requisitos

      Para seguir este guia, você vai precisar do seguinte:

      • Um Workspace Slack em que você tenha a capacidade de instalar aplicativos. Se você criou o workspace você tem essa habilidade. Se você ainda não tiver um, você pode criar um no site do Slack.

      • (Opcional) Um servidor ou um computador com um endereço IP público para desenvolvimento. Recomendamos uma instalação nova do Ubuntu 20.04, um usuário não-root com privilégios sudo, e o SSH habilitado. Você pode seguir este guia para inicializar seu servidor e completar esses passos.

      Você pode querer testar este tutorial em um servidor que tenha um endereço IP público. O Slack precisará ser capaz de enviar eventos, como mensagens para seu bot. Se você estiver testando em uma máquina local, você precisará fazer o encaminhamento de tráfego de porta através do firewall para o sistema local. Se você estiver procurando uma maneira de desenvolver em um servidor em nuvem, confira este tutorial How To Use Visual Studio Code for Remote Development via the Remote-SSH Plugin.

      Passo 1 — Criando o Slackbot na UI do Slack

      Primeiro crie sua aplicação Slack no painel de controle da API do Slack. Faça login em seu workspace no Slack através de um navegador Web e navegue até o Painel de Controle da API. Agora, clique no botão Create an App.

      Create Your Slack App

      Em seguida, você será solicitado a inserir o nome da sua aplicação e selecionar um workspace de desenvolvimento do Slack. Para este tutorial, nomeie sua aplicação como CoinBot e selecione um workspace a que você tenha acesso como admin. Depois de ter feito isto, clique no botão Create App.

      Name Your Slack App and Select a Workspace

      Depois que sua aplicação for criada, você será apresentado ao seguinte painel padrão da aplicação. Este painel é onde você gerencia sua aplicação definindo permissões, subscrevendo a eventos, instalando a aplicação em workspaces, e muito mais.

      Default Slack App Panel

      Para que sua aplicação seja capaz de enviar mensagens em um canal, você precisa conceder permissões à aplicação para enviar mensagens. Para fazer isso, clique no botão Permissions no painel de controle.

      Select the Permissions Button in the Control Panel

      Quando você chegar à página OAuth & Permissions, desça até encontrar a seção Scopes da página. Em seguida, encontre a subseção Bot Token Scopes no escopo e clique no botão Add an OAuth Scope.

      Select the Add an OAuth Scope Button

      Clique naquele botão e então digite chat:write. Selecione essa permissão para adicioná-la ao seu bot. Isso permitirá que a aplicação poste mensagens em canais que ela possa acessar. Para mais informações sobre as permissões disponíveis, consulte a Documentação do Slack.

      Add the chat:write Permission

      Agora que você adicionou a permissão adequada, é hora de instalar sua aplicação em seu workspace do Slack. Role para trás na página OAuth & Permissions e clique no botão Install App to Workspace no topo.

      Install App to Workspace

      Clique neste botão e revise as ações que a aplicação pode executar no canal. Uma vez satisfeito, clique no botão Allow para terminar a instalação.

      Install App to Workspace

      Uma vez que o bot está instalado, você será apresentado a um Token Bot User OAuth Access para que sua aplicação use ao tentar executar ações no workspace. Vá em frente e copie este token; você precisará dele mais tarde.

      Save the Access Token

      Por fim, adicione seu bot recém-instalado em um canal dentro de seu workspace. Se você ainda não criou um canal, você pode usar o #general que é criado por padrão em seu workspace do Slack. Localize a aplicação na seção Apps da barra de navegação em seu cliente Slack e clique nela. Depois de ter feito isso, abra o menu Details no lado superior direito. Se o seu cliente Slack não estiver em tela cheia, ele se parecerá com um i em um círculo.

      Click on the App Details Icon

      Para terminar de adicionar sua aplicação a um canal, clique no botão More representado por três pontos na página de detalhes e selecione Add this app to a channel…. Digite seu canal no modal que aparece e clique em Add.

      Add App to a Channel

      Agora, você criou com sucesso sua aplicação e a adicionou a um canal dentro do seu workspace do Slack. Depois de escrever o código para sua aplicação, ele será capaz de postar mensagens naquele canal. Na próxima seção, você irá começar a escrever o código Python que irá alimentar o CoinBot.

      Passo 2 — Configurando o seu ambiente de desenvolvedor Python

      Primeiro vamos configurar seu ambiente Python para que você possa desenvolver o Slackbot.

      Abra um terminal e instale o python3 e as ferramentas relevantes em seu sistema:

      • sudo apt install python3 python3-venv

      Em seguida, você irá criar um ambiente virtual para isolar seus pacotes Python da instalação de sistema do Python. Para fazer isso, primeiro crie um diretório no qual você irá criar seu ambiente virtual. Crie um novo diretório em ~/.venvs:

      Agora, crie seu ambiente virtual Python:

      • python3 -m venv ~/.venvs/slackbot

      Em seguida, ative seu ambiente virtual para que você possa usar sua instalação do Python e instalar pacotes:

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

      Seu prompt de shell irá agora mostrar o ambiente virtual entre parênteses. Eles se parecerão com isso:

      Agora, use o pip para instalar os pacotes Python necessários em seu ambiente virtual:

      • pip install slackclient slackeventsapi Flask

      slackclient e slackeventsapi facilitam a interação do Python com as APIs do Slack. O Flask é um micro framework Web popular que você irá usar para implantar sua aplicação:

      Agora que você tem seu ambiente de desenvolvimento configurado, você pode começar a escrever seu Slackbot Python:

      Passo 3 — Criando a classe de mensagens Slackbot no Python

      As mensagens no Slack são enviadas através de um payload JSON especificamente formatado. Este é um exemplo do JSON que seu Slackbot irá criar e enviar como uma mensagem:

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

      Você pode criar manualmente este JSON e enviá-lo, mas em vez disto, vamos construir uma classe Python que não só faz a criação deste payload, mas também simula uma jogada de moeda.

      Primeiro use o comando touch para criar um arquivo chamado coinbot.py:

      Em seguida, abra o arquivo com o nano ou com o seu editor favorito:

      Agora, adicione as seguintes linhas de código para importar as bibliotecas relevantes para sua aplicação. A única biblioteca que você precisa para esta classe é a biblioteca random da Python Standard Library. Esta biblioteca nos permitirá simular uma jogada de moeda.

      Adicione as seguintes linhas ao coinbot.py para importar todas as bibliotecas necessárias:

      coinbot.py

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

      Em seguida, crie sua classe CoinBot e uma instância desta classe para criar o payload da mensagem. Adicione as seguintes linhas ao coinbot.py para criar a classe CoinBot:

      coinbot.py

      ...
      class CoinBot:
      

      Agora, faça a indentação e crie as constantes, construtores e métodos necessários para sua classe. Primeiro vamos criar a constante que irá armazenar a base de seu payload de mensagem. Esta seção especifica que esta constante é do tipo section e que o texto é formatado através de markdown. Ele também especifica qual texto você deseja exibir. Você pode ler mais sobre as diferentes opções de payload na documentação oficial de payload de mensagem do Slack.

      Acrescente as seguintes linhas ao coinbot.py para criar o modelo base para o payload:

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

      Em seguida, crie um construtor para sua classe para que você possa criar uma instância separada do seu bot para cada requisição. Não se preocupe com sobrecarga de memória aqui; o coletor de lixo do Python irá limpar essas instâncias uma vez que elas não forem mais necessárias. Este código define o canal recipiente com base em um parâmetro passado para o construtor.

      Acrescente as seguintes linhas ao coinbot.py para criar o construtor:

      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
      

      Agora escreva o código que simula jogar uma moeda. Vamos gerar aleatoriamente um ou zero, representando caras ou coroas respectivamente.

      Acrescente as seguintes linhas ao coinbot.py para simular jogar uma moeda e retornar o payload trabalhado:

      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 fim, crie um método que crie e retorne o payload completo da mensagem, incluindo os dados do seu construtor, chamando seu método _flip_coin.

      Acrescente as seguintes linhas ao coinbot.py para criar o método que irá gerar o payload finalizado:

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

      Agora você concluiu a classe CoinBot e ela está pronta para testes. Antes de continuar, verifique se seu arquivo finalizado, coinbot.py, contém o seguinte:

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

      Salve e feche o arquivo.

      Agora que você tem uma classe Python pronta para fazer o trabalho para seu Slackbot, vamos garantir que esta classe produza um payload útil de mensagem e que você possa enviá-la para seu workspace.

      Passo 4 — Testando sua mensagem

      Agora, vamos testar se esta classe produz um payload adequado. Crie um arquivo chamado coinbot_test.py:

      Agora, adicione o código a seguir: Certifique-se de alterar o nome do canal na instanciação da classe coinbot coin_bot = coinbot("#YOUR_CHANNEL_HERE"). Este código irá criar um cliente Slack no Python que enviará uma mensagem para o canal que você especificar onde você já instalou a aplicação:

      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)
      

      Salve e feche o arquivo.

      Antes que você possa executar este arquivo, você precisará exportar o token Slack que você salvou no Passo 1 como uma variável de ambiente:

      • export SLACK_TOKEN="your_bot_user_token"

      Agora, teste este arquivo e verifique se o payload é produzido e enviado executando o seguinte script em seu terminal. Certifique-se de que seu ambiente virtual esteja ativado. Você pode verificar isso vendo o texto (slackbot) na frente do seu prompt bash. Ao executar este comando, você receberá uma mensagem do seu Slackbot com os resultados de uma jogada de moeda:

      Verifique o canal em que você instalou sua aplicação e verifique se o bot realmente enviou a mensagem de jogada da moeda. Seu resultado será cara ou coroa.

      Coin Flip Test

      Agora que você verificou que seu Slackbot pode jogar uma moeda, criar uma mensagem, e entregar a mensagem, vamos criar um Flask para executar perpetuamente esta aplicação e fazer com que ela simule uma jogada de moeda e compartilhe os resultados sempre que ela vir certo texto nas mensagens enviadas no canal.

      Passo 5 — Criando uma aplicação Flask para executar seu Slackbot

      Agora que você tem uma aplicação em funcionamento que pode enviar mensagens para seu workspace do Slack, você precisa criar um processo de longo prazo para que seu bot possa ouvir as mensagens enviadas no canal e responder a elas se o texto cumprir determinados critérios. Você irá usar o framework Web Python Flask para executar este processo e ouvir eventos em seu canal.

      Nesta seção, você irá executar seu aplicativo Flask a partir de um servidor com um endereço IP público para que a API Slack possa lhe enviar eventos. Se você estiver executando isso localmente em sua estação de trabalho pessoal, você precisará encaminhar a porta de seu firewall pessoal para a porta que irá estar em execução em sua estação de trabalho. Essas portas podem ser as mesmas e este tutorial será configurado para usar a porta 3000.

      Primeiro ajuste suas configurações de firewall para permitir o tráfego através da porta 3000:

      Agora, verifique o status do ufw:

      Você verá uma saída como esta:

      Output

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

      Agora, crie o arquivo para sua aplicação Flask. Nomeie este arquivo app.py:

      Em seguida, abra este arquivo em seu editor de texto favorito:

      Agora, adicione as seguintes statements de importação: Você irá importar as seguintes bibliotecas pelas seguintes razões:

      • import os – Para acessar variáveis de ambiente
      • import logging – Para registrar os eventos da aplicação
      • from flask import Flask – Para criar uma aplicação Flask
      • from slack import WebClient – Para enviar mensagens via Slack
      • from slackeventsapi import SlackEventAdapter – Para receber eventos do Slack e processá-los
      • from coinbot import CoinBot – Para criar uma instância de seu CoinBot e gerar o payload da mensagem.

      Adicione as seguintes linhas ao app.py para importar todas as bibliotecas necessárias:

      app.py

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

      Agora, crie sua aplicação Flask e registre um adaptador de eventos Slack para sua aplicação Slack no endpoint /slack/events. Isso irá criar uma rota em sua aplicação Slack onde os eventos do Slack serão enviados e ingeridos. Para fazer isso, você precisará obter outro token de sua aplicação Slack, o que você fará mais tarde no tutorial. Depois de obter esta variável, você irá exportá-la como uma variável de ambiente chamada SLACK_EVENTS_TOKEN. Vá em frente e escreva seu código para lê-lo ao criar o SlackEventAdapter, mesmo que você não tenha definido o token ainda.

      Acrescente as seguintes linhas ao app.py para criar a aplicação Flask e registrar o adaptador de eventos dentro desta aplicação:

      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)
      

      Em seguida, crie um objeto Web client que permitirá que sua aplicação execute ações no workspace, especificamente para enviar mensagens. Isso é semelhante ao que você fez quando você testou seu arquivo coinbot.py anteriormente.

      Acrescente a seguinte linha ao app.py para criar este slack_web_client:

      app.py

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

      Agora, crie uma função que pode ser chamada, que irá criar uma instância do CoinBot, e então usar esta instância para criar um payload de mensagem e repassá-lo para o Slack web client para entrega. Esta função terá um único parâmetro, channel, que irá especificar qual canal recebe a mensagem.

      Acrescente as seguintes linhas ao app.py para criar esta função:

      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)
      

      Agora que você criou uma função para lidar com os aspectos de mensagens da sua aplicação, crie uma que monitora os eventos do Slack para uma determinada ação e então execute seu bot. Você irá configurar sua aplicação para responder com os resultados de uma simulação de jogada de moeda quando ela vir a frase “Hey Sammy, Flip a coin”. Você vai aceitar qualquer versão disso; caso você não queira impedir que a aplicação responda.

      Primeiro decore sua função com a sintaxe @slack_events_adapter.on que permite que sua função receba eventos. Especifique que você só deseja os eventos message e faça com que sua função aceite um parâmetro payload contendo todas as informações necessárias do Slack. Depois de ter este payload, você irá fazer um parse do texto e analisá-lo. Então, se ele receber a frase de ativação, sua aplicação irá enviar os resultados de uma simulação de jogada de moeda.

      Acrescente o seguinte código ao app.py para receber, analisar e agir sobre mensagens recebidas:

      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 fim, crie uma seção main que irá criar um logger para que você possa ver os detalhes internos da sua aplicação, bem como lançar a aplicação em seu endereço IP externo na porta 3000. Para ingerir os eventos do Slack, como quando uma nova mensagem é enviada, você deve testar sua aplicação em um endereço IP voltado para o público.

      Acrescente as seguintes linhas ao app.py para configurar sua seção 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)
      

      Agora você concluiu a aplicação Flask e ela está pronta para testes. Antes de seguir em frente, verifique se seu arquivo finalizado, o app.py contém o seguinte:

      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)
      

      Salve e feche o arquivo.

      Agora que seu app Flask está pronto para atender sua aplicação, vamos testá-la.

      Passo 6 — Executando sua aplicação Flask

      Por fim, junte tudo e execute sua aplicação.

      Primeiro, adicione a aplicação em execução como um handler autorizado para seu Slackbot.

      Navegue até a seção Basic Information da sua aplicação na UI do Slack Desça até você encontrar a seção App Credentials.

      Slack Signing Secret

      Copie o Signing Secret e exporte-o como a variável de ambiente SLACK_EVENTS_TOKEN:

      • export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"

      Com isso, você tem todos os tokens de API necessários para executar sua aplicação. Consulte o Passo 1 se você precisar relembrar como exportar seu SLACK_TOKEN. Agora, você pode iniciar sua aplicação e verificar se ela está realmente em execução. Certifique-se de que seu ambiente virtual esteja ativado e execute o seguinte comando para iniciar sua aplicação Flask:

      Você verá uma saída como esta:

      (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 se sua aplicação está ativa, abra uma nova janela de terminal e faça um curl no endereço IP do seu servidor com a porta correta em /slack/events:

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

      O curl retornará o seguinte:

      Output

      These are not the slackbots you're looking for.

      Receber a mensagem These are not the slackbots you're looking for. indica que sua aplicação está funcionando normalmente.

      Agora, deixe esta aplicação Flask em execução enquanto você termina de configurar sua aplicação na UI do Slack.

      Primeiro conceda à sua aplicação as permissões apropriadas para que ela possa ouvir mensagens e responder de acordo. Clique em Event Subscriptions na barra lateral da UI e alterne o botão de opção Enable Events.

      Enable Events Button

      Depois de ter feito isso, digite seu endereço IP, porta e o endpoint /slack/events no campo Request URL. Não se esqueça do prefixo do protocolo HTTP. O Slack fará uma tentativa de se conectar ao seu endpoint. Depois de ter feito isso com sucesso você verá uma marca de verificação verde com a palavra Verified ao lado dela.

      Event Subscriptions Request URL

      Em seguida, expanda Subscribe to bot events e adicione a permissão message.channels à sua aplicação. Isso permitirá que sua aplicação receba mensagens do seu canal e as processe.

      Subscribe to bot events permissions

      Depois de ter feito isso, você verá o evento listado em sua seção Subscribe to bot events. Em seguida, clique no botão verde Save Changes no canto inferior direito.

      Confirm and Save changes

      Depois de fazer isso, você verá uma faixa amarela no topo da tela lhe informando que você precisa reinstalar sua aplicação para que as seguintes alterações sejam aplicadas. Sempre que você alterar permissões você precisará reinstalar sua aplicação. Clique no link reinstall your app nessa faixa para reinstalar sua aplicação.

      Reinstall your app banner

      Você verá uma tela de confirmação resumindo as permissões que seu bot terá e perguntando se você deseja permitir a instalação. Clique no botão verde Allow para terminar o processo de instalação.

      Reinstall confirmation

      Agora que você fez isso, sua aplicação deve estar pronta. Volte para o canal em que você instalou o CoinBot e envie uma mensagem contendo a frase Hey Sammy, Flip a coin nela. Seu bot irá jogar uma moeda e responder com os resultados. Parabéns! Você criou um Slackbot!

      Hey Sammy, Flip a coin

      Conclusão

      Quando você terminar de desenvolver sua aplicação e estiver pronto para movê-la para a produção, será necessário implantá-la em um servidor. Isso é necessário porque o servidor de desenvolvimento Flask não é um ambiente de produção seguro. Você estará melhor servido se implantar sua aplicação usando um WSGI e talvez até mesmo protegendo um nome de domínio e dando ao seu servidor um registro DNS. Existem muitas opções para implantar aplicações Flask, algumas das quais estão listadas abaixo:

      Há muito mais maneiras de implantar sua aplicação do que apenas essas. Como sempre, quando se trata de implantações e infraestrutura, faça o que funciona melhor para você.

      De qualquer forma, agora você tem um Slackbot que você pode usar para jogar uma moeda para ajudá-lo a tomar decisões, como o que comer para o almoço.

      Também é possível acessar este código base e modificá-lo para atender às suas necessidades, seja para suporte automatizado, gerenciamento de recursos, fotos de gatos ou o que você imaginar. Você pode ver a documentação completa da API do Python Slack aqui.



      Source link