Como fazer um Chatbot em 1 dia!

Alline Oliveira
Como programar em 1 dia!
15 min readJan 5, 2020

Esse é mais um tutorial da nossa série Como programar em 1 dia!
Não deixe de conferir as tantas outras coisas que você pode fazer de forma rápida, fácil e enxuta com tecnologia.

Aqui vamos fazer um chatbot completo em até menos que um dia, em algumas horas na verdade.

Nesse tutorial, desenvolveremos um chatbot para o Telegram.

Infelizmente, para fazermos chatbots para WhatsApp é necessário pedir autorização ao Facebook através da WhatsApp Business API e isso ainda está bastante burocrático, sendo liberado no Brasil, no momento, somente para médias e grandes empresas. Por isso, por enquanto, vamos fazer um chatbot para o Telegram.

https://www.udemy.com/course/como-fazer-um-chatbot-em-1-dia

DICA! Se quiser também pode seguir esse mesmo tutorial em vídeo pela Udemy: https://www.udemy.com/course/como-fazer-um-chatbot-em-1-dia

Telegram Web

A primeira coisa que você precisa fazer é criar uma conta no Telegram, se ainda não tiver. O Telegram é um dos aplicativos de mensagens mais modernos do momento, com vários recursos valiosos, como por exemplo a sua versão completa para Web.

Acesse https://web.telegram.org e confira.

https://web.telegram.org

Observação: Você também pode usar a versão do Telegram para celular ou para desktop sem problemas. Têm a mesma interface e funciona igualmente.

BotFather

Como falar de chatbots se realmente não acreditar nessa tecnologia?

Pois então… O Telegram tem um chatbot para criar chatbots! Isso mesmo, chama-se BotFather, e é por lá que tudo começa.

Acesse o link abaixo e mande um olá para ele:
https://web.telegram.org/#/im?p=@BotFather

Você vai receber de volta uma série de comandos disponíveis para criar seu próprio chatbot no Telegram.

https://web.telegram.org/#/im?p=@BotFather

/newbot

Olha que fácil, para gerar seu bot no Telegram, tudo o que você precisa é digitar o texto /newbot dentro da caixa de mensagens do BotFather na sua conta do Telegram.

O próprio BotFather vai te guiar nos passos necessários para cadastrar seu bot.

Comece digitando um nome e depois o username(@) pelo qual o seu bot será acessado pelos usuários:

https://web.telegram.org/#/im?p=@BotFather /newbot

/start

Pronto! Seu bot já existe e já está configurado dentro do Telegram. O BotFather te retorna inclusive o link de acesso a ele via Web.

Clique no link t.me/id_do_seu_bot e confira.

Depois clique no botão “Começar” já dentro do seu bot.

https://web.telegram.org/#/im?p=@bot1diabot

Observe que o comando /start já vem configurado automaticamente pelo BotFather, porém ainda sem nenhuma inteligência por trás. É esse backend que vamos aprender a desenvolver juntos aqui nesse tutorial.

/setuserpic

De volta ao BotFather, existem outras informações que você já pode deixar configuradas também, como por exemplo a imagem de perfil de seu bot.

Digite /setuserpic e envie a imagem desejada no próprio BotFather:

https://web.telegram.org/#/im?p=@BotFather /setuserpic

Atualize o navegador e você verá seu bot já com a nova imagem de perfil.

Descrição do Bot

Insira também uma descrição para o seu bot, para ela já aparecer quando o usuário entrar.

No BotFather, na opção /mybots, só apertar no botão de “Edit Description” e digitar a descrição que quer que apareça no início do seu bot.

https://web.telegram.org/#/im?p=@BotFather
https://web.telegram.org/#/im?p=@bot1diabot

Token

Por fim, a principal informação que você precisa do BotFather é o token de acesso de seu bot. Essa será a chave para conectar com o código de backend que iremos desenvolver em seguida.

Volte ao diálogo de criação de seu bot com o BotFather pois lá foi retornado o token de acesso.

Ou então, para recuperar o token de acesso corrente de seu bot, digite o comando /mybots no BotFather e depois selecione o botão “API Token”.

https://web.telegram.org/#/im?p=@BotFather /mybots

Dúvidas? Grupo @APPem1dia

