Alguns anos atrás fiz um bot no Telegram e me surpreendi como é simples e rápido fazer utilizando Python. O Telegram fornece uma API para seus bots e há varias bibliotecas em diversas linguagens para interagir de maneira simples com esta API. A primeira coisa que precisamos fazer é acessar o @BotFather e solicitar a criação de um novo bot.

Após seguirmos as instruções e configurarmos o nosso bot receberemos um token que será utilizado por nós mais a frente.
Para interagirmos com a API de bots do Telegram usaremos a biblioteca python-telegram-bot. Após instalar a biblioteca podemos fazer um simples script que é equivalente ao “Hello World!” dos bots do Telegram:
| |
O script é simples, lemos o token de uma variável de ambiente (você também poderia colocar direto no código, mas não recomendo fazer isso) e criamos os objetos do Telegram para subir o nosso bot. Na linha 15 fazemos o registro da função que irá responder um comando ao bot, nossa função é bem simples e apenas faz o envio de uma mensagem de texto. Após a configuração do bot iniciamos o polling, ou seja, o script fica ouvindo se há mensagens novas para responder. Assim entramos em nosso bot, enviamos o start e já recebemos a mensagem:

Como podemos ver acima, recebemos o retorno conforme esperado. Como o handler é uma simples função Python nós podemos agora fazer algo mais complexo. Vamos expandir criando um novo handler para buscar o nome da rua dado um determinado CEP, utilizando a biblioteca requests que já utilizamos antes em outros posts:
import os
from telegram.ext import Updater, CommandHandler
import requests
def hello_world(update, context):
update.message.reply_text(
"Olá Mundo! Sou o novo bot."
)
def busca_cep(update, context):
zipcode=context.args[0]
update.message.reply_text(f'Buscando endereço do CEP {zipcode}')
try:
response = requests.get(
url=f'https://viacep.com.br/ws/{zipcode}/json'
)
response.raise_for_status()
message = [
f'{k}: {v}\n'
for k, v in response.json().items()
]
update.message.reply_text(''.join(message))
except Exception as exc:
update.message.reply_text(f'Problemas ao buscar endereço do CEP {zipcode}')
def main():
token = os.getenv('TELEGRAM_TOKEN')
updater = Updater(token=token)
dispatcher = updater.dispatcher
dispatcher.add_handler(CommandHandler('start', hello_world));
dispatcher.add_handler(CommandHandler('cep', busca_cep, pass_args=True));
updater.start_polling()
if __name__ == '__main__':
main()
Para usar a nova funcionalidade do bot basta enviar o comando /cep CEP e ele irá retornar o CEP buscado na API do ViaCEP.

No manual da biblioteca e também no BotFather é possível encontrar muitos outros recursos que podem ser definidos para o bot, vale apena a leitura caso esteja pensando em fazer algo mais avançado.