Telegram Bot — Como fazer um Bot com Ruby e Heroku

Victor Hugo Rocha
Tableless
Published in
6 min readDec 21, 2016

Olá, DevZ.

Se você é um dos 50 milhões de usuários do Telegram você já deve saber ou ter lido sobre um Bot, talvez até interagido com um. Se você é um usuário daquele aplicativo de comunicação verde você ainda está longe dessa possibilidade. (Vem pro Telegram você também, vem!)

Bot, que vem da palavra Robot, é um software que é programado para reproduzir algumas ações pré-determinadas, como um robô. E é isso que a gente vai fazer. Acho que já deu tempo de você baixar o Telegram, você pode ir na barra de pesquisas no topo e escrever @netflixnewsbot ou @ytWatchBot e ver como é interagir com um Bot e como eles podem ser muito úteis.

Vamos começar! Agora que você já conheceu alguns Bots vou te apresentar ao pai dos Bots, é por ele que a gente vai começar a criar o nosso.

  1. Procurar pelo @BotFather e STARTAR.
  2. Escrever /newbot no Chat.
  3. Dar um nome para o seu Bot.
  4. Criar um Username para o seu Bot.

Aqui vão algumas dicas importantes: Você não precisa colocar Bot antes ou depois do nome do seu bot, mas você precisa colocar Bot no username como você já deve ter notado nos bots que eu mencionei. Por exemplo, o @topdf_bot tem bot no username mas o seu nome é TO PDF. Sim, como você já percebeu pelo nome, é um bot pra converter doc. docx. e outros formatos para PDF, tá mais que recomendado.

Beleza! Se você fez tudo certo você recebeu no final desses 4 passos um Token, é com ele que a gente vai comunicar o nosso Bot com a aplicação que vamos desenvolver. Guarde ele com carinho mas se você não guardar tudo bem, o BotFather tem um comando /token para gerar um novo Token de acesso ao seu Bot.

Além dos comandos que eu mencionei aqui, ao digitar /help no chat com o BotFather você vai ver uma lista de comandos e as suas descrições, na lista você vai encontrar comandos para atualizar a foto do seu Bot, nome, descrição e outros.

Agora que temos o Bot criado, vamos ao código! Victor, por que Ruby? Porque eu acho o código simples e muito legível. Também foi minha primeira experiência com Ruby e eu não precisava de nenhum desempenho maravilhoso no meu Bot para um grupo de amigos com 10 requisições diárias. Cabe a você decidir o que você precisa na sua aplicação.

Posso fazer com Java? Pode. PHP? Claro. Node? Muito fácil. Python? Mole. Fica a recomendação de sempre de dar uma olhada na documentação oficial do Telegram Bot, você vai achar até alguns exemplos nela de Bots em diversas linguagens. Vamos ao meu código!

# encoding: UTF-8
# coding: UTF-8
# -*- coding: UTF-8 -*-
require ‘telegram/bot’
token = ‘YOUR BOT TOKEN’
Telegram::Bot::Client.run(token) do |bot|
bot.listen do |message|
This is where magic happens. (It’s written by you.) end
end

Algumas explicações: Linha1–3 eu coloco o famoso magic comment, antes do interpretador processar o seu arquivo ele lê esses comentários e interpreta a sua codificação corretamente, no caso da utf-8 é para que nós possamos utilizar acentos e cedilha dentro das mensagens que o Bot envia ao usuário.

Esse tipo de abordagem é bem comum em linguagens interpretadas. Python possui o mesmo approach (Desculpa, gente!) e se você tiver interesse em saber você, você pode ler mais sobre isso nesse artigo.

UPDATE: Since version 2.0, Ruby assumes UTF-8 encoding of the source file by default. As such, this magic encoding comment has become a rarer sight in the wild if you write your source code in UTF-8 anyway.

Nas linhas5–6 eu faço a requisição ou em outras linguagens o import do meu telegram/bot, que é um módulo que vai interagir com o Telegram Bot API e criamos uma variável Token e colocamos o nosso Token de acesso dado pelo BotFather, lembra? Nós vamos usá-la nas próximas linhas. Futuramente nós podemos (e vamos) usar as variáveis globais de ambiente do Heroku para ocultar essa variável do nosso repositório mas não vamos nos adiantar.

Seguindo as linhas 8–9 eu inicio o nosso Bot passando o nosso Token de acesso e fico escutando um evento de mensagem. Ou seja, quando um usuário enviar uma mensagem para o Bot, algo que foi programado por você vai acontecer.

