Como enviar imágenes por Telegram con tu bot.

Este es uno de los capítulos del tutorial Exprimiendo Telegram. Crea tu propio bot para Telegram.. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

En el artículo anterior sobre tu primer bot de Telegram vimos como crear un sencillo bot para que nos enviara mensajes en determinados momentos. Para ello, incluimos además dos servicios, que nos avisa cuando iniciamos nuestro equipo o cuando lo apagamos. En este segundo caso, tiene que ser un apagado programado, es decir, si perdemos el suministro eléctrico, evidentemente, el bot no nos va a avisar. Hasta el momento solo hemos mandado mensajes de texto. Eso sí, mas o menos elaborados, porque podíamos enviar el texto en formato HTML, pero mensajes de texto al fin y al cabo. En el artículo de hoy, vamos a ir un paso mas allá vamos a enviar imágenes por Telegram utilizando nuestro bot. Iremos más allá, empezaremos por enviar imágenes, pasando por audios y vídeo, para terminar por enviar cualquier tipo de archivo.

Exprimiendo Telegram. Como enviar imágenes por Telegram con tu bot. Portada.

Enviar imágenes por Telegram (y otras cosas)

Antes de continuar, recordar que existe un repositorio en GitHub actualizado con el código que hemos desarrollado para senderbot. Además está disponible vía repositorio en Launchpad con lo que su instalación es realmente muy sencilla. Para evitar problemas, voy a mantener la compatibilidad siempre con versiones anteriores en Launchpad, mientras que en GitHub, cada artículo representará una rama.

Todo esto, salvo en el caso de que no pueda mantener la compatibilidad, en cuyo caso crearé un nuevo bot que cumpla con nuestras necesidades.

Comenzamos por enviar imágenes por Telegram

Como he comentado en la introducción, en este artículo vamos a extender el bot que hicimos en el artículo anterior, que solo enviaba mensajes para que envíe otro tipo de documentos. En principio comenzaremos por enviar imágenes por Telegram, para luego ir extendiéndolo a otro tipo de archivos.

Para enviar una imagen tan solo debemos añadir el siguiente código a nuestro bot,

def send_image(self, file_image):
    if os.path.exists(file_image):
        super(SenderBot, self).sendPhoto(chat_id=self.channel_id,
                                         photo=open(file_image, 'rb'))

Una vez definida la función send_image, lo primero que hacemos en comprobar que el archivo que queremos enviar, existe y a continuación utilizando el método implementado en la API, realizamos el resto del trabajo.

Enviar archivos de audio

Telegram distingue entre archivos de audio y archivos de voz, y solo lo hace en función del tipo de archivo que le enviamos. Además limita el archivo de audio a 50 MB. En caso de que supere esta cantidad, se envía como un archivo normal. El método que he implementado a nuestra clase para enviar archivos de audio es el siguiente,

def send_audio(self, file_audio):
    if os.path.exists(file_audio):
        extension = os.path.splitext(file_audio)[1][1:].strip().lower()
        if extension == 'ogg':
            super(SenderBot, self).sendVoice(chat_id=self.channel_id,
                                             voice=open(file_audio, 'rb'))
        elif extension == 'mp3':
            super(SenderBot, self).sendAudio(chat_id=self.channel_id,
                                             audio=open(file_audio, 'rb'))

Como ves en la tercera línea, y una vez comprobado que el archivo de audio existe, obtenemos la extensión en minúsculas, y en función del tipo de archivo utilizo un método del robot del que heredamos u otro. Pero, básicamente, el funcionamiento es exactamente igual que en el caso de enviar una imagen.

Enviar cualquier tipo de archivo

Para implementar este método, seguimos los mismos pasos que hemos realizado para el de subir una imagen. Es decir, comprobaremos que el archivo existe y luego procedemos a enviarlo. El código correspondiente a este método es el siguiente,

def send_document(self, file_document):
    if os.path.exists(file_document):
        super(SenderBot, self).sendDocument(chat_id=self.channel_id,
                                            document=open(file_document,
                                                          'rb'),
                                            timeout=999)

Como ves he añadido un parámetro adicional, que en otros casos no he añadido, aunque deberías tenerlo en cuenta si los archivos que vas a enviar son muy pesados. Se trata del parámetro timeout, que viene definido en segundos, y por defecto es de 20 segundos. Si el archivo es muy grande es probable que tengamos que incrementar este valor.

Además del parámetro timeout, es posible definir otros parámetros que dependiendo de la funcionalidad que le vas a dar a tu bot puede ser mas o menos interesante. Si quieres una definición completa de todos los parámetros, te recomiendo que consultes la documentación de python-telegram-bot.

