No contexto de hospedagem de alto desempenho e das ferramentas de desenvolvimento versáteis, a Kinsta se destaca como uma plataforma líder que atende ao WordPress, aplicativos, bancos de dados e até mesmo à hospedagem gratuita de site estático.

O Slack, conhecido por seus comandos Slash, integra-se perfeitamente aos aplicativos e serviços hospedados na Kinsta, permitindo que os usuários automatizem tarefas e aumentem significativamente a eficiência.

Este guia explica como você pode configurar a comunicação em tempo real entre o Slack e um aplicativo Python hospedado na Kinsta. Ao aproveitar os comandos Slash, os usuários do aplicativo ganham a capacidade de criar, consultar e excluir produtos com rapidez.

Essa integração permite que eles atualizem dinamicamente o inventário de produtos, garantindo respostas rápidas às necessidades dos clientes.

Entendendo os comandos do Slack

Os comandos do Slack são atalhos baseados em texto. Eles começam com uma barra (/) seguida de uma palavra-chave específica e um parâmetro opcional.

Os comandos do Slack acionam ações ou interagem diretamente com integrações na interface do Slack. Por exemplo, /remind permite que você defina lembretes diretamente por meio de notificações do Slack.

Com as integrações do Slack, você pode configurar comandos personalizados para seus aplicativos. Neste tutorial, sua equipe pode consultar sem esforço o inventário do nosso aplicativo de produto usando o comando Slash /check_inventory e outros comandos.

Ao integrar o Slack aos seus aplicativos, você promove uma interação perfeita e fluxos de trabalho simplificados em um local de trabalho moderno. Ele aprimora a comunicação e a produtividade por meio de:

  • Um hub de comunicação centralizado – O Slack funciona como um espaço unificado para as equipes. A integração de aplicativos ao Slack consolida os canais, mantendo as conversas e as informações em um só lugar e aumentando a eficiência.
  • Atualizações em tempo real – Os aplicativos integrados fornecem alertas instantâneos sobre eventos importantes, garantindo que todos se mantenham informados e reajam rapidamente a mudanças ou atualizações.
  • Fluxos de trabalho simplificados – As integrações automatizam tarefas como notificações de ferramentas de gerenciamento de projetos ou ações de acionamento no software de CRM, reduzindo o trabalho manual.
  • Colaboração aprimorada – Os membros da equipe que acessam aplicativos diretamente do Slack promovem uma colaboração perfeita. Eles podem compartilhar, editar arquivos e discutir projetos com facilidade, promovendo o trabalho em equipe em todas as funções.

Como criar um aplicativo Python na Kinsta

Vamos criar e implantar um aplicativo de gerenciamento de produtos na Kinsta. Em seguida, integre ao Slack para explorar os comandos Slash. Os usuários podem adicionar, excluir e consultar os produtos do inventário por meio de comandos Slash no Slack.

Pré-requisitos

Para acompanhar este guia, presumimos que você tenha:

Primeiro, vamos configurar um projeto Python na Kinsta. Para fazer isso, siga as etapas abaixo:

  1. Visite o template Python da Kinsta no GitHub.
  2. Selecione Usar este template > Criar um novo repositório para copiar o código inicial em um repositório dentro da sua conta GitHub.
  3. Quando seu repositório estiver pronto, faça login ou crie uma conta para visualizar seu painel MyKinsta.
  4. Autorize a Kinsta com seu provedor Git (Bitbucket, GitHub ou GitLab).
  5. Clique em Aplicativos na barra lateral esquerda e, em seguida, clique em Adicionar aplicativo.
  6. Selecione o repositório e o branch dos quais você deseja implantar.
  7. Atribua um nome exclusivo ao seu aplicativo e escolha um local de centro de dados.
  8. Em seguida, configure seu ambiente de build. Selecione a configuração da máquina de build padrão com a opção Nixpacks recomendada para esta demonstração.
  9. Use todas as configurações padrão e, em seguida, clique em Criar aplicativo.

A implantação normalmente leva alguns minutos e, se for bem-sucedida, você receberá um link para o aplicativo junto com um painel contendo informações sobre a implantação.

Como configurar a integração do Slack em um aplicativo Python

