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 é?
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! 😀