cURL y Telegram - sendMediaGroup para enviar varias fotos

Enviar foto a Telegram usando cURL y Bot

Siguiendo con los tutoriales que consumen la API de los Bots de Telegram con cURL vamos a ver cómo enviar una foto usando únicamente la línea de comandos con cURL.

Además de enviar la foto a cualquier usuario de Telegram también vamos a enviar la descripción de la foto con Mardown; todo esto usando solo la terminal y la API de Telegram.

Este tutorial funciona perfectamente tanto en Linux como en Windows.

Especificación de la API de Telegram

Entonces para comunicarte con un usuario de Telegram como si fueras un bot desde la terminal, y enviar una foto, debes hacer una petición a:

https://api.telegram.org/botTOKEN/sendPhoto

Por ejemplo, si tu bot tiene el token 123:asd la URL sería:

https://api.telegram.org/bot123:asd/sendPhoto

Como ahora vamos a enviar un archivo, no vamos a usar JSON, en su lugar enviaremos los datos codificados como formulario en formato de clave=valor, ya sea el archivo binario o los otros datos como el id de chat o caption.

Vas a encontrar más detalles sobre sendPhoto en https://core.telegram.org/bots/api#sendphoto

Token e id

En este post asumo que ya tienes tu token del Bot, mismo que el BotFather te debió brindar. Si no, solo habla con él en https://t.me/botfather y crea un nuevo Bot para obtener tu token.

También estoy suponiendo que ya conoces el id de chat, grupo o canal. Si no lo tienes puedes obtener el id de usuario reenviando un mensaje al Bot https://t.me/get_id_bot o https://t.me/JsonDumpBot (no estoy afiliado ni tengo relación con ellos) y estoy seguro de que debe haber distintas maneras de obtenerlo

Sintaxis para enviar foto a Telegram desde cURL

Entonces, para enviar la foto usando un Bot, ejecutamos lo siguiente:

curl -F "chat_id=el id del chat" -F "caption=descripción de la foto" -F "photo=@ubicación de la foto.extensión" "https://api.telegram.org/botTOKEN/sendPhoto"

Estamos usando -F varias veces para especificar la clave y valor. El chat_id es obligatorio, el caption es opcional y sirve para enviar una descripción de dicha foto.

El verdadero envío de la foto está ocurriendo al enviar la clave photo (esta no se puede cambiar) indicando la ruta después de un @, este @ es obligatorio (propio de cURL) y la ruta puede ser relativa o absoluta.

Enviar foto con Bot de Telegram usando cURL

Por ejemplo, si mi id de chat es 123, mi token es ASD y quiero enviar la foto parzibyte.png que se encuentra en la misma ubicación donde estoy ejecutando el comando, ejecutaría:

curl -F "chat_id=123" -F "caption=Parzibyte" -F "photo=@parzibyte.png" "https://api.telegram.org/botASD/sendPhoto"

Como se ve en la siguiente imagen:

Enviar foto con cURL y Bot de Telegram
Enviar foto con cURL y Bot de Telegram

Bonus 1: Markdown

Al estar haciendo pruebas quise saber si podía formatear la descripción de la foto con MarkdownV2 y es totalmente posible:

curl -F "parse_mode=MarkdownV2" -F "chat_id=id" -F "caption=Hola mundo puedo llevar espacios y no sé si también *markdown*" -F "photo=@parzibyte.png" "https://api.telegram.org/botTOKEN/sendPhoto"

Bonus 2: enviar varias fotos

Para subir varias fotos a Telegram debemos invocar a sendMediaGroup en lugar de sendPhoto. El parámetro media es obligatorio y debe ser un arreglo JSON codificado como cadena. Cada propiedad del arreglo debe tener el type en photo y el media en attach://clave_usada_al_subir_archivo

Por ejemplo, en en el siguiente comando estoy enviando photo1 y photo2, estos nombres los he pensado yo, podrían ser mi_foto_1 o mi_foto_unica, siempre y cuando el nombre no se repita ni sea un parámetro de Telegram. Esos mismos nombres deben ser especificados al momento de enviar los archivos con @.

curl -F "media=[{\"type\":\"photo\",\"media\":\"attach://photo1\"},{\"type\":\"photo\",\"media\":\"attach://photo2\"}]" -F "chat_id=el id de chat" -F "photo1=@parzibyte.png" -F "photo2=@Tortuga.jpg" "https://api.telegram.org/botTOKEN/sendMediaGroup"

Fíjate en que estoy especificando 2 fotos (pueden ser hasta 10). Indico la primera con attach://photo1 y luego la envío con -F "photo1=@parzibyte.png". Para la segunda indico attach://photo2 y la subo con -F "photo2=@Tortuga.jpg".

El resultado es el siguiente:

cURL y Telegram - sendMediaGroup para enviar varias fotos
cURL y Telegram – sendMediaGroup para enviar varias fotos

Ahora las fotos son un álbum. Me parece que se respeta el orden del arreglo codificado como JSON. Imagino que se pueden enviar fotos y vídeos cambiando el type del media.

Los detalles de sendMediaGroup están en https://core.telegram.org/bots/api#sendmediagroup y el formato de archivos lo encontré en https://core.telegram.org/bots/api#inputmediaphoto.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

No te pierdas ninguno de mis posts

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario