A nova Bolt API

Recentemente, tentei desenvolver um Slackbot com o SDK do Node Slack mas, infelizmente, encontrei alguns bugs. Foi quando me deparei com a nova API do Bolt . De acordo com o Slack, é a “maneira mais rápida de começar a programar com a plataforma Slack em JavaScript”.

Existem vários motivos para experimentar a nova API Bolt do Slack para construir seu próximo aplicativo ou bot do Slack. Por um lado, é uma biblioteca bem documentada que o ajudará a evitar erros e problemas estranhos mais adiante. Em segundo lugar, a API é desenvolvida e mantida pelo Slack, o que garante que será atualizada com frequência.

Desenvolver com esta API foi muito fácil e posso garantir que a biblioteca Bolt API é o caminho a percorrer quando se trata de desenvolver aplicativos Slack. Neste tutorial, você aprenderá a criar seu próprio Slackbot com a API Bolt.

Configuração

Pré-requisitos

Para acompanhar este tutorial, você precisará:

  • Conhecimento básico de JavaScript e Node.js
  • Node.js v12 ou superior
  • npm

Crie um espaço de trabalho

Para começar, precisaremos de um espaço de trabalho para instalar nosso bot. Um Slack workspace é uma forma de agrupar a comunicação dentro de uma organização. Todos em uma organização podem pertencer a um espaço de trabalho, que é subdividido em vários canais.

Instale o Slack em seu dispositivo e crie um novo espaço de trabalho . O Slack enviará um código de 6 dígitos para o seu e-mail, que você pode usar para verificação. Agora a parte divertida! Dê um nome ao seu espaço de trabalho; para este tutorial, criaremos uma empresa fictícia chamada The Zobo Tea Company.

Observação: se estiver curioso, leia mais sobre chás de hibiscus (também conhecido como Zobo).

Nome da empresa Slack Screen

Em seguida, o Slack solicitará que você insira o nome do projeto em que está trabalhando. Você pode chamar o projeto do que quiser. Você pode pular a última etapa em que o Slack solicita que você adicione outros membros da equipe.

Crie um novo aplicativo Slack

Agora, vamos criar um novo aplicativo Slack. Os aplicativos do Slack são pequenos aplicativos que fornecem funcionalidades específicas dentro de um espaço de trabalho. Você pode instalar um aplicativo Slack preexistente entrando no seu espaço de trabalho do Slack e procurando por aplicativos no diretório do aplicativo Slack.

O aplicativo Slack que criaremos é uma base de conhecimento que ajuda os funcionários de nossa organização fictícia a encontrar rapidamente as respostas às perguntas frequentes.

Para criar um novo aplicativo Slack, vá para o painel da API do Slack . Clique no botão Criar novo aplicativo no canto superior direito. Dê um nome ao seu bot e selecione em qual área de trabalho você gostaria de instalar o aplicativo. Chamamos nosso ask-ztc-bot .

Criar aplicativo Slack

Clique em Criar aplicativo e você será redirecionado ao painel de seu novo aplicativo.

oAuth e permissões

Precisamos dar ao nosso novo aplicativo certas permissões para que ele acesse dados e execute ações em nosso espaço de trabalho do Slack.

No painel do Slack, você encontrará a opção de menu OAuth e permissões na barra lateral esquerda. Depois de navegar aqui, role para baixo até Escopos . Precisamos de nosso ask-ztc-bot para ser capaz de ler mensagens instantâneas de usuários e responder a essas mensagens. Aqui está uma captura de tela dos escopos que demos ao nosso bot:

Slack Bot Token Scopes

Instale o aplicativo em sua área de trabalho

Feito isso, agora podemos instalar o aplicativo em nossa área de trabalho. Na barra lateral esquerda, navegue até Configurações > Instalar aplicativos > Instalar no espaço de trabalho.

Configurar o servidor Slackbot

A seguir, é hora de escrever algum código. Precisamos configurar um servidor para nosso Slackbot para o qual possamos enviar solicitações. Vamos entrar nisso!

Crie um diretório chamado ask-ztc-bot e inicialize o npm:

 mkdir ask-ztc-bot && cd ask-ztc-bot