Para qualquer dúvida, crítica ou sugestão que tiver, junte-se a nós no grupo de Telegram que criamos para compartilhar informações e discutir as tecnologias utilizadas nesses tutoriais.

É só acessar: https://t.me/APPem1dia

https://t.me/APPem1dia

Backend Python

Agora vamos fazer nosso chatbot realmente funcionar e se comunicar com os usuários.

Por motivos de simplicidade, robustez, elegância e sofisticação, estamos utilizando Python como linguagem de backend em nossos tutoriais. Com o chatbot não será diferente.

Afinal, por quê Python? Clique aqui para entender melhor.

Editor de Código

Para programar, necessitamos também de um editor de código. Se você ainda não tem um de preferência, recomendamos instalar o Visual Studio Code em seu computador, por ser leve, rápido e gratuito.

Observação: Se desejar, poderá usar até editores de código online como o Google Colab por exemplo. Mais abaixo mostraremos o que você tem que importar a mais para que funcione no ambiente de cloud.

bot.py

O primeiro arquivo de código que vamos criar em nosso backend é o bot.py.

ATENÇÃO: Se você não é familiarizado com a linguagem Python, não precisa se preocupar porque vamos te guiar passo a passo e você irá compreender cada linha de código do tutorial.

Crie uma pasta, ou workspace, com o nome de seu bot em seu computador, e adicione-a ao seu editor de código. No VS Code, é só você ir no menu “File” e clicar em “Add Folder to Workspace…

Depois já crie um primeiro arquivo, indo ao menu “File”, clicando em “New File” e dê o nome de bot.py:

IMPORTANTE!
Observe que se você não já tiver o Python instalado em seu computador, o VS Code vai te indicar o download e a instalação do mesmo. Clique em instalar ou vá até o site do Python e faça a instalação da versão 3 mais recente.

python-telegram-bot

Devido ao fato de Python ser uma das linguagens de programação mais utilizadas no mundo, já existem muitos componentes prontos desenvolvidos para facilitar nossas vidas.

O que vamos utilizar aqui para desenvolver nosso chatbot é o chamado python-telegram-bot.

Para importar uma biblioteca de código em Python precisamos instalá-la com o gerenciador de pacotes pip que já vem com o Python.

Vá no menu “Terminal” do VS Code e clique na primeira opção “New Terminal” para abrir uma janela de comandos Shell.

Na janela do terminal, digite a linha de comando abaixo:
pip install python-telegram-bot

O componente será baixado e instalado em seu computador e você poderá importá-lo em seu código Python.

Observação: Você pode criar um chatbot utilizando diretamente as APIs REST que o próprio Telegram oferece, https://core.telegram.org/bots/api. A biblioteca python-telegram-bot é uma camada de abstração dessa API para Python prontinha para facilitar a nossa vida.

def main()

Estamos prontos para começar a codar.

O primeiro método do arquivo bot.py é o método main(), definido pelo comando def do Python (linha 4 da figura abaixo).

Dentro do método main(), estará a inicialização do bot do Telegram que é feita através da instanciação da classe Updater que se encontra declarada dentro o componente python-telegram-bot (linha 6 da figura abaixo).

updater = Updater(token=token, use_context=True)
updater.start_polling()
updater.idle()

from telegram.ext import Updater

https://github.com/allineo/bot1dia/blob/master/bot.py

E para instanciar a classe Updater é necessário também passar como parâmetro o token de acesso do seu bot, aquele gerado pelo BotFather como explicamos lá atrás. Recorda?

Então declare o valor do token de acesso de seu bot em uma variável (linha 5 da figura acima), e passe-a como parâmetro na instanciação do Updater, assim como o argumento user_context=True (linha 6).

Agora é só inicializar o Updater, através do método start_polling() do objeto updater (linha 8 da figura acima), e deixá-lo rodando em background com o método idle() também do objeto updater (linha 9 da figura acima).

O comando logo após a condição if __name__ == "__main__" (nas linhas 12 e 13) faz com que o método main() seja chamado quando inicializarmos a nossa aplicação Python ao rodar o arquivo bot.py.

if __name__ == “__main__”:
main()

Código de exemplo

DICA:
Todo o código que utilizamos para gerar o bot nesse tutorial está disponível para cópia no repositório do Github abaixo:

https://github.com/allineo/bot1dia

