Criando o Slackbot usando Python no Ubuntu 20.04:
- Intro
- Preparação
- Lançamento do Slackbot
- Configurando o Python.3
- Mensagens do nosso bot
- Testar ações com nosso bot
- Iniciando um aplicativo Flask
- Iniciando nosso aplicativo Flask
Intro:
Slack - um mensageiro corporativo, que foi projetado para melhorar a produtividade em seus locais de trabalho. Com ele, você poderá trocar mensagens, criar bate-papos públicos ou privados, fazer chamadas (chamadas de voz ou vídeo) e integrar-se a diferentes Slackbots. O Slackbot é um aplicativo projetado para interagir com os usuários por meio de conversas. Ele tem muitas funções e opções, como: enviar avisos e mensagens, iniciar qualquer tarefa.
Em nosso tutorial, para implantar o Slackbot, usaremos Python e Ubuntu 20.04. O Slack tem muitas ferramentas em seu próprio arsenal para ajudá-lo a interagir com a Interface de Programação de Aplicativos (API) do Python e suas integrações.
Para testar as habilidades da API do Python e do Slack, será lançado um CoinBot, que monitorará o bate-papo e lançará uma moeda quando for acionado. Depois de tudo, você pode atualizar seu bot para fins mais práticos e suas próprias ideias.
Blot: Em nosso tutorial, estamos usando o Python.3, o que significa que se você estiver usando versões lançadas anteriormente, o bot não poderá funcionar.
Preparação:
Tudo funcionará se você tiver esses elementos:
1) Slack em seu PC e Workplace (espaço de trabalho) no qual você vai trabalhar. Se você não tiver um, deverá criar um no site oficial do Slack.
2) Máquina virtual ou PC com endereço IP público.
Lançando o Slackbot
Primeiro, vamos iniciar nosso aplicativo Slack no Painel de controle da API do Slack (SCPAPI). Entre no menu de seu local de trabalho e depois vá para SCPAPI.
Em seguida, clique no menu "Create an App" (Criar um aplicativo), como na nossa captura de tela:
Depois disso, será necessário nomear seu aplicativo. Nosso nome será "CoinBot", mas o nome fica a seu critério. Depois disso, escolha um espaço de trabalho que seja mais conveniente para você, onde o aplicativo será instalado.
Depois disso, seu aplicativo estará pronto para funcionar. Você pode acessar o painel de controle.
Nesse painel, você pode personalizar seu aplicativo: carregar novas permissões, conectar notificações a qualquer evento, instalar seu aplicativo em qualquer local de trabalho e muitas outras coisas.
Agora, precisamos conceder direitos especiais ao nosso aplicativo, se quisermos que ele tenha acesso para enviar mensagens em nossos bate-papos.
Para obter essa permissão, precisamos clicar no menu de contexto "Permissions" (Permissões), como na captura de tela:
Depois disso, você estará no menu "OAuth & Permissions". Você precisa ir até a parte inferior de "Scope" (Escopo). Lá, você deve selecionar "Bot Token Scopes". Nesse menu, pressione o menu "Add on OAuth Scope" (Adicionar escopo do OAuth):
Como próxima etapa, precisamos adicionar a permissão chat:write. Você pode procurá-la na mesa especial.
Depois disso, seu aplicativo terá permissão para gravar em bate-papos.
Em seguida, depois de adicionar esse direito, você deve adicionar seu aplicativo novamente ao Workspace.
Vá um pouco mais abaixo nesta página até "Oauth Tokens for Your Workspace" e, em seguida, clique no botão "Install to Workspace":
Após nossas ações, o Slack vai sugerir que você verifique as permissões de lançamento disponíveis para esse aplicativo. Se tudo estiver de acordo com você, clique no botão "Permitir":
Depois que nosso bot estiver pronto para funcionar, o Slack fornecerá seu token de usuário, que será usado para acessar seu Workspace:
Ainda nesse menu, há um botão "Reinstall to Workspace" (Reinstalar no espaço de trabalho), que pode ser usado se você tiver algum erro com o bot, que será reinstalado depois de clicar nesse botão.
Nossa última coisa a fazer é adicionar nosso chatbot em seu espaço de trabalho. Se você já tiver um canal criado, poderá passar para essa etapa agora: "Adicionar um bot ao seu canal"
Caso você ainda não tenha iniciado os bate-papos, siga estas duas etapas:
Localize o menu de contexto "Adicionar canal" e selecione o botão "Criar um novo canal" nele:
Depois, selecione um nome para seu canal e, opcionalmente, preencha a barra de descrição.
Adicionar um bot ao seu canal
Se você quiser adicionar um bot ao seu chat, coloque o cursor sobre o nome do chat e clique no menu de contexto "Exibir detalhes do canal":
Em seguida, vá para o menu "Integration" (Integração) e clique no botão "Add Application" (Adicionar aplicativo):
Em seguida, pesquise seu aplicativo pelo nome ou simplesmente role a tela para baixo para encontrá-lo. No nosso caso, "CoinBot":
Depois de todas as nossas ações, o bot será iniciado em nosso chat:
Configuração do Python
Temos que configurar o Python para que possamos instalar e gerenciar nossos bots do Slack.
Em primeiro lugar, vamos instalar o python v.3 e os auxiliares de ferramentas correspondentes. Faremos isso em nossa VM com o Ubuntu v.20.04 implantado nela.
Inicialmente, o Python v.3 já está pré-instalado em todos os servidores Ubuntu versão 20.04, mas para garantir que temos todas as atualizações disponíveis, devemos fazer o download de todas as atualizações anteriores em nosso sistema usando estes comandos:
sudo apt update
sudo apt -y upgrade
Depois disso, podemos ver qual é a versão que temos:
python3 -V
A resposta será mais ou menos assim:
Python 3.8.2
Em seguida, devemos fazer o download da ferramenta pip, que nos dará acesso ao gerenciamento de pacotes:
sudo apt install -y python3-pip
Depois disso, vamos implantar o ambiente virtual (VE):
python3 -m venv ~/.venvs/slackbot
Depois disso, precisamos ativá-lo:
source ~/.venvs/slackbot/bin/activate
Agora, nosso terminal entre parênteses exibirá nosso ambiente virtual, que deverá ser algo assim:
(slackbot) root@Ubuntu-Bot-Python:~#
Em seguida, com a ferramenta pip, instalaremos alguns componentes importantes do Python:
pip install slackclient slackeventsapi Flask
Explicação: slackclient e slackeventsapi - ferramentas que facilitam o uso da API do Slack. Flask - estrutura microweb que será usada para implantar nosso bot.
Depois de configurarmos o Python, podemos configurar nosso bot.
Criando uma classe para mensagens do Slackbot em Python
O Slack está usando dados JSON especialmente formatados para enviar mensagens.
Vamos lançar uma classe Python que simula o lançamento de uma moeda.
Lembrete - realizamos todas as ações em um ambiente virtual. No nosso caso, o ambiente virtual é root@Ubuntu-Bot-Python:~#
Primeiro, usando o comando touch, crie um arquivo chamado coinbot.py:
touch coinbot.py
Em seguida, abra esse arquivo com o editor nano, você pode usar qualquer outro editor:
nanocoinbot.py
Adicione o seguinte conteúdo ao nosso arquivo:
# 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": (
"Ok! 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(),
],
}
Em seguida, vamos salvar e fechar nosso arquivo com um atalho de teclado.
Agora nosso bot pode enviar mensagens e você pode adicioná-lo ao seu espaço de trabalho.
Teste as mensagens do nosso Slackbot
Agora vamos verificar se a nossa classe cria a carga correta.
Crie um arquivo chamado coinbot_test.py:
nano coinbot_test.py
Em seguida, adicione o seguinte conteúdo ao arquivo criado
Importante: certifique-se de alterar o nome do servidor para o seu próprio nome em coin_bot = coinbot("#YOUR_CHANNEL_HERE").
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 esse arquivo.
Antes de executar o teste, você precisa exportar seu token, que está listado na API do Slak:
Agora exporte seu token:
export SLACK_TOKEN="Your token"
Agora podemos testar nosso bot. Execute o seguinte script em seu terminal:
python coinbot_test.py
Depois disso, uma mensagem sobre o lançamento de uma moeda será enviada a você no canal em que você instalou o aplicativo. Certifique-se de que seu bot realmente lhe deu cara ou coroa.
Criando um aplicativo Flask para executar o Slackbot
Agora que seu bot pode jogar uma moeda, criar e enviar mensagens, vamos implantar o Flask, que processará as mensagens e dará algum tipo de reação a elas se o conteúdo corresponder a algum critério.
Primeiro, vamos definir as configurações do firewall para permitir o tráfego na porta 3000:
sudo ufw allow 3000
Agora, verifique o status do ufw:
sudo ufw status
Você deverá ver uma saída semelhante a esta:
Output
status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
3000 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
3000 (v6) ALLOW Anywhere (v6)
Em seguida, criaremos um arquivo para o nosso aplicativo Flask.
Vamos chamar esse arquivo de app.py:
touch app.py
Em seguida, abra esse arquivo com qualquer um dos editores. Usaremos o nano:
nano app.py
Vamos adicionar o seguinte conteúdo ao nosso arquivo 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.
Explicação: Adicionamos as seguintes declarações porque:
import os - que usaremos para acessar as variáveis de ambiente
import logging - usaremos para registrar eventos do aplicativo.
from flask import Flask - usaremos para criar um aplicativo Flask
from slack import WebClient - usaremos para enviar mensagens via Slack
from slackeventsapi import SlackEventAdapter - usaremos para receber eventos do Slack e processá-los
from coinbot import CoinBot - usaremos para instanciar seu CoinBot e gerar a carga útil da mensagem.
Iniciando seu aplicativo Flask
Afinal de contas, nosso aplicativo Flask está pronto para trabalhar com o aplicativo, vamos testá-lo.
Primeiro, vamos adicionar nosso aplicativo Slackbot.
Na página da API do Slack, vá para a seção "Basik information" (Informações básicas) e role para baixo até a subseção "App Credentials" (Credenciais do aplicativo):
Clique em "Show" (Mostrar), conforme mostrado na captura de tela, e copie o segredo de assinatura.
Agora, exportamos nosso segredo de assinatura com este comando:
export SLACK_EVENTS_TOKEN="MY_SIGNING_SECRET_TOKEN"
Agora podemos testar nosso aplicativo.
Inicie o aplicativo Flask usando esse código:
python3 app.py
Exemplo de saída:
(slackbot) [19:37:05] danial: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)
Agora vamos concluir a configuração do nosso aplicativo na interface do usuário do Slack.
Em primeiro lugar, vamos fornecer ao nosso aplicativo o direito de ler, processar atividades no bate-papo e responder a elas.
No menu da interface do usuário, selecione a seção "Event Subscriptions" (Assinaturas de eventos) e alterne o botão de alternância "Enable Events" (Ativar eventos) para a posição "On" (Ligado), conforme mostrado na captura de tela:
Depois, abra o menu "Assinar eventos de bot" e selecione message.channels:
Após nossas ações, seu aplicativo no futere terá a oportunidade de processar mensagens.
Depois de salvar as alterações, você terá um menu de contexto amarelo na parte superior da tela informando que é necessário reinstalar o aplicativo para aplicar as alterações a seguir.
Clique no link de reinstalação nesse banner para reinstalar o aplicativo:
Em seguida, você terá um menu de contexto com as novas permissões aplicadas. Se você concordar com tudo, clique em "Allow" (Permitir):
Depois disso, nosso bot estará pronto. Vá para seu bate-papo e envie uma mensagem com a frase "Hey Danny, flip a coin" (Danny, jogue uma moeda).
Seu bot vai verificar sua sorte e mostrar o resultado. Parabéns, lançamos nosso bot!