npm init-y 

Instale os seguintes pacotes no ask-ztc-bot diretório:

  • @ slack/bolt : uma estrutura JavaScript para construir aplicativos Slack em um flash usando os recursos mais recentes da plataforma
  • n odemon : uma ferramenta que reinicia automaticamente um aplicativo Node.js quando alterações de arquivo no diretório são detectadas
  • dotenv : um módulo de dependência zero que carrega variáveis ​​de ambiente de um arquivo .env em process.env

Usarei o gerenciador de pacotes Yarn para instalar esses pacotes, mas você também pode usar o npm:

 yarn add @ slack/bolt
yarn add-D nodemon dotenv

Precisamos fazer um pequeno ajuste em nosso arquivo package.json . Vamos adicionar um novo script chamado dev que executa nodemon app.js . Seu package.json deve ser parecido com isto:

... "main":"index.js", "scripts": { "dev":"nodemon app.js" },
....

O script dev reinicia automaticamente nosso servidor em app.js quando fazemos alterações em qualquer arquivo em nossa base de código. Em seguida, crie o arquivo app.js que conterá o código para nosso servidor:

 touch app.js

Autenticação com tokens e segredos

O Slack precisará autenticar nosso bot para conectá-lo. O Slack autentica aplicativos usando um SIGNING_SECRET e um BOT_TOKEN . Precisamos armazenar o SLACK_SIGNING_SECRET e o SLACK_BOT_TOKEN em um arquivo .env para evitar que sejam expostos ao usar o controle de versão.

Para localizar seu SLACK_SIGNING_SECRET , navegue até Informações básicas > Credenciais do aplicativo > Segredo de assinatura . Para obter o seu SLACK_BOT_TOKEN , vá para Configurações > Instalar aplicativo > Usuário do bot oAuth Token . Seu SLACK_BOT_TOKEN deve começar com xoxb .

Crie um .env no diretório raiz do seu projeto e atribua o SEGREDO e o TOKEN obtido na etapa acima:

  SLACK_SIGNING_SECRET="SEU SEGREDO DE ASSINATURA"
SLACK_BOT_TOKEN="SEU BOT TOKEN"
 

Configurando o servidor

Acesse o arquivo app.js que criamos anteriormente e adicione o código abaixo:

 const {App}=require ("@ slack/bolt");
require ("dotenv"). config ();
//Inicializa seu aplicativo com seu token de bot e segredo de assinatura
const app=new App ({ token: process.env.SLACK_BOT_TOKEN, SignSecret: process.env.SLACK_SIGNING_SECRET,
}); (assíncrono ()=> { porta const=3000 //Inicie seu aplicativo aguarde app.start (process.env.PORT || port); console.log (`⚡ O aplicativo Slack Bolt está sendo executado na porta $ {port}!`);
}) ();

Execute o script yarn run dev que criamos anteriormente para garantir que tudo funcione corretamente. Você deve receber uma mensagem em seu terminal dizendo “⚡ O aplicativo Slack Bolt está sendo executado na porta 3000 ! ”

Configurando o ngrok

Precisamos de uma maneira para nosso aplicativo/bot do Slack alcançar o servidor que criamos em nosso localhost . Para fazer isso, podemos fazer proxy para localhost por meio de uma URL pública criada por um serviço como ngrok . Depois de instalar o ngrok, execute o seguinte comando no diretório:

./ngrok http 3000

Isso cria um URL público que faz proxy para seu localhost em execução na porta 3000 . Agora, certifique-se de que seu servidor em localhost: 3000 ainda esteja em execução.

Modo de soquete

O Slack também tem um recurso chamado Modo de soquete , que permite que o Slack se conecte ao nosso servidor de aplicativos usando WebSockets em vez de HTTP como fizemos com o ngrok acima. O modo de soquete nos oferece uma experiência de desenvolvimento muito mais rápida porque podemos pular a configuração do ngrok.

Introdução ao modo soquete

Primeiro, navegue até Configurações > Informações básicas > Tokens de nível de aplicativo . Uma vez lá, clique no botão Gerar token e escopos . Dê um nome ao seu token e dê ao seu aplicativo os dois escopos disponíveis: connections: write a nd authorizations: read . Clique no botão gerar . Em seguida, copie o token da próxima tela em seu arquivo .env .

Em seguida, vá para Configurações > Modo Soquete . Alterne o botão de alternância Ativar Modo de soquete . Por fim, acesse seu arquivo app.js e atualize o código que inicializa seu app com socketMode: true e seu appToken :

 const app=new App ({ token: process.env.SLACK_BOT_TOKEN, SignSecret: process.env.SLACK_SIGNING_SECRET, socketMode: true,//habilita o seguinte para usar o modo socket appToken: process.env.APP_TOKEN
});

Com isso concluído, todas as solicitações para o seu servidor de desenvolvimento agora acontecerão via WebSockets e não HTTP.

Comandos Slash

Agora que concedemos ao nosso aplicativo algumas permissões e configuramos um servidor e um URL público, a próxima etapa é permitir que ele escute Comandos Slash . No Slack, você pode acionar uma ação enviando um comando como uma mensagem. Por exemplo, um Slash Command pode ser /knowledge para mostrar todo o conteúdo em nossa base de conhecimento.

Para ativar os comandos Slash, clique na opção de menu Comandos Slash na barra lateral esquerda. Em seguida, clique no botão Criar Novo Comando . Preencha o formulário utilizando a imagem abaixo como guia. O URL de solicitação deve ser o URL personalizado gerado automaticamente pelo ngrok para seu aplicativo.

Slack Criar Novo Comando

Clique no botão salvar localizado na parte inferior direita da tela. O Slack solicitará que você reinstale o aplicativo em sua área de trabalho para que as alterações tenham efeito. Siga essas instruções e seu comando /knowledge deve agora ser criado!

Testando o comando /knowledge

Agora, podemos testar o comando /knowledge de dentro do Slack. Primeiro, vamos criar um ouvinte para ouvir eventos que incluem o comando /knowledge . Em seu arquivo app.js , adicione o seguinte código:

 const {App}=require ("@ slack/bolt");
require ("dotenv"). config ();
//Inicializa seu aplicativo com seu token de bot e segredo de assinatura
const app=new App ({ token: process.env.SLACK_BOT_TOKEN, SignSecret: process.env.SLACK_SIGNING_SECRET,
}); app.command ("/knowledge", async ({command, ack, say})=> { tentar { aguardar ack (); diga ("Yaaay! esse comando funciona!"); } catch (erro) { console.log ("err") console.error (erro); }
}); (assíncrono ()=> { porta const=3000 //Inicie seu aplicativo aguarde app.start (process.env.PORT || port); console.log (`⚡ O aplicativo Slack Bolt está sendo executado na porta $ {port}!`);
}) ();

Vamos testar nosso código! No aplicativo Slack, você deve ver o aplicativo ask-ztc-bot logo abaixo da seção Seus aplicativos . Clique aqui para enviar mensagens ao bot. Digite /conhecimento e pressione Enter. Você deve receber uma mensagem dizendo “Yaaay! esse comando funciona! ”.

Slack da mensagem de trabalho do bot

Mensagens no Slack

Também podemos mencionar ou @ o bot e incluir um texto adicional a ser enviado ao bot como uma mensagem.
No Slack, mencionar um aplicativo é um tipo de evento . Também podemos ouvir outros eventos , como quando novos usuários entram em um canal, um novo canal é criado, etc. Para nosso bot/aplicativo para ouvir eventos, precisamos configurar assinaturas de eventos.

Inscrições de eventos

Para habilitar eventos, navegue até Recursos> Assinaturas de eventos no painel do aplicativo Slack. Ative o botão Ativar eventos .

Para que o Slack notifique nosso aplicativo sobre eventos, precisaremos fornecer um URL público que o Slack possa verificar. Copie

Depois de ver o texto verde verificado com o sinal de visto, você sabe que seu aplicativo foi verificado com sucesso pelo Slack e você está pronto para começar!