Vamos começar criando um aplicativo do Slack e, em seguida, configurar os comandos do Slack que seriam conectados ao seu aplicativo Python por meio de alguns tokens. Vamos configurar um aplicativo do Slack:

  1. Acesse o painel de controle da API do Slack.
  2. Clique em Create New App e escolha From Scratch.
  3. Dê um nome ao seu aplicativo Slack (por exemplo, product-inventory).
  4. Selecione o espaço de trabalho e clique em Create App.

Agora, para a autenticação:

  1. Habilite o Socket Mode na barra lateral do painel do Slack.
  2. Gere um token no nível do aplicativo digitando um nome de token e clicando em Generate.
  3. Salve esse token em nível de aplicativo para configurar variáveis de ambiente posteriormente.

Como configurar os comandos Slash

Para configurar os comandos Slash do seu aplicativo:

  1. Navegue até a seção Features em Basic Information no painel da API do Slack. Escolha Slash Commands.

    Painel da API do Slack com opções para adicionar recursos e funções.
    Painel da API do Slack com opções para adicionar recursos e funções.

  2. Clique em Create New Command para configurar um novo comando.

    Página Criar novo comando no Slack.
    Página Criar novo comando no Slack.

  3. Na página Create New Command, preencha os detalhes do seu novo comando do Slack. Por exemplo, digite /hi no campo Comando. Opcionalmente, adicione uma breve descrição como “Says hello!” (Diz olá!) e forneça uma dica de uso. Clique em Save.
  4. Na seção Instalar aplicativo da barra lateral, clique em Install to Workspace.
  5. Acesse o token OAuth do usuário do bot indo para OAuth & Permissions na barra lateral. Salve esse token para referência futura.

Como adicionar tokens à implantação de aplicativos da Kinsta

  1. Vá para a seção Variáveis de ambiente em Configurações da implantação do seu aplicativo no MyKinsta.
  2. Clique em Adicionar variável de ambiente.

    Você verá o pop-up Adicionar variável de ambiente do Slack.
    Você verá o pop-up Adicionar variável de ambiente do Slack.

  3. Para a Chave 1, SLACK_BOT_TOKEN, cole o token OAuth do usuário do bot no Valor 1. Para a Chave 2, SLACK_APP_TOKEN, cole o token no nível do aplicativo no Valor 2.
  4. Certifique-se de que ambas as opções estejam marcadas e clique em Implantar agora para que a Kinsta possa reimplantar seu aplicativo com as variáveis de ambiente.

Como implementar a comunicação em tempo real

Para esta demonstração, você usa o template Python da Kinsta, que contém os seguintes arquivos:

  • Procfile – Especifica os comandos para executar seu aplicativo.
  • requirements.txt – Lista as dependências necessárias para o aplicativo Python.
  • server.py – O arquivo principal do aplicativo Python, que lida com a funcionalidade ou as operações do lado do servidor.

A Kinsta cria automaticamente um processo com base no Procfile na raiz do repositório ao implantar um aplicativo. O Procfile contém o seguinte código.

web: python server.py

Esse comando executa o código que o server.py contém. A Kinsta também instala as dependências do Python em requirements.txt durante a implantação e a reimplantação.

Agora, vamos usar o framework Bolt para configurar a comunicação em tempo real com seu aplicativo. Adicione as seguintes linhas ao seu arquivo requirements.txt para instalar automaticamente o Bolt no seu aplicativo Python quando você atualizar o repositório.

slack-bolt==1.18.0
slack-sdk==3.23.0

Além disso, adicione a biblioteca psycopg2 ao arquivo requirements.txt. Ela será usada para que você se conecte a um banco de dados Postgres.

psycopg2-binary==2.9.9

Como implantar um banco de dados Postgres com a Kinsta