https://github.com/allineo/bot1dia/blob/master/bot.py

Teste de integração

Já podemos fazer um primeiro teste no nosso bot!

Adicione uma linha de código print(str(updater)) no método main() para testarmos a execução do bot (linha 9 da figura abaixo).

Rode o arquivo bot.py utilizando a janela terminal do VS Code. Ou seja, abra um terminal e digite a linha de comando abaixo:

py bot.py

Se você tiver colado direitinho o token de acesso no código, o Updater irá inicializar o seu bot com sucesso e deixá-lo rodando em background para receber todos os comandos que forem enviados pelos usuários lá na janela do seu bot no Telegram.

OBSERVAÇÃO:
Para fins de segurança e escalabilidade de sua aplicação, é recomendado que você, posteriormente, armazene o token de acesso do Telegram separado do código Python através de uma variável de ambiente, um arquivo .env.

Conflitos com o Python?

Caso você esteja tendo problemas de conflito com sua instalação do Python e não esteja conseguindo compilar código em sua máquina local, uma alternativa é testar seu robô num ambiente na nuvem, como o Google Colab ou o Gitpod.io.

https://colab.research.google.com/

CommandHandler

O próximo passo agora é responder aos comandos digitados pelos usuários no seu bot no Telegram.

Por exemplo, o comando /start.

O /start já é pré-cadastrado pelo BotFather quando criamos o bot.

E para fazer o bot responder a esse comando é só inicializar o CommandHandler passando o nome do comando como parâmetro.

Copie e cole a linha de comando abaixo:
updater.dispatcher.add_handler(CommandHandler(`start`, welcome))

E não esqueça de verificar se você está importando o CommandHandler no topo do seu arquivo:
from telegram.ext import Updater, CommandHandler

Agora vamos criar um método welcome() que receberá o comando /start do bot, quando digitado pelo usuário (linha 4 da figura abaixo).

O CommandHandler irá acessar o método welcome() quando recebido pelo bot (linha 14 da figura abaixo).

https://github.com/allineo/bot1dia/blob/master/main.py

O método welcome() receberá os parâmetros update e context do objeto updater e retornará para o parâmetro context a mensagem de retorno que desejarmos através do método bot.send_message() (linha 7 da figura acima).

Copie e cole as linhas de código abaixo:

Pronto. Faça essas atualizações no código e rode novamente o arquivo bot.py na janela do terminal:

Agora vá até o seu bot no Telegram e digite a mensagem /start. Pode ser tanto no Telegram Web ou no App Telegram do seu celular.

https://web.telegram.org/#/im?p=@bot1diabot

😲

É isso mesmo!! Já está funcionando!

Dados do Usuário

Muita emoção até aqui, eu sei…

Mas não vamos parar nesse ponto, logicamente. Vamos fazer agora o robô identificar os dados do usuário corrente.

Altere o método welcome() de forma que a variável message receba o nome do usuário atual que está instanciado no objeto update. Para isso pode utilizar os campos update.message.from_user.first_name e update.message.from_user.last_name, por exemplo (linha 5 da figura abaixo).

https://github.com/allineo/bot1dia/blob/master/bot.py

Se desejar, aproveite também para pegar o username do usuário no Telegram (update.message.from_user.username). O Telegram não disponibiliza muito mais informações além dessas por proteção à privacidade do usuário.

Agora rode novamente o arquivo bot.py na janela do terminal, digite /start no seu bot lá no Telegram e curta o resultado!

DICA: Para parar uma execução anterior no python, digite Control+C.

https://github.com/allineo/bot1dia/blob/master/bot.py
https://web.telegram.org/#/im?p=@bot1diabot

GitHub

Para a segurança de nosso código, precisamos salvar nossos arquivos de código em um repositório seguro na cloud.

O GitHub é um famoso repositório online que serve para nos ajudar a trabalhar em equipe de forma eficiente.

Acesse Github.com, clique no botão “Sign up” e faça seu cadastro se ainda não o tiver.

Depois clique no botão verde “New ” para criar um novo repositório.

https://github.com/new

Digite o nome do repositório do seu código. e não se esqueça de clicar em:
Initialize this repository with a README.

IMPORTANTE! Selecione o seu repositório como PRIVADO (Private), porque você vai precisar deixar o seu token no Github para ser utilizado pelo Heroku.