Em seguida, precisamos dar ao aplicativo algumas permissões de evento. Clique no menu suspenso inscrever-se em eventos de bot e adicione os eventos a seguir. Existem quatro eventos relacionados às mensagens:

  • message.channels : escuta mensagens em canais públicos
  • message.groups : escuta mensagens em canais privados
  • message.im : escuta as mensagens nos DMs de seu aplicativo com os usuários
  • message.mpim : escuta mensagens em DMs para várias pessoas

Neste tutorial, só nos inscreveremos em message.im porque queremos que os usuários apenas DM nosso bot.

Inscrever-se em eventos de bot

Clique no botão Salvar alterações no canto inferior direito da tela para salvar suas alterações.

Agora, podemos testar nosso aplicativo para ter certeza de que pode receber e responder às mensagens. Em seu app.js , adicione o seguinte trecho de código:

 app.message ("hey", assíncrono ({command, say})=> { tentar { diga ("Yaaay! esse comando funciona!"); } catch (erro) { console.log ("err") console.error (erro); }
});

Volte para o aplicativo azk-ztc-bot e envie uma mensagem como @ ask-ztc-bot hey . Você deve receber uma resposta.

Slackbot Command Works Message

Para um aplicativo como uma base de conhecimento, não podemos encontrar palavras exatas. Precisamos de uma maneira de verificar se a mensagem que um usuário está enviando ao nosso bot contém uma palavra-chave que corresponda a uma palavra-chave em nossa base de conhecimento. Para isso, o Slack nos permite usar expressões regex. Por exemplo, vamos atualizar o bloco de código que usamos acima para ficar assim:

//corresponde a qualquer string que contenha a string hey
app.message (/hey/, async ({command, say})=> { tentar { diga ("Yaaay! esse comando funciona!"); } catch (erro) { console.log ("err") console.error (erro); }
});

Envie uma mensagem que inclua a string hey no formato Bem, ei Mr.bot! . Nosso bot ainda responderá corretamente, pois a mensagem contém a string hey .

String Message Bot Response

Criação da base de conhecimento

Agora, podemos realmente criar a base de conhecimento.

Primeiro, criaremos um minibanco de dados para armazenar as perguntas e respostas mais frequentes. Nosso banco de dados será um arquivo JSON simples em nosso servidor. Você pode considerar um DBMS como MongoDB se seus requisitos de dados se tornarem grandes e complexos.

No diretório raiz do seu projeto, crie um arquivo db.json e adicione os seguintes dados:

 { "dados":[ { "palavra-chave":"produtos", "question":"Quantos produtos diferentes vendemos na ZTC?", "resposta":"A ZTC tem atualmente 3 produtos no mercado. Chá de hibisco com um toque de limão/abacaxi ou gengibre." }, { "palavra-chave":"produtos", "question":"Quais lojas online vendem nossos produtos?", "resposta":"Amazon, Macy's e Shoprite." }, { "palavra-chave":"pessoas", "question":"Quantas pessoas trabalham na ZTC?", "answer":"A ZTC emprega atualmente 250 pessoas de 21 países diferentes." }, { "palavra-chave":"redefinir senha", "question":"Como faço para redefinir minha senha?", "answer":"Para redefinir a senha do e-mail de sua empresa, ligue para Ola no ramal 8099." } ]
}

Criamos um conjunto de quatro perguntas com suas respostas e as agrupamos em determinadas palavras-chave para fácil referência.

Respondendo a comandos

Com nosso banco de dados JSON configurado, precisamos de uma maneira de ler os dados nele. Usaremos o módulo interno fs do Node.js para ler o arquivo db.json . No nível superior do seu arquivo app.js , adicione o seguinte bloco de código:

//requer o módulo fs que é integrado ao Node.js
const fs=require ('fs')
//obtenha os dados brutos do arquivo db.json
let raw=fs.readFileSync ('db.json');
//analisa os bytes brutos do arquivo como JSON
let faqs=JSON.parse (bruto);