O aplicativo de inventário de produtos precisa de uma maneira de manter os dados dos produtos que o comandos Slash adiciona ao banco de dados. Para criar um armazenamento de dados persistente, você pode usar o banco de dados hospedado da Kinsta.

  1. Primeiro, implante um banco de dados Postgres no seu painel Kinsta navegando até a seção Bancos de dados na barra lateral do painel MyKinsta.
  2. Clique em Criar um banco de dados. Configure os detalhes do banco de dados inserindo um nome e selecionando o tipo de banco de dados. Selecione a opção PostgreSQL e configure o tamanho que você deseja. Um nome de usuário e uma senha do banco de dados são gerados automaticamente:

    Formulário para criar um banco de dados.
    Formulário para criar um banco de dados.

  3. Clique em Continuar para concluir a configuração do banco de dados. Aguarde até que o banco de dados PostgreSQL seja criado.
    Quando você for bem-sucedido, para obter a string de conexão para acesso externo ao banco de dados, navegue até a seção Conexões externas do painel do banco de dados implantado e copie a string de conexão externa.
    Informações de conexão externa do banco de dados.
    Informações de conexão externa do banco de dados.

    Agora, você pode usar essa string de conexão para se conectar ao banco de dados a partir do seu aplicativo Python.

  4. No seu projeto Python, crie um arquivo db.py no diretório do projeto para as funções de inicialização do banco de dados. Adicione o seguinte código:
    import psycopg2
    import os
    
    # get connection string from environment variable
    connection_string = os.environ.get("DATABASE_CONNECTION_STRING")
     
    def get_conn():
       # create connection
       conn = psycopg2.connect(connection_string)
    
       # Return connection to the database
       return conn
         
    def init_db():
       # get connection
       conn = get_conn()
    
       # get cursor
       cur = conn.cursor()
    
       cur.execute("""
           DROP TABLE IF EXISTS products;
                       
           CREATE TABLE products (
               id INTEGER PRIMARY KEY,
               name TEXT UNIQUE NOT NULL,
               quantity INTEGER NOT NULL
           );
       """)
    
       cur.close()
       conn.commit()
       conn.close()

    Quando a função get_conn() é chamada, ela cria e retorna uma conexão com o banco de dados Kinsta implantado usando sua string de conexão externa.

    A função init_db() obtém uma conexão com o banco de dados, define o esquema do banco de dados e cria a tabela, além de confirmar as alterações. Você só deve chamar a função init_db() uma vez ao configurar inicialmente o servidor de aplicativos. Use a função get_conn() nas chamadas subsequentes para obter uma conexão com o banco de dados.

Como implementar os manipuladores do comando Slash