Depois de criado o novo repositório clique no botão “Upload files” e arraste os três arquivos de código do seu bot para o GitHub: bot.py, Procfile e requirements.txt.

https://github.com/allineo/bot1dia/upload/master
https://github.com/allineo/bot1dia

Heroku

“Na minha máquina funciona”, ninguém merece, né?

Então vamos colocar o nosso bot numa cloud para que funcione sem que o nosso localhost precise estar no ar.

A cloud Heroku.com tem uma opção gratuita, muito boa para a gente testar e brincar com nossos bots.

Cadastre-se na plataforma Heroku.com, clique no botão “New” e depois “Create new app”.

https://dashboard.heroku.com/

Se a linguagem Python ainda não tiver sido selecionada na hora de criar o app, vá até o menu “Settings”, e selecione o buildpack para o seu app clicando no botão “Add buildpack”.

Depois clique no botão para selecionar a linguagem “python” e “Save changes”.

Arquivos de Configuração

Existem dois arquivos importantes de configuração que o Heroku exige para o seu projeto funcionar. São eles o Procfile e o requirements.txt.

O Procfile descreve o arquivo que será chamado para inicializar o projeto.

ATENÇÃO: O arquivo Procfile não tem extensão! Não é .py nem .txt nem nada. Só Procfile.

Copie e cole a linha abaixo dentro de um arquivo chamado Procfile na raiz de seu projeto:
worker: python bot.py

https://github.com/allineo/bot1dia/blob/master/Procfile

E o requirements.txt descrevem as bibliotecas que precisam ser instaladas porque serão utilizadas pelo projeto.

Copie e cole as linhas abaixo dentro de um arquivo chamado requirements.txt na raiz de seu projeto:
requests
python-telegram-bot

https://github.com/allineo/bot1dia/blob/master/requirements.txt

Click to Deploy

Agora voltando ao dashboard do seu novo app, vá no menu “Deploy”, e na seção “Deployment method”, selecione o botão “Connect to GitHub” e autentique-se no GitHub.

https://dashboard.heroku.com/

Depois digite o nome do repositório do seu bot que você criou lá no GitHub e pressione o botão “Search”.

Quando aparecer o nome do seu repo, clique no botão “Connect”.

https://dashboard.heroku.com/

Agora verifique se no final da página a branch “master” está selecionada e clique no botão “Deploy Branch”.

Aí é só esperar o deploy ser realizado com sucesso e seu bot estará na cloud.

Agora um último macete para fazer o bot funcionar no Heroku.

Abra o app do Telegram no seu celular e faça uma chamada para o bot para gerar uma centelha no servidor no Heroku. Digite /start no bot e entenda que não irá acontecer nada ainda…

Agora volte ao dashboard do Heroku, vá na aba “Resources” e clique no botão de editar o worker do Free Dyno.

Mova o indicador para a direita, para que fique azul e depois clique no botão “Confirm” para iniciar o worker.

https://dashboard.heroku.com/apps/bot1dia/resources

Pronto!

Abra o app do Telegram no seu celular novamente e pode testar o seu bot funcionando até aqui!

ConversationHandler

Muito legal até agora, mas vamos adicionar mais inteligência ao nosso robô.

O comando ConversationHandler da biblioteca python-telegram-bot nos dá a flexibilidade de direcionar o diálogo de acordo com as respostas do usuário.

Adicione ao método main() as linhas de código abaixo:

Dentro do ConversationHandler vamos criar um novo comando para o nosso robô responder. Você pode criar qualquer comando que quiser. Para o nosso exemplo aqui, vamos criar um comando chamado /feedback que vai pegar o feedback do usuário atual sobre o nosso próprio tutorial. É só um exemplo.

Para iniciar o comando /feedback dentro do ConversationHandler utilizamos o atributo entry_points.

entry_points=[CommandHandler(‘feedback’, feedback)]

Depois precisamos cadastrar as opções de resposta desse comando dentro do atributo states.

Observe que no nosso exemplo aqui, o comando /feedback gerencia dois próximos estados do robô, STATE1 e STATE2:

STATE1: [MessageHandler(Filters.text, inputFeedback)],
STATE2: [MessageHandler(Filters.text, inputFeedback2)]

