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