Agora, crie o código do servidor de aplicativos.

  1. Exclua o conteúdo do arquivo server.py e importe as seguintes bibliotecas:
    import os
    from slack_bolt import App
    from slack_bolt.adapter.socket_mode import SocketModeHandler
    from db import get_conn, init_db
    from psycopg2 import DatabaseError

    Elas são necessárias para a funcionalidade do aplicativo Slack, conexões de banco de dados e tratamento de erros.

  2. Adicione o seguinte código ao arquivo server.py após as instruções de importação:
    # Initialize your app with your bot token
    app = App(
      token=os.environ.get("SLACK_BOT_TOKEN"),
    )

    A classe App de slack_bolt é usada para criar uma instância do aplicativo Slack. Ela inicializa o aplicativo com o token OAuth do usuário do bot recuperado da variável de ambiente SLACK_BOT_TOKEN.

  3. Em seguida, implante um manipulador para o comando Slash /hi que você adicionou ao seu aplicativo Slack anteriormente. Adicione as seguintes linhas ao arquivo server.py.
    # The hi command simply sends back a greeting
    @app.command("/hi")
    def send_hello(ack, respond, command):
      # Acknowledge command request
      ack()
      respond(f"Hello!")

    O @app.command() cria um ouvinte para a string de comando passada como argumento e mapeia a seguinte função para as solicitações desse comando Slash. A função send_hello() lida com a lógica da solicitação.

    O código também passa as variáveis de solicitação ack, respond e command para que a função as utilize. Chame ack para confirmar a solicitação do comando Slash, pois essa é a primeira etapa antes de continuar o processamento, e chame respond para enviar uma resposta de texto.

    Quando o usuário digitar o comando Slash /hi no seu espaço de trabalho do Slack, ele receberá a resposta “Hello!”

  4. Volte ao painel do aplicativo Slack e adicione os seguintes comandos.
    Comando Descrição curta Dica de uso
    /add_product Adicionar um produto ao inventário. product_id, product_name, product_quantity
    /check_inventory Verificar se há um produto com um ID correspondente no inventário. product_id
    /delete_product Excluir do inventário o produto com o ID correspondente. product_id

    Agora, sua página comando Slash deve se parecer com a seguinte captura de tela, contendo uma lista de comandos e seus detalhes.

    Página do comando Slash da API do Slack.
    Página do comando Slash da API do Slack.

  5. Adicione o manipulador /add_product ao arquivo server.py.
    # command to add products
    @app.command("/add_product")
    def add_product(ack, respond, command, request):
     #Acknowledge command request
     ack()
    
     # Extract payload from request
     payload = request.body['text']
     id, name, quantity = [i.strip() for i in payload.split(",")]
      
     # conn object
     conn = None
    
     try:
       # get conn
       conn = get_conn()
    
       # get cursor
       cur = conn.cursor()
    
       # Insert product into the database
       cur.execute(
         "INSERT INTO products (id, name, quantity) VALUES (%s, %s, %s)",
           (int(id), name, int(quantity))
       )
       
       # close communication with postgresql
       cur.close()
       
       # commit changes
       conn.commit()
       
       # Response
       respond(f"""Added product to inventory:
         id - {id},
         name - {name},
         quantity - {quantity}
       """)
    
     except DatabaseError:
       # Send a response
       respond(f"Product with ID {id} exists in inventory!")
      
     finally:
       # close connection
       if conn is not None:
         conn.close()

    request.body acessa a carga útil completa da solicitação que o Slack envia durante o processo de tratamento.

    Quando um usuário digita o comando Slash /add_product, o aplicativo envia o seguinte exemplo de payload JSON como uma solicitação POST.

    {
        'token': , 
        'team_id': , 
        'team_domain': , 
        'channel_id': , 
        'channel_name': , 
        'user_id': , 
        'user_name': , 
        'command': '/add_product', 
        'text': '1, notebook, 5', 
        'api_app_id': , 
        'is_enterprise_install': , 
        'response_url': , 
        'trigger_id': 
    }

    Os campos command e text estão incluídos. command contém o comando Slash acionado, enquanto text contém seu texto adicional. Por exemplo, se o usuário digitar o comando /add_product 1, notebook, 5, text conterá “1, notebook, 5”.

    O manipulador add_product extrai o ID, o nome e a quantidade do produto da solicitação do usuário e se conecta ao banco de dados usando a função auxiliar get_conn(). Ele também executa uma operação SQL de inserção para adicionar o produto ao banco de dados. Se o ID do produto já existir no banco de dados, o código tratará o erro e responderá que o ID já existe.

  6. Agora, adicione o restante dos manipuladores de comando ao arquivo server.py.
    # command to check inventory for a product_id
    @app.command("/check_inventory")
    def check_inventory(ack, respond, command, request):
       # Acknowledge command request
       ack()
    
       # Extract payload from request
       id = request.body['text'].strip()
    
       # Get a database connection
       conn = None
       try:
           # get conn
           conn = get_conn()
    
           # get cursor
           cur = conn.cursor()
     
           # Fetch matching product with ID from database
           cur.execute(
               "SELECT * FROM products WHERE id=%s",
               (int(id),)
           )
    
           product = cur.fetchone()
    
           # close comms
           cur.close()
    
           if product is None:
               respond(f"No product with matching ID {id} found.")
           else:
               # Deconstruct tuple if the product exists
               _, name, quantity = product
              
               respond(f"""Product with ID {id} found:
                          name - {name},
                          quantity - {quantity}
                      """)
             
       except Exception as e:
           print("Connection error: %s", e)
             
       finally:
           # close connection
           if conn is not None:
               conn.close()
    
    # command to delete the matching product_id from inventory
    @app.command("/delete_product")
    def delete_product(ack, respond, command, request):
        #Acknowledge command request
        ack()
    
        # Extract payload from request
        id = request.body['text'].strip()
        
        # Get connection
        conn = None
        try:
            # Get connection
            conn = get_conn()
       	 
            # get cursor
            cur = conn.cursor()
       	 
            # Insert the product into the database
            cur.execute(
            	"DELETE FROM products WHERE id = %s",
            	(int(id),)
            )
            cur.close()
            conn.commit()
       	 
            # Response
            respond(f"Product with ID {id} deleted from inventory!")
        except Exception as e:
            print("Connection error: %s", e)
        finally:
            # close connection
            if conn is not None:
                conn.close()
    

    Esses dois manipuladores de comando consultam e excluem o ID do produto correspondente no inventário, respectivamente.

