Artigo original: Learn to build your first bot in Telegram with Python

Imagine ter um bot de mensagens que enviará uma imagem aleatória com um cachorro fofo sempre que você quiser. Parece legal, certo? Vamos fazer um bot desses!

Para este tutorial, vamos usar o Python 3, a biblioteca python-telegram-bot e a API pública RandomDog.

Ao final deste tutorial, você terá um bot para aliviar o estresse e que enviará imagens fofas de cachorros sempre que você precisar. 😀

Começando

Antes de começarmos a escrever o programa, precisamos gerar um token para nosso bot. O token é necessário para acessar a API do Telegram e instalar as dependências necessárias.

1. Crie um bot no BotFather

Se você quiser criar um bot no Telegram, primeiro precisa "registrar" seu bot antes de usá-lo. Ao "registrarmos" nosso bot, obteremos o token para acessar a API do Telegram.

Acesse o BotFather (se for abrir na área de trabalho, certifique-se de que possui o aplicativo do Telegram). Então, crie um bot enviando o comando /newbot. Siga as etapas até obter o nome de usuário e o token para seu bot. Você pode acessar seu bot por meio deste URL: https://telegram.me/NOME_DE_USUARIO_DO_SEU_BOT e seu token deve ter esta aparência:

704418931:AAEtcZ*************

2. Instale a biblioteca

Como vamos usar uma biblioteca para este tutorial, instale-a usando este comando:

pip3 install python-telegram-bot

Se a biblioteca for instalada com sucesso, estamos prontos.

Escreva o programa

Vamos fazer nosso primeiro bot. Ele deve retornar uma imagem de cachorro quando enviarmos o comando /bop. Para conseguirmos fazer isso, podemos usar a API pública do RandomDog para nos ajudar a gerar imagens aleatórias de cães.

O fluxo de trabalho do nosso bot é simples assim:

acesse a API -> obtenha o URL da imagem -> envie a imagem

1. Importe as bibliotecas

Primeiro, importamos todas as bibliotecas que precisaremos.

from telegram.ext import Updater, CommandHandler
import requests
import re

2. Acesse a API e obtenha o URL da imagem

Vamos criar uma função para obter o URL. Usando a biblioteca requests, podemos acessar a API e obter os dados em json.

contents = requests.get('https://random.dog/woof.json').json()

Você pode conferir os dados json acessando, pelo seu navegador, este URL: https://random.dog/woof.json. Você verá algo assim em sua tela:

{“url":"https://random.dog/*****.JPG"}

Obtenha o URL da imagem, pois precisamos desse parâmetro para conseguir enviar a imagem.

image_url = contents['url']

Envolva o código em uma função chamada get_url() .

def get_url():
    contents = requests.get('https://random.dog/woof.json').json()    
    url = contents['url']
    return url

3. Envie a imagem

Para enviar uma mensagem/imagem, precisamos de dois parâmetros, o URL da imagem e o ID do destinatário – pode ser o ID de um grupo ou o ID de um usuário.

Podemos obter o URL da imagem chamando nossa função get_url().

url = get_url()

Obtenha o ID do destinatário usando este código:

chat_id = update.message.chat_id

Após conseguirmos o URL da imagem e o ID do destinatário, é hora de enviar a mensagem, que é uma imagem.

bot.send_photo(chat_id=chat_id, photo=url)

Envolva o código em uma função chamada bop e certifique-se de que seu código se pareça com isso:

def bop(bot, update):
    url = get_url()
    chat_id = update.message.chat_id
    bot.send_photo(chat_id=chat_id, photo=url)

4. Programa principal (main)

Por fim, crie outra função chamada main para executar nosso programa. Não se esqueça de alterar SEU_TOKEN pelo token que geramos anteriormente neste tutorial.

def main():
    updater = Updater('SEU_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('bop',bop))
    updater.start_polling()
    updater.idle()
    
if __name__ == '__main__':
    main()

Ao final, seu código deve ficar assim:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler
import requests
import re

def get_url():
    contents = requests.get('https://random.dog/woof.json').json()    
    url = contents['url']
    return url

def bop(bot, update):
    url = get_url()
    chat_id = update.message.chat_id
    bot.send_photo(chat_id=chat_id, photo=url)

def main():
    updater = Updater('SEU_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('bop',bop))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

5. Execute o programa

Incrível! Você terminou seu primeiro programa. Agora, vamos conferir se funciona. Salve o arquivo, chame-o de main.py e execute-o usando este comando:

python3 main.py

Vá até seu bot do telegram acessando este URL: https://telegram.me/NOME_DE_USUARIO_DO_SEU_BOT.

Envie o comando /bop. Se tudo funcionar perfeitamente, o bot responderá com uma imagem de cachorro aleatória. Fofo, não é?

cgojJGcVwIVamFkYrpcRzrOOBJ0xFB0cTkTP
Uma imagem gerada aleatoriamente

Tratamento de erros

Ótimo! Agora, você tem um bot que enviará uma imagem fofa de cachorro sempre que quiser.

Tem mais! A API RandomDog não gera apenas imagens, mas também vídeos e GIFs. Se acessarmos a API e obtivermos um vídeo ou GIF, haverá um erro e o bot não enviará a mensagem para você.

Vamos corrigir isso para que o bot envie apenas uma mensagem com um anexo de imagem. Se obtivermos um vídeo ou GIF, chamaremos a API novamente até obtermos uma imagem.

1. Encontre a correspondência da extensão do arquivo usando expressões regulares

Vamos usar uma expressão regular, ou regex, para resolver esse problema.

Para distinguir uma imagem de um vídeo ou GIF, podemos dar uma olhada na extensão do arquivo. Precisamos somente da última parte do nosso URL.

https://random.dog/*****.JPG

Precisamos definir, primeiro, quais extensões de arquivo são permitidas em nosso programa.

allowed_extension = ['jpg','jpeg','png']

Em seguida, usamos a regex para extrair a extensão do arquivo do URL.

file_extension = re.search("([^.]*)$",url).group(1).lower()

Usando este código, crie uma função chamada get_image_url() para iterar o URL até obter a extensão de arquivo que queremos (jpg, jpeg ou png):

def get_image_url():
    allowed_extension = ['jpg','jpeg','png']
    file_extension = ''
    while file_extension not in allowed_extension:
        url = get_url()
        file_extension = re.search("([^.]*)$",url).group(1).lower()
    return url

2. Modifique seu código

Ótimo! Agora, para a última parte, substitua a linha url = get_url() na função bop() por url = get_image_url() e seu código deve ficar assim:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler
import requests
import re

def get_url():
    contents = requests.get('https://random.dog/woof.json').json()    
    url = contents['url']
    return url

def get_image_url():
    allowed_extension = ['jpg','jpeg','png']
    file_extension = ''
    while file_extension not in allowed_extension:
        url = get_url()
        file_extension = re.search("([^.]*)$",url).group(1).lower()
    return url

def bop(bot, update):
    url = get_image_url()
    chat_id = update.message.chat_id
    bot.send_photo(chat_id=chat_id, photo=url)

def main():
    updater = Updater('SEU_TOKEN')
    dp = updater.dispatcher
    dp.add_handler(CommandHandler('bop',bop))
    updater.start_polling()
    updater.idle()

if __name__ == '__main__':
    main()

Legal! Tudo deve funcionar perfeitamente. Confira também a conta do GitHub do autor para obter o código.

Parabéns por terminar este tutorial. Você agora tem um bot legal para o Telegram.

Obrigado e boa sorte praticando! 😀