Anoche programé una pequeña implementación para descargar todas las imágenes de un canal de telegram, siempre que sea público. Para ejecutarlo es necesario tener instalado PHP (+ bash + curl + wget).

Aun cuando ya está funcional, le faltan algunos ajustes de comodidad, como que los archivos se descarguen en una carpeta determinada y no en la que se encuentren los scripts.

Programa en funcionamiento:

En versiones futuras:

  • haré que se descarguen también los GIF (que, en realidad, son archivos con extensión .mp4).
  • implementaré la recogida de datos a través de argumentos desde el prompt del comienzo (para no tener que estar dando los datos (tres datos) uno a uno).
  • los archivos tendrán nombres más cortos y que sean el número de publicación del canal, seguido de un dígito extra en caso de que se trate de un álbum con más de una imagen.

Descarga: dtc.7z (855B) * LEER MÁS ABAJO ANTES DE DESCARGAR

Funcionamiento

En telegram, cada post dentro de un canal o grupo público tiene un enlace propio que tiene el siguiente formato: t.me/[alias]/[id de mensaje]. La página que abre este link permite ver una vista previa del archivo complejo compuesto por varios marcos. El marco central muestra el contenido que tiene asociado el mensaje, sea texto, archivo, etc. Sólo las imágenes y gifs (que como decía más arriba, son mp4s) muestran el contenido original. La url de marco tiene este formato: t.me/[alias]/[id de mensaje]/embed=1. Esta última url es generada por tg.sh, que luego la envía a cURL. El resultado de curl es enviado al archivo ttt.php, que lee línea por línea buscando la que tenga el texto background-image:(. Cuando encuentra esa línea, por medio de un reemplazo utilizando expresiones regulares (gracias Alan, de @cuatrolibertadeschile) extrae la url del archivo y lo devuelve al output agregando al comienzo wget -q –show-progress. Este texto es recibido nuevamente por tg.sh y ejecutado directamente, haciendo que el archivo se descargue. Todo este proceso está dentro de un loop generado en tg.sh por medio de for, en torno a la variable $i creada para la ocasión, que rota, teniendo por valor inicial el entregado en init (al ejecutar tg.sh) hasta alcanzar el valor end (también entregado al ejecutar tg.sh), de este modo pueden descargarse las imágenes de cualquier intervalo de mensajes dentro de un canal o grupo.

Observaciones 1

El sistema funciona sin problemas para los canales en que no hay galerías. Cuando hay galerías funciona también, pero las imagenes se descargan más veces. Tengo pensada la forma para arreglarlo, pero estoy complicado de tiempo para hacerlo… así que no creo que lo haga en el corto plazo. Una solución (mediocre solución) para la descarga de imágenes de canales que tienen galerías es, una vez finalizada la descarga, utilizar algún programa que detecte y borre archivos duplicados. Es una pésima solución y casi me avergüenza sugerirla, pero funciona.

El problema: cada imagen dentro de cada galería tiene una ID propia, pero al abrirse en el navegador aparece la imagen que corresponde a la ID y todas las que están en la galería en que se encuentra entonces las imágenes se descargan tantas veces como imágenes hayan. Reemplazar los links no sirve porque telegram cambia los nombres de los archivos cada vez que se descargan.