Agora, podemos escrever o código para responder ao comando /knowledge . Este comando exibirá todas as perguntas e respostas em nosso banco de dados para o usuário:

 app.command ("/knowledge", async ({command, ack, say})=> { tentar { aguardar ack (); deixe mensagem={blocos: []}; faqs.data.map ((faq)=> { message.blocks.push ( { tipo:"seção", texto: { digite:"mrkdwn", texto:"* Pergunta *", }, }, { tipo:"seção", texto: { digite:"mrkdwn", texto: faq.question, }, }, { tipo:"seção", texto: { digite:"mrkdwn", texto:"* Resposta *", }, }, { tipo:"seção", texto: { digite:"mrkdwn", texto: faq.answer, }, } ); }); dizer (mensagem); } catch (erro) { console.log ("errar"); console.error (erro); }
});

Estamos usando blocos (fornecidos pela API Slack Bolt) e marcação para formatar as mensagens que exibiremos aos usuários. Para personalizar ainda mais as mensagens do seu bot quando forem enviadas ao usuário, o Slack fornece um Block Kit Builder that you can use to get your desired template.

You can test this out by typing the command /knowledge in the private conversation with the ask-ztc-bot.

Test Command Bot Conversation

As you can see, it correctly lists all the FAQs in our knowledge base.

Next, we’ll use a simple regular expression to detect if a user has included the keyword products in their question. If they have, we’ll show them FAQs with the keyword products:

app.message(/products/, async ({ command, say })=> { try { let message={ blocks: [] }; const productsFAQs=faqs.data.filter((faq)=> faq.keyword==="products"); productsFAQs.map((faq)=> { message.blocks.push( { type:"section", text: { type:"mrkdwn", text:"*Question ❓*", }, }, { type:"section", text: { type:"mrkdwn", text: faq.question, }, }, { type:"section", text: { type:"mrkdwn", text:"*Answer ✔*", }, }, { type:"section", text: { type:"mrkdwn", text: faq.answer, }, } ); }); say(message); } catch (error) { console.log("err"); console.error(error); }
});

To test this out, send a message to the bot that includes the word products, and the bot will respond with all the information that has to do with the products keyword.

Test Bot Keywords Response

Updating the knowledge base

Finally, we want to give users the ability to add their own data to the knowledge base.

Create a new Slash Command called /update. This command will be called by users to add new data to our knowledge base.

Slack Create New Slash Command

We’ve made a slight change to this command. In the usage hint, we’ve specified that users should separate the different fields using the pipe | character. This way, we can take the input string sent by a user and split it using the pipe character.

Note: If you plan to add your Slackbot to a channel and think that there might be other apps with similar commands to yours, it may be worth creating one command, e.g., /ask-ztc, and having users append an additional string to the command. For example, use /ask-ztc knowledge to display all the FAQs in the knowledge base.

Here’s the code that handles the /update slash command. We update the db.json file by first reading the data in the file and appending the new data sent by the user to it:

app.command("/update", async ({ command, ack, say })=> { try { await ack(); const data=command.text.split("|"); const newFAQ={ keyword: data[0].trim(), question: data[1].trim(), answer: data[2].trim(), }; //save data to db.json fs.readFile("db.json", function (err, data) { const json=JSON.parse(data); json.data.push(newFAQ); fs.writeFile("db.json", JSON.stringify(json), function (err) { if (err) throw err; console.log("Successfully saved to db.json!"); }); }); say(`You've added a new FAQ with the keyword *${newFAQ.keyword}.*`); } catch (error) { console.log("err"); console.error(error); }
});

Let’s test this out!

We’ll call the /update command with the following text: “people | Who should I contact if I’m having issues with my Internet? | Call the IT Department on Ext.9090”.

The /update endpoint will respond with the message:

Update Endpoint Message Response

Now, when we call our /knowledge command, we should see our newly added FAQ as part of the FAQs returned from our database.

Slack Slash Command New FAQ

And there you have it!

You’ve successfully created a Slackbot that can respond to commands and mentions. It can also accept new data from users and store it in the database.

The source code for this example is available on my GitHub.

Deploying

You can deploy your app to a platform like Heroku in the same way you would deploy a regular Node.js application. Don’t forget to change the URL in the event subscription section to the new one provided by Heroku.

You can visit the Bolt API documentation for your reference.

The post Build a Slackbot in Node.js with Slack’s Bolt API  appeared first on LogRocket Blog.

Source link