Algunos de estos parámetros son,

  • caption, que representa al título del documento, imagen o audio, y que puede tener hasta 200 caracteres.
  • disable_notification, que permite enviar el mensaje sin que aparezca una notificación.
  • reply_to_message_id, permite responder a un mensaje concreto. Esto ahora mismo, con nuestro sencillo bot, no tiene mucha utilidad, pero en próximas versiones del mismo, veremos que se le puede exprimir considerablemente.

Existen otros parámetros pero no son generales como esto, sino que se aplican a cada tipo de mensaje. Es decir, un mensaje de audio, además le podemos añadir el título de la pista, la duración, el nombre del artista, etc. Y de la misma forma con otros tipos de mensaje como vídeo.

Enviar mas cosas

Por ahora con esto ya tenemos mas que suficiente para empezar a trabajar. Tal y como he comentado anteriormente, si quiere ver como enviar vídeo, notas de vídeo, pagatinas (stickers), etc., lo mejor es que recurras a la documentación de python-telegram-bot.

Recibir

Otra opción interesante que podemos querer que haga nuestro bot es recuperar todos los archivos que nosotros hemos enviado al bot. Es decir, por ejemplo, podemos querer guardar todas nuestras fotos enviándolas a nuestro bot. Una están en el canal de nuestro bot, podemos querer recuperarlas.

Así para recuperar todas las imágenes que le hemos enviado a nuestro bot, tenemos que añadir el siguiente código,

def get_images(self):
    updates = super(SenderBot, self).get_updates()
    for index, update in enumerate(updates):
        if update.message.photo:
            file_id = update.message.photo[-1].file_id
            afile = self.get_file(file_id)
            afile.download()

En la segunda línea obtenemos todas las actualizaciones que han llegado al canal, get_updates(). Sin embargo, no obtendremos las que el bot ha enviado, solamente las ajenas al bot. Esto es importante para no llevarnos a engaños.

Si te fijas en la quinta línea, verás que el mensaje contiene varias imágenes. De la forma indicada, elegiremos la última imagen de la lista que se corresponde con la de mayor tamaño, que se corresponderá con la imagen original. Una vez tenemos seleccionado el identificador del fichero lo descargamos.

senderbot actualizado para enviar imágenes por Telegram sin escribir código

Si no te interesa saber el funcionamiento del bot, y solo quieres utilizarlo para enviar imágenes por Telegram y otro tipo  de archivos, puedes añadir el repositorio de Launchpad e instalarlo fácilmente. Tan solo tienes que ejecutar las siguientes líneas de código,

sudo add-apt-repository ppa:atareao/telegram
sudo apt update
sudo apt install senderbot

Una vez instalado, podemos ejecutarlo para ver la ayuda que nos muestra el funcionamiento del mismo con tan solo ejecutar,

senderbot -h

Esto nos arrojará el siguiente resultado,

Usage: senderbot [options] arg

Options:
  -h, --help            show this help message and exit
  -a AUDIO_FILE, --audio_file=AUDIO_FILE
                        send an audio to the channel
  -c CHANNEL_ID, --set-channel-id=CHANNEL_ID
                        set channel id where bot will send messages
  -d DOCUMENT_FILE, --document_file=DOCUMENT_FILE
                        send a document to the channel
  -g, --get-images      get all images from chat_id
  -i IMAGE_FILE, --image_file=IMAGE_FILE
                        send a image to the channel
  -m MESSAGE, --message=MESSAGE
                        send a message to the channel
  -p, --print-config    Print configuration
  -t TOKEN, --set-token=TOKEN
                        set the TOKEN of the bot

Comento solo las nuevas opciones, el resto las puedes ver en el artículo anterior.

  • -a nos permite subir un archivo de audio
  • -i nos permite subir una imagen
  • -d nos permite subir cualquier tipo de archivo
  • -g descarga todas las imágenes que nosotros le hemos enviado al bot

Conclusiones

Como has visto es realmente sencillo implementar nuevas funcionalidades a nuestro bot para enviar imágenes por Telegram, enviar otro tipo de archivos e incluso descargar archivos del canal. Faltarían algunas, pero con las indicaciones que he dado, si las necesitas las puedes implementar tu mismo. De cualquier forma, si ves que no te aclaras, tienes alguna duda, o algo no te termina de funcionar, no dudes en ponerte en contacto conmigo a través del formulario de contacto.

Hasta el momento nuestro bot solo funciona cuando lo iniciamos. Sería interesante que estuviera siempre en funcionamiento y atento a nuestras acciones. Esto es lo que haremos en el próximo artículo. Crearemos un bot interactivo que responda a nuestras acciones. Por ejemplo, si tenemos nuestro bot corriendo en la Raspberry Pi o en nuestro equipo, y queremos saber la temperatura de la CPU, lo mejor es que se lo preguntemos al bot para que nos lo diga, de esta manera interactuaremos con el bot.