Construindo seu primeiro bot de telegrama: um guia passo a passo
Publicados: 2022-03-11Os chatbots são frequentemente apontados como uma revolução na maneira como os usuários interagem com a tecnologia e os negócios. Eles têm uma interface bastante simples em comparação com os aplicativos tradicionais, pois exigem apenas que os usuários conversem, e os chatbots devem entender e fazer o que o usuário exigir deles, pelo menos em teoria.
Muitas indústrias estão mudando seu atendimento ao cliente para sistemas de chatbot. Isso por causa da enorme queda no custo em relação aos humanos reais, e também por causa da robustez e disponibilidade constante. Os chatbots oferecem um grau de suporte ao usuário sem custo adicional substancial.
Hoje, os chatbots são usados em muitos cenários, desde tarefas simples, como exibir dados de tempo e clima, até operações mais complexas, como diagnóstico médico rudimentar e comunicação/suporte ao cliente. Você pode criar um chatbot que ajudará seus clientes quando eles fizerem certas perguntas sobre seu produto, ou você pode criar um chatbot de assistente pessoal que possa lidar com tarefas básicas e lembrá-lo quando for a hora de ir a uma reunião ou à academia.
Há muitas opções quando se trata de onde você pode implantar seu chatbot, e um dos usos mais comuns são as plataformas de mídia social, pois a maioria das pessoas as usa regularmente. O mesmo pode ser dito dos aplicativos de mensagens instantâneas, embora com algumas ressalvas.
O Telegram é uma das plataformas de mensagens instantâneas mais populares atualmente, pois permite armazenar mensagens na nuvem em vez de apenas no seu dispositivo e possui um bom suporte multiplataforma, pois você pode ter o Telegram no Android, iOS, Windows e praticamente qualquer outra plataforma que possa suportar a versão web. Construir um chatbot no Telegram é bastante simples e requer algumas etapas que levam muito pouco tempo para serem concluídas. O chatbot pode ser integrado em grupos e canais do Telegram, e também funciona por conta própria.
Neste tutorial, criaremos um bot do Telegram que fornece uma imagem de avatar de Adorable Avatars. Nosso exemplo envolverá a construção de um bot usando o Flask e sua implantação em um servidor Heroku gratuito.
Para concluir este tutorial, você precisará do Python 3 instalado em seu sistema, bem como habilidades de codificação em Python. Além disso, uma boa compreensão de como os aplicativos funcionam seria uma boa adição, mas não uma obrigação, já que veremos a maioria das coisas que apresentamos em detalhes. Você também precisa do Git instalado em seu sistema.
Claro, o tutorial também requer uma conta do Telegram, que é gratuita. Você pode se inscrever aqui. Uma conta Heroku também é necessária, e você pode obtê-la gratuitamente aqui.
Dando vida ao seu bot do Telegram
Para criar um chatbot no Telegram, você precisa entrar em contato com o BotFather, que é essencialmente um bot usado para criar outros bots.
O comando que você precisa é /newbot
que leva às seguintes etapas para criar seu bot:
Seu bot deve ter dois atributos: um nome e um nome de usuário. O nome aparecerá para o seu bot, enquanto o nome de usuário será usado para menções e compartilhamento.
Depois de escolher o nome do seu bot e nome de usuário - que deve terminar com "bot" - você receberá uma mensagem contendo seu token de acesso e obviamente precisará salvar seu token de acesso e nome de usuário para mais tarde, pois precisará deles.
Codifique a lógica do chatbot
Nós estaremos usando o Ubuntu neste tutorial. Para usuários do Windows, a maioria dos comandos aqui funcionará sem problemas, mas se você enfrentar algum problema com a configuração do ambiente virtual, consulte este link. Quanto aos usuários de Mac, este tutorial deve funcionar bem.
Primeiro, vamos criar um ambiente virtual. Ele ajuda a isolar os requisitos do seu projeto do ambiente global do Python.
$ python -m venv botenv/
Agora teremos um diretório botenv/
que conterá todas as bibliotecas Python que usaremos. Vá em frente e ative o virtualenv
usando o seguinte comando:
$ source botenv/bin/activate
As bibliotecas que precisamos para o nosso bot são:
- Flask: Um micro framework web construído em Python.
- Python-telegram-bot: Um wrapper do Telegram em Python.
- Solicitações: Uma biblioteca http popular do Python.
Você pode instalá-los no ambiente virtual usando o comando pip da seguinte forma:
(telebot) $ pip install flask (telebot) $ pip install python-telegram-bot (telebot) $ pip install requests
Agora vamos navegar em nosso diretório de projetos.
. ├── app.py ├── telebot │ ├── credentials.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv
No arquivo credentials.py
precisaremos de três variáveis:
bot_token = "here goes your access token from BotFather" bot_user_name = "the username you entered" URL = "the heroku app link that we will create later"
Agora vamos voltar ao nosso app.py e percorrer o código passo a passo:
# import everything from flask import Flask, request import telegram from telebot.credentials import bot_token, bot_user_name,URL
global bot global TOKEN TOKEN = bot_token bot = telegram.Bot(token=TOKEN)
Agora temos o objeto bot que será usado para qualquer ação que exigimos que o bot execute.
# start the flask app app = Flask(__name__)
Também precisamos vincular funções a rotas específicas. Em outras palavras, precisamos dizer ao Flask o que fazer quando um endereço específico é chamado. Informações mais detalhadas sobre Flask e rotas podem ser encontradas aqui.
Em nosso exemplo, a função de rota responde a uma URL que é basicamente /{token}
, e esta é a URL que o Telegram chamará para obter respostas para mensagens enviadas ao bot.
@app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id) return 'ok'
A maneira intuitiva de fazer essa função funcionar é que a chamaremos a cada segundo, para que ela verifique se uma nova mensagem chegou, mas não faremos isso. Em vez disso, usaremos o Webhook, que nos fornece uma maneira de permitir que o bot chame nosso servidor sempre que uma mensagem for chamada, para que não precisemos fazer nosso servidor sofrer em um loop while esperando uma mensagem chegar.
Então, vamos fazer uma função que nós mesmos precisamos chamar para ativar o Webhook do Telegram, basicamente dizendo ao Telegram para chamar um link específico quando uma nova mensagem chegar. Chamaremos essa função apenas uma vez, quando criarmos o bot pela primeira vez. Se você alterar o link do aplicativo, precisará executar essa função novamente com o novo link que possui.
A rota aqui pode ser qualquer coisa; você é quem vai chamá-lo:
@app.route('/setwebhook', methods=['GET', 'POST']) def set_webhook(): # we use the bot object to link the bot to our app which live # in the link provided by URL s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) # something to let us know things work if s: return "webhook setup ok" else: return "webhook setup failed"
Agora que tudo está definido, vamos apenas criar uma página inicial sofisticada para que saibamos que o mecanismo está funcionando.
@app.route('/') def index(): return '.' if __name__ == '__main__': # note the threaded arg which allow # your app to have more than one thread app.run(threaded=True)
Vamos dar uma olhada na versão completa do app.py:
import re from flask import Flask, request import telegram from telebot.credentials import bot_token, bot_user_name,URL global bot global TOKEN TOKEN = bot_token bot = telegram.Bot(token=TOKEN) app = Flask(__name__) @app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id) return 'ok' @app.route('/set_webhook', methods=['GET', 'POST']) def set_webhook(): s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) if s: return "webhook setup ok" else: return "webhook setup failed" @app.route('/') def index(): return '.' if __name__ == '__main__': app.run(threaded=True)
Esse é o último pedaço de código que você escreverá em nosso tutorial. Agora podemos avançar para a última etapa, lançando nosso aplicativo no Heroku.