No meu caso eu fiz um Bot para o grupo de TI que faço parte com meus amigos. Como chegamos a marca de 100 pessoas no grupo, percebi que alguns links se perdiam nas mensagens e um bot foi uma solução fácil e rápida para esse problema.

Eu disponibilizei o Bot nesse repositório do Github caso vocês queiram dar mais uma olhada. Como nós ainda não fizemos o deploy do Bot, ou seja, não colocamos em um servidor para mante-lo sempre funcionando, antes disso vamos precisar criar um servidor para testar as funcionalidades do Bot. Com Ruby você só precisar abrir o terminal, encontrar o seu arquivo e digitar o seguinte comando.

ruby botfile.rb

Se você não esqueceu de adicionar o seu Token de acesso no começo do arquivo já está tudo certo e você pode interagir com seu Bot pelo Chat.

Já criamos o nosso Bot no Telegram e partimos pro código, agora vamos para o Deploy. A ferramenta que eu escolhi usar foi o Heroku. Por que? É de graça. Como eu tenho poucas requisições eu não acabo com o meu limite de requests e a minha aplicação fica quase sempre online. Posso usar o Digital Ocean? Pode. E o AWS? Como quiser.

Além de Free o Heroku é bastante user friendly, muito do que vamos fazer pelo terminal pode ser feito pela dashboard da ferramenta. Criamos um novo repositório lá, damos um nome, podemos conectá-lo com o nosso repositório do github onde colocamos o nosso bot e pronto. Pronto? Não tão simples. Ao abrir a pasta do nosso projeto pelo terminal nós utilizamos os seguintes códigos.

heroku login
heroku create repo-name
heroku git:remote -a repo-name
git push heroku master

O primeiro irá nos autenticar no Heroku, pedindo nossas credenciais de acesso da ferramenta. O segundo irá criar um repositório e o terceiro irá adicionar o repositório ao seu remoto, onde você lista os remotos que você configurou, bastante similar ao git. Como eu disse, você pode fazer tudo isso pela dashboard do Heroku caso você não esteja acostumado com o terminal.

Por último nós damos push no nosso e ele funciona. Certo? Depende. Antes disso nós precisamos dizer ao Heroku que tipo de aplicação nós estamos subindo para o servidor. Como a minha aplicação era Ruby eu criei um arquivo Gemfile com as seguintes especificações.

source ‘https://rubygems.org' do 
ruby ‘1.9.3’
gem ‘telegram-bot-ruby’
end

Nela eu digo a versão do Ruby e aviso que estamos utilizando um módulo do Telegram Bot para o Ruby. Victor, to usando PHP, e agora? Então um composer.json vai ser o seu arquivo necessário para dizer ao Heroku o que nós estamos usando na nossa aplicação. Nós fazemos isso para que o Heroku ao identificar o que estamos usando monte automaticamente um ambiente que rode a nossa aplicação. Em grandes aplicações esse facilitador de configuração de ambiente é mágico.

Agora foi, né? Foi! Mas ainda não vai funcionar. Nossa aplicação já está no servidor mas ela ainda não está rodando porque nós não dissemos para ela que ela deveria rodar, para isso precisamos do Procfile. Esse é o arquivo que o Heroku procura para saber o que rodar quando ele terminar de montar o ambiente.

Se você conhece Docker, sabe que no arquivo Dockerfile nós podemos usar um ENTRYPOINT que é uma linha que diz para executar algo dentro do nosso container. É por aí. Se você não sabe o que é Docker, eu vou te mostrar um exemplo do meu Procfile.

web: bundle exec ruby botname.rb

O que eu fiz aí foi dizer: Heroku, quando você terminar de montar o ambiente e subir a aplicação pra mim roda esse comando “ruby botname.rb” o mesmo comando que a gente usou para testar o Bot localmente, lembra? Ele vai rodar esse comando e nosso bot vai estar funcionando!

Como você percebeu, o nosso Profile vai depender da linguagem que você escolheu para desenvolver o seu Bot. Você pode encontrar vários exemplos de Profile com uma rápida busca no Google e a documentação do Heroku tem um artigo sobre o tópico muito útil para quem chegou nessa parte do deploy.

É isso, galera! Espero que esse texto tenta te ajudado um pouco em alguma parte dessa jornada do desenvolvimento. Se você quiser falar comigo, você pode me procurar no twitter e/ou no meu github. Até a próxima!

--

--