
Esse tutorial é parte de uma série de artigos sobre "Como programar em 1 dia". Confira no link abaixo todas as outras coisas que você consegue fazer em um único dia! Mesmo pra você que ainda não programa.
Aqui desenvolveremos um chatbot para Telegram. Nesse curso você vai aprender o básico de forma simples e prática, vamos fazer um bot completo em algumas horas.
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.
Como falar de chatbots sem realmente acreditar nessa tecnologia, não é mesmo?
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.
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.
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.
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 no BotFather e envie a imagem desejada.
A principal informação que você precisa do BotFather é o token de acesso. 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.
Agora vamos fazer nosso chatbot realmente funcionar e se comunicar com os usuários.
Nesse capítulo vamos aprender a codar o backend do bot.
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.
E para programar, necessitamos sempre 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.
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.
O primeiro arquivo de código que vamos criar em nosso backend é o bot.py.
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.
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.
Dentro do método main(), estará a inicialização do bot do Telegram
A primeira linha de código de chamada do chatbot é feita através da instanciação da classe Updater que se encontra declarada dentro o componente python-telegram-bot.
Digite a inicialização do Updater como nas linhas abaixo:
updater = Updater(token=token, use_context=True)
updater.start_polling()
updater.idle()
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.
Para utilizar a classe Updater é necessário primeiramente importar a biblioteca python-telegram-bot para dentro de nosso código, o que é feito através do módulo telegram.ext.
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
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, e passe-a como parâmetro na instanciação do Updater, assim como o argumento user_context=True.
O comando logo após a condição if __name__ == "__main__" faz com que o método main() seja chamado quando inicializarmos a nossa aplicação Python localmente, ao rodar o arquivo bot.py.
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
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.
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
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.
updater.dispatcher.add_handler(CommandHandler(‘start’, welcome))
O CommandHandler irá acessar o método welcome() quando recebido pelo bot.
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().
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.
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 message.from_user.first_name e message.from_user.last_name, por exemplo.
Vamos colocar o nosso bot numa cloud (nuvem) 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.
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.
E o requirements.txt descrevem as bibliotecas que precisam ser instaladas porque serão utilizadas pelo projeto.
Precisamos salvar nossos arquivos de código em um repositório seguro na cloud.
GitHub é um famoso repositório online que serve para ajudar a nós, desenvolvedores, a trabalhar em equipe de forma segura e 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.
Cadastre-se na plataforma Heroku.com, clique no botão “New” e depois “Create new app”.
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”.
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.
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”.
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.
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.
Pronto!
Abra o app do Telegram no seu celular novamente e pode testar o seu bot funcionando até aqui!
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:
conversation_handler = ConversationHandler(
entry_points=[CommandHandler('feedback', feedback)],
states={
STATE1: [MessageHandler(Filters.text, inputFeedback)],
STATE2: [MessageHandler(Filters.text, inputFeedback2)] },
fallbacks=[CommandHandler('cancel', cancel)])
updater.dispatcher.add_handler(conversation_handler)
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:
def feedback(update, context):
message = 'Por favor, digite um feedback para o nosso tutorial:'
update.message.reply_text(message, reply_markup=ReplyKeyboardMarkup([], one_time_keyboard=True))
return STATE1
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():
def inputFeedback(update, context):
feedback = update.message.text
print(feedback)
if len(feedback) < 10:
message = """Seu feedback foi muito curtinho... \nInforma mais pra gente, por favor?"""
context.bot.send_message(chat_id=update.effective_chat.id, text=message)
return STATE1
else:
message = "Muito obrigada pelo seu feedback!"
context.bot.send_message(chat_id=update.effective_chat.id, text=message)
def inputFeedback2(update, context):
feedback = update.message.text
message = "Muito obrigada pelo seu feedback!"
context.bot.send_message(chat_id=update.effective_chat.id, text=message)
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:
def cancel(update, context):
return ConversationHandler.END
E por último não esqueça de importar todas as classes da biblioteca python-telegram-bot que estamos utilizando no código:
from telegram.ext import (Updater, CommandHandler, MessageHandler, Filters, RegexHandler, ConversationHandler)
from telegram import ReplyKeyboardMarkup, ReplyKeyboardRemove
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ô.
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.