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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
import os
from telegram.ext import Updater, CommandHandler


def hello_world(update, context):
    update.message.reply_text(
        "Olá Mundo! Sou o novo bot."
    )


def main():
    token = os.getenv('TELEGRAM_TOKEN')
    updater = Updater(token=token)
    dispatcher = updater.dispatcher
    dispatcher.add_handler(CommandHandler('start', hello_world));

    updater.start_polling()


if __name__ == '__main__':
    main()

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:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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.