Cada estado criado dentro do ConversationHandler será executado por um método que precisa ser implementado dentro do nosso backend. No nosso exemplo, os estados do comando /feedback estão implementados nos métodos: feedback, inputFeedback e inputFeedback2.

Vamos ao primeiro deles. Adicione o método feedback() abaixo ao arquivo bot.py:

A linha de código do comando update.message.reply_text() imprime a mensagem da variável message no seu robô e já abre o teclado do chatbot para o usuário poder digitar o feedback.

Vamos aproveitar e já declarar lá no topo do arquivo bot.py as constantes que estamos utilizando para a definição dos estados, a constante STATE1 e a constante STATE2.

STATE1 = 1
STATE2 = 2

Agora vamos adicionar os métodos de retorno do input do usuário ao arquivo bot.py. Os métodos inputFeedback() e inputFeedback2():

O comando update.message.text serve para capturar o feedback digitado pelo usuário.

A partir do conteúdo capturado, nosso código poderá fazer ações de retorno como no exemplo acima, que o código verifica o tamanho do texto do feedback dado pelo usuário e retorna uma mensagem de tamanho satisfatório ou não.

Vamos criar só mais um método, para o caso do usuário não digitar nada e quiser cancelar a conversa, o ConversationHandler.END. Crie o método cancel() abaixo dentro do seu arquivo bot.py:

E por último não esqueça de importar todas as classes da biblioteca python-telegram-bot que estamos utilizando no código:

Esse é o arquivo bot.py final:

https://github.com/allineo/bot1dia/blob/master/bot.py

Funcionou aí pra você??

Atualize o arquivo bot.py no GitHub, depois volte ao Heroku e clique novamente no botão de deploy.

Atualize seu Telegram web e teste o comando /feedback no seu robô.

https://web.telegram.org/#/im?p=@bot1diabot

Não se esqueça de realmente dar o seu feedback para o nosso tutorial através do link para o nosso robô abaixo:
https://web.telegram.org/#/im?p=@bot1diabot

OBRIGADA!!!

Adicionando botões

Agora vamos adicionar alguns botões às nossas perguntas no bot.

Podemos por exemplo utilizar o comando InlineKeyboardButton.

Adicione um novo comando ao seu bot o qual você gostaria de oferecer botões de resposta aos seus usuários. Por exemplo aqui nesse tutorial vamos adicionar botões para o usuário dar uma nota para esse tutorial.

Copie o método “askForNota()” do arquivo de exemplo do GitHub e cole no seu arquivo bot.py. Aí então você pode customizá-lo e colocar a pergunta e os botões que desejar.

https://github.com/allineo/bot1dia/blob/master/bot.py

DICA:
Para o texto dos botões utilizamos emojis copiados e colados da página
https://getemoji.com

Observe os comandos InlineKeyboardMarkup e InlineKeyboardButton usados para criar os botões no bot.

Você vai precisar também de um método de callback para ser chamado após algum botão ser pressionado pelo usuário durante o chat.

Copie o método getNota()” do arquivo de exemplo do GitHub e cole no seu arquivo bot.py. E customize o retorno do seu bot como desejar.

https://github.com/allineo/bot1dia/blob/master/bot.py

Observe que a resposta pressionada pelo usuário trafega através da variável callback_data e é recebida no método de callback através do atributo update.callback_query.

Para esses métodos serem acessados, vamos criar então o comando /nota no método main() do arquivo bot.py.

E declarar também o método getNota() como o nosso método de callback através do comando CallbackQueryHandler.

E por último, não podemos esquecer de importar todos esses novos comandos do python-telegram-bot no início do arquivo bot.py:

Prontinho, veja como ficou o código final no nosso exemplo do GitHub:
https://github.com/allineo/bot1dia/blob/master/bot.py

Agora é só testar localmente o novo comando dos botões na sua máquina local, depois de tudo funcionando atualizar o arquivo bot.py no seu repositório do GitHub, então ir para o Heroku e refazer o deploy do backend do seu bot.

Se tudo estiver funcionando, seus botões devem ficar mais ou menos assim:

https://web.telegram.org/#/im?p=@bot1diabot

Gostou?

Aproveita e já corre lá no robô do nosso tutorial e dá uma nota pra gente!
@bot1diabot

:-D

--

--