Como executar o servidor

  1. Para reunir a inicialização do banco de dados e a conexão do soquete, adicione as seguintes linhas ao arquivo server.py.
    # Start your app
    if __name__ == "__main__":
        # Initialize database on start
        init_db()
    
        # Connect socket
        handler = SocketModeHandler(app, os.environ["SLACK_APP_TOKEN"])
        handler.start()

    Você deve inicializar o SocketModeHandler com seu token no nível do aplicativo. Use o SLACK_APP_TOKEN para acessar a variável de ambiente implantada no aplicativo Kinsta.

  2. Confirme as alterações em seu repositório remoto para implantá-las automaticamente na Kinsta. Agora, o server.py inicializa o banco de dados e estabelece a conexão de soquete. A Kinsta acionará uma reimplantação automática do seu aplicativo Python.

Teste e solucione problemas do seu aplicativo

Você pode testar seu aplicativo no Slack usando os comandos Slash configurados.

    1. Vá para o espaço de trabalho associado ao seu aplicativo. Digite o caractere de barra (‘/’) para exibir os comandos do aplicativo:

      O canal kinsta-demo.
      O canal kinsta-demo.

    2. Teste cada comando de barra. Por exemplo, digite /hi. Você receberá a resposta “Hello!”

      Resposta ao comando Hi.
      Resposta ao comando Hi.

    3. Teste o que acontece quando você adiciona o mesmo produto duas vezes. Execute o comando de barra /add_product 1, notepad, 2 duas vezes.
      Adicionando um produto duas vezes.
      Adicionando um produto duas vezes.

      Como mostra a captura de tela acima, o primeiro comando funcionou. Ele adicionou um novo produto. O segundo comando solicitou a resposta de que o ID já existe.

    4. Tente consultar o ID do produto que acabamos de adicionar. Digite /check_inventory 1.
      Verificando o inventário.
      Verificando o inventário.

      A consulta retornou o produto com o ID correspondente.

    5. Por fim, tente excluir o produto que você adicionou. Digite /delete_product 1.

      Excluindo um produto.
      Excluindo um produto.

Como solucionar problemas

Ao configurar e implantar o aplicativo, você pode encontrar erros que precisam ser resolvidos para que o aplicativo funcione corretamente. Tente os seguintes métodos para detectar e corrigir erros típicos.

      • Verifique seus tokens: Certifique-se de que você configurou corretamente o token no nível do aplicativo com o escopo connections:write para habilitar o acesso usando o Socket Mode. Além disso, use os tokens corretos para a classe do aplicativo. O token de usuário do bot começa com xoxb-<...>. Use o token em nível de aplicativo (xapp-<...>) para a classe SocketModeHandler.
      • Verifique seus comandos de barra: Certifique-se de que você configurou os comandos Slash no painel do seu aplicativo Slack e configurou os manipuladores corretos no código do servidor de aplicativos.
      • Use um melhor tratamento de erros: Verifique se a lógica do seu aplicativo trata corretamente os erros, por exemplo, ao executar operações do banco de dados.

Resumo

Neste guia, você aprendeu a criar um aplicativo Python com comunicação em tempo real por meio dos comandos Slash do Slack. Você também aprendeu a implantar o aplicativo na Kinsta.

A integração de um aplicativo hospedado na Kinsta com o Slack permite que os usuários façam alterações usando rapidamente os comandos Slash, aumentando a interatividade e a eficiência do fluxo de trabalho e oferecendo acesso imediato a dados em tempo real. Agora, a equipe pode adicionar, excluir ou verificar o inventário de produtos sem sair da plataforma de comunicações, aumentando a produtividade durante um dia de trabalho agitado.

A PaaS da Kinsta oferece ainda mais possibilidades – você pode conectar aplicativos e bancos de dados, implantando soluções de Full-Stack para empresas e negócios. E a melhor parte? Seus primeiros US$20 são por nossa conta!

Jeremy Holcombe Kinsta

Content & Marketing Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems ;).