Bot de Telegram

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

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

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.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.