Aprenda a construir su primer bot en Telegram con Python

Imagina esto, hay un bot de mensajes que te enviará una imagen de perro lindo al azar cuando quieras, suena bien, ¿verdad? ¡Hagamos uno!

Para este tutorial, usaremos Python 3, python-telegram-bot y la API pública RandomDog .

Al final de este tutorial, tendrás un bot para aliviar el estrés que te enviará imágenes de perros lindos cada vez que lo necesites, ¡yay!

Empezando

Antes de comenzar a escribir el programa, necesitamos generar un token para nuestro bot. El token es necesario para acceder a la API de Telegram e instalar las dependencias necesarias.

1. Crea un nuevo bot en BotFather

Si desea crear un bot en Telegram, primero debe "registrar" su bot antes de usarlo. Cuando “registramos” nuestro bot, obtendremos el token para acceder a la API de Telegram.

Vaya al BotFather (si lo abre en el escritorio, asegúrese de tener la aplicación Telegram), luego cree un nuevo bot enviando el /newbotcomando. Siga los pasos hasta que obtenga el nombre de usuario y el token de su bot. Puede ir a su bot accediendo a esta URL: //telegram.me/YOUR_BOT_USERNAME y su token debería verse así.

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

2. Instale la biblioteca

Dado que vamos a usar una biblioteca para este tutorial, instálela usando este comando.

pip3 install python-telegram-bot

Si la biblioteca se instaló correctamente, estamos listos para comenzar.

Escribe el programa

Hagamos nuestro primer bot. Este bot debería devolver una imagen de perro cuando enviamos el /bopcomando. Para poder hacer esto, podemos usar la API pública de RandomDogpara ayudarnos a generar imágenes de perros al azar.

El flujo de trabajo de nuestro bot es tan simple como esto:

acceder a la API -> obtener la URL de la imagen -> enviar la imagen

1. Importa las bibliotecas

Primero, importe todas las bibliotecas que necesitemos.

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

2. Accede a la API y obtén la URL de la imagen.

Creemos una función para obtener la URL. Usando la biblioteca de solicitudes, podemos acceder a la API y obtener los datos json.

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

Puede verificar los datos json accediendo a esa URL: //random.dog/woof.jsonen su navegador. Verá algo como esto en su pantalla:

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

Obtén la URL de la imagen ya que necesitamos ese parámetro para poder enviar la imagen.

image_url = contents['url']

Envuelva este código en una función llamada get_url().

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

3. Envía la imagen

Para enviar un mensaje / imagen, necesitamos dos parámetros, la URL de la imagen y el ID del destinatario; puede ser el ID de grupo o el ID de usuario.

Podemos obtener la URL de la imagen llamando a nuestra get_url()función.

url = get_url()

Obtenga la identificación del destinatario con este código:

chat_id = update.message.chat_id

Una vez que obtengamos la URL de la imagen y la identificación del destinatario, es hora de enviar el mensaje, que es una imagen.

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

Envuelva ese código en una función llamada bopy asegúrese de que su código se vea así:

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

4. Main program

Por último, cree otra función llamada mainpara ejecutar nuestro programa. No olvide cambiarYOUR_TOKEN con el token que generamos anteriormente en este tutorial.

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

Al final, su código debería verse así:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler import requests import re def get_url(): contents = requests.get('//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('YOUR_TOKEN') dp = updater.dispatcher dp.add_handler(CommandHandler('bop',bop)) updater.start_polling() updater.idle() if __name__ == '__main__': main()

5. Ejecute el programa

¡Increíble! Terminaste tu primer programa. Ahora veamos si funciona. Guarde el archivo, asígnele un nombre main.pyy ejecútelo con este comando.

python3 main.py

Vaya a su bot telegrama al acceder a este URL: //telegram.me/YOUR_BOT_USERNAME. Envíe el /bopcomando. Si todo funciona perfectamente, el bot responderá con una imagen de perro aleatoria. ¿Hermoso, verdad?

Manejo de errores

Great! Now you have a bot that will send you a cute dog image whenever you want.

There is more! The RandomDogAPI not only generates images, but also videos and GIFs. If we access the API and we get a video or GIF, there is an error and the bot won’t send it to you.

Let’s fix this so the bot will only send a message with an image attachment. If we get a video or GIF then we will call the API again until we get an image.

1. Match the file extension using regex

We are going to use a regex to solve this problem.

To distinguish an image from video or GIF, we can take a look at the file extension. We only need the last part of our URL.

//random.dog/*****.JPG

We need to define, first, what file extensions are allowed in our program.

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

Then use the regex to extract the file extension from the URL.

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

Using that code, make a function called get_image_url() to iterate the URL until we get the file extension that we want (jpg,jpeg,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. Modify your code

Great! Now for the last part, replace the url = get_url() line in the bop() function with url = get_image_url() , and your code should look like this:

from telegram.ext import Updater, InlineQueryHandler, CommandHandler import requests import re def get_url(): contents = requests.get('//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('YOUR_TOKEN') dp = updater.dispatcher dp.add_handler(CommandHandler('bop',bop)) updater.start_polling() updater.idle() if __name__ == '__main__': main()

Nice! Everything should run perfectly. You can also check out my GitHub account to get the code.

Finally, congratulations for finishing this tutorial, plus you have a cool Telegram bot now.

Please leave a comment if you think there are any errors in my code or writing, because I’m still learning and I want to get better.

Thank you and good luck practicing! :)