Inicie nosso aplicativo no Heroku
Precisamos de algumas coisas antes de fazer nosso aplicativo.
O Heroku não pode saber quais bibliotecas seu projeto usa, então temos que informar usando o arquivo requirements.txt
—um problema comum é que você digita os requisitos errado, então tenha cuidado—para gerar o arquivo de requisitos usando pip:
pip freeze > requirements.txt
Agora você tem seu arquivo de requisitos pronto.
Agora você precisa do Procfile
que informa ao Heroku onde nosso aplicativo é iniciado, então crie um arquivo Procfile
e adicione o seguinte:
web: gunicorn app:app
Uma etapa de rejeição: você pode adicionar um arquivo .gitignore
ao seu projeto para que os arquivos inúteis não sejam carregados no repositório.
No painel do Heroku, crie um novo aplicativo. Depois de fazer isso, ele o direcionará para a página Deploy . Em seguida, abra a guia Configurações em uma nova janela e copie o domínio do aplicativo que será algo como https://appname.herokuapp.com/
e cole-o na variável URL dentro de credentials.py
.
Agora, volte para a guia Deploy e prossiga com as etapas:
Observação: os usuários do Windows e do macOS podem seguir as etapas descritas aqui.
Faça login no Heroku:
$ heroku login
Observe que esse método às vezes fica travado waiting for login
, se isso acontecer com você, tente fazer login usando:
$ heroku login -i
Inicialize um repositório Git em nosso diretório:
$ git init $ heroku git:remote -a {heroku-project-name}
Implante o aplicativo:
$ git add . $ git commit -m "first commit" $ git push heroku master
Neste ponto, você verá o progresso da construção em seu terminal. Se tudo deu certo, você verá algo assim:
remote: -----> Launching... remote: Released v6 remote: https://project-name.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done.
Agora vá para a página do aplicativo (o link do domínio que você copiou antes) e adicione ao final do link /setwebhook
para que o endereço seja algo como https://appname.herokuapp.com/setwebhook
. Se você webhook setup ok
, isso significa que você está pronto para começar!
Agora vá falar com seu bot
Toques finais, dicas e truques
Agora você tem seu bot Telegram em funcionamento, 24 horas por dia, 7 dias por semana, sem a necessidade de sua intervenção. Você pode adicionar qualquer lógica que desejar ao bot, então, por exemplo, você pode tornar seu bot mais realista adicionando um status de “digitação” e enviando um status de foto da seguinte forma:
O próximo trecho de código da função respond()
:
if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendChatAction(chat_id=chat_id, action="typing") sleep(1.5) bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendChatAction(chat_id=chat_id, action="upload_photo") sleep(2) bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)
Como você pode ver no snippet, adicionamos uma ação de digitação quando estamos prestes a enviar as informações sobre o bot que está em formato de texto e adicionamos uma ação de upload de foto quando estamos prestes a enviar uma foto para tornar o bot mais realista . Mais ações podem ser encontradas aqui.
Você também pode alterar a imagem e a descrição do bot no canal BotFather para torná-lo mais amigável.
Muitos exemplos mais simples de bots de telegrama podem ser encontrados na página python-telegram-bot no GitHub.
Você pode desenvolver nosso bot e torná-lo o próximo super bot de IA – tudo o que você precisa fazer é integrar sua lógica na função respond()
. Por exemplo, sua lógica pode estar em um módulo separado e pode ser chamada dentro da função respond()
assim:
. ├── app.py ├── telebot │ ├── credentials.py │ ├──ai.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv
E dentro de ai .py :
def generate_smart_reply(text): # here we can do all our work return "this is a smart reply from the ai!"
Importe-o agora no app .py :
import re from time import sleep from flask import Flask, request import telegram From telebot.ai import generate_smart_reply from telebot.credentials import bot_token, bot_user_name,URL
Em seguida, basta chamá-lo dentro do código respond()
.
def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # here call your smart reply message reply = generate_smart_reply(text) bot.sendMessage(chat_id=chat_id, text=reply, reply_to_message_id=msg_id)
Agora você pode fazer com que seu bot funcione da maneira que quiser - vá em frente e crie a próxima grande novidade!
Espero que você tenha se divertido construindo seu primeiro bot do Telegram.
Recursos adicionais
- Construindo um Chatbot usando Telegram e Python
- Configurando seu Telegram Bot WebHook da maneira mais fácil
- Repositório Python-telegram-bot
- Implantando com Git no Heroku
- Documentação do Python Telegram Bot