Olá, pessoal. Este é meu primeiro artigo aqui no Dev.to e nele vamos aprender a fazer um Bot do Telegram que monitora serviços web através de requisições HTTP.
thalesbruno / telegram-bot
node.js telegram bot
As tecnologias utilizadas aqui foram o Node.js, o Telegraf, que é um framework para construir Bots do Telegram em Node, o Axios, um cliente HTTP em Javascript, e o Docker para dar um toque mais profissional, rs. Tem também o próprio Telegram, naturalmente, onde vamos iniciar a criação do Bot e vê-lo funcionando.
Acho que um bom ponto de partida é entrar no Telegram e criar nosso Bot. Poucas coisas na vida são mais fáceis que isso: basta procurar pela conta BotFather:
Ao iniciar uma conversa com o Pai dos Bots, são exibidos os comandos disponíveis para interagir com ele. Digitamos ou clicamos em /newbot
, definimos um nome e em seguida um username, que deve obrigatoriamente terminar em 'bot'. Feito isso, nosso Bot estará criado e o BotFather disponibilizará um token de acesso que usaremos daqui pra frente para comandar nosso Bot. O BotFather nos aconselha a manter o token em segurança, já que ele pode ser usado por qualquer um para controlar nosso Bot.
Vamos agora ao Node.js. Primeiro, criamos um diretório raiz pro projeto e dentro dele o /src
onde ficará o código Javascript:
mkdir -p telegram-bot/src
cd telegram-bot
Então, inicializamos o projeto...
npm init -y
...e instalamos o módulo Telegraf
npm install telegraf
Agora as primeiras linhas de código. Criamos um arquivo index.js
em ./telegram-bot/src
que será o entrypoint do projeto:
const Telegraf = require('telegraf')
const bot = new Telegraf(process.env.BOT_TOKEN)
bot.start((ctx) => ctx.reply("Hello world"))
bot.launch()
Nele, primeiro importamos o módulo Telegraf, então instanciamos um objeto bot, passando um único argumento, process.env.BOT_TOKEN
(falaremos dele no próximo parágrafo). Em seguida, criamos nossa primeira "rota", bot.start()
, aqui estabelecemos o que o Bot fará ao receber o comando /start
(isso acontece ao iniciarmos pela primeira vez uma conversa com ele ou, após isso, digitarmos /start
no chat). Nesta versão inicial de nosso código, ele apenas responderá com um "Hello world". Por fim, na última linha temos bot.launch()
que inicializa o Bot.
Sobre o process.env.BOT_TOKEN
, process.env
retorna um objeto contendo as variáveis de ambiente do usuário, e destas estamos pegando a que nos interessa: a BOT_TOKEN. Mas para que isso funcione, precisamos criar a variável de ambiente BOT_TOKEN e atribuir a ela o token que o BotFather nos passou. Neste momento vamos apenas exportar nossa variável no terminal (Linux/MacOS) e, depois, quando subirmos nosso projeto em uma imagem Docker, vamos usar uma solução mais elegante.
Então, no terminal basta executar:
export BOT_TOKEN=<O_TOKEN_QUE_O_BOTFATHER_NOS_PASSOU>
Nosso Bot já está pronto para ser executado! No diretório raiz, rodamos:
node src/index.js
No Telegram, já podemos interagir com nosso Bot:
O que precisamos implementar agora é uma rota status
que chamará um módulo responsável por fazer a requisição ao serviço, retornando seu status que, por sua vez, gerará uma resposta de nosso Bot.
Vamos instalar o axios, que é um módulo cliente HTTP.
npm install axios
Novo arquivosrc/status.js
, bem simplezinho, checando o status da página inicial do Google:
const axios = require('axios')
const status = async () => {
try {
return await axios.get('https://www.google.com/', { timeout: 30000 })
} catch(error) {
return error
}
}
module.exports = status
No arquivo principal do projeto, src/index.js
, vamos importar o módulo status e criar a rota que o chamará:
const status = require('./status')
...
bot.command('status', async (ctx) => {
try {
const response = await status()
if (response.status == 200) {
await ctx.reply(`Google service: ✅`)
} else {
await ctx.reply(`Google service: ❌`)
}
} catch(error) {
console.error(error)
}
})
Projeto salvo, rodamos novamente o node src/index.js
e vamos lá falar com nosso Bot:
Prontinho! Se o serviço Google tiver fora do ar, o que é meio difícil, ele vai responder com o ❌.
Vamos fazer um ajuste no package.json
para rodarmos nossa aplicação com npm start
:
...
"scripts": {
"start": "node src/index.js"
}
...
Agora pra finalizar, vamos subir nosso projeto em Docker (e docker-compose)! Primeiro criamos um Dockerfile pra será o build de nossa imagem e depois um docker-compose.yml que subirá o serviço. São provavelmente os exemplos mais simples de Dockerfile e docker-compose que vocês verão por aí:
Dockerfile
FROM node:12.7.0-alpine
WORKDIR /app
COPY . .
RUN ["npm", "install"]
ENV BOT_TOKEN=<PUT_YOUR_TELEGRAM_TOKEN_BOT_HERE>
ENTRYPOINT ["npm", "start"]
docker-compose.yml
version: '3'
services:
bot:
build: .
(Sim, é só isso). Lembrando que os dois arquivos devem estar na raiz do projeto, no Dockerfile colocamos ali em ENV BOT_TOKEN
o mesmo token que já vínhamos usando.
Agora vamos colocar nosso Bot no ar novamente, mas dessa vez usando docker-compose:
docker-compose up -d
O -d
é pra ele subir em background, liberando o promp do terminal. Pra parar o serviço é docker-compose down
. Se fizer alguma modificação no código, é só rodar docker-compose up -d --build
que ele subirá construindo uma nova imagem.
Com o Bot no ar em Docker, podemos ir no Telegram novamente e continuar interagindo com nosso Bot!
Essa é uma versão bem simples e genérica, só pra ilustrar a implementação e o funcionamento. Pro artigo não ficar ainda maior, abstraí algumas explicações de códigos e comandos, mas coloquei os links com as referências de cada tecnologia. Qualquer dúvida é só dar um alô!
Top comments (10)
Thales, o artigo ficou excelente!
Continue escrevendo, o texto está escrito de uma forma simples, clara e bem objetiva.
Obrigado, Alan!
Eu não estou conseguindo, não entendi esse export por terminal
Oi, Camilo. Qual é o seu SO?
Windows
Ah, sim. Então, nesse comando ali a variável de ambiente é criada e exportada para ficar acessível pela aplicação. Porém, esse é um comando que só vai funcionar no Linux ou MacOS. No seu caso é preciso ver como setar variáveis de ambiente no Windows. Talvez esse artigo ajude, eu sinceramente nunca fiz isso no Windows, não tenho experiência com o SO.
Agora, para FINS DE TESTE, você também pode passar o token diretamente como parâmetro:
const bot = new Telegraf("o token aqui como string")
.Já tinha conseguido fazer, mas obrigado
Massa :))
Primeiro post? Pode continuar ... Didática muito boa... Obrigado por compartilhar conhecimento
Muito obrigado pelo feedback!! Que bom que gostou :)