Para poder descargar una imagen publicada en un canal de Telegram, necesito esta ruta:
var contents = JSON.parse(e.postData.contents); Logger.log(contents.channel_post.photo);Y la respuesta es:
[{ "file_id":"AAAAA", "file_size":11111, "width":253, "height":320 },{ "file_id":"BBBBB", "file_size":22222, "width":632, "height":800 },{ "file_id":"CCCCC", "file_size":44444, "width":1400, "height":1100 },{ "file_id":"DDDDD", "file_size":33333, "width":980, "height":750 }] El usuario @Newbie me dijo que usara Math.max(width, height) para poder definir cuál de los contenedores tiene la imagen de mayor calidad para poder definir en esta llamada qué file_id debo usar para descargar:
contents.channel_post.photo[CONTAINER NUMBER].file_id En este caso el contenedor sería el número 3 . Pero no pude trabajar con este Math.max , necesito ayuda para entender cómo debería ser mi código para hacer este trabajo.
Para recuperar una URL de imagen de un objeto de Message de Telegram Bot Api , deberá:
Message (desde cualquiera de las diversas API)photo de tipo PhotoSize[] documentado aquíPhotoSize (en su caso, el más grande) tiene file_idfile_id a getFile() documentado aquíFile documentado aquíhttps://api.telegram.org/file/bot<token>/<file_path>¿La calidad de la imagen no está ya determinada por la propiedad file_size ? Aparece a medida que aumenta la resolución ( width * height ), también lo hace el tamaño del file_size y, por lo tanto, también la calidad. Para esto, verifique mi primera solución anterior.
Si, por el contrario, desea encontrar la imagen de la más alta calidad basada en una proporción que compara width * height y file_size para encontrar el file_size promedio en bytes por píxel (no recomendado), consulte mi segunda solución a continuación:
Esta solución ordena la matriz de datos de imagen devuelta comparando su resolución ( width * height ) y luego toma la primera imagen (la más grande) de la matriz recién ordenada.
const contents = {}; contents.channel_post = {}; contents.channel_post.photo = [ { file_id: "AAAAA", file_size: 11111, width: 253, height: 320 }, { file_id: "BBBBB", file_size: 22222, width: 632, height: 800 }, { file_id: "CCCCC", file_size: 44444, width: 1400, height: 1100 }, { file_id: "DDDDD", file_size: 33333, width: 980, height: 750 } ]; const largestImage = contents.channel_post.photo.sort((a, b) => (b.width * b.height) - (a.width * a.height))[0]; console.log(`The largest image's file_id is ${largestImage.file_id}, which contains ${largestImage.width * largestImage.height} pixels (${largestImage.width}×${largestImage.height})`); Si está tratando específicamente de determinar la "calidad" real de la imagen independientemente de la resolución, lo más cercano que podría obtener con los datos proporcionados sería dividir el tamaño de file_size por el área total de píxeles para determinar el tamaño de file_size promedio en bytes por píxel.
Sin embargo, según esta lógica, la imagen de mayor calidad en realidad sería "AAAAA" , que dudo que sea lo que está buscando, por lo que probablemente debería usar la primera solución que proporcioné, que devuelve la imagen más grande.
Vale la pena señalar que debido a que los algoritmos de compresión de imágenes son bastante avanzados en estos días, usar una fórmula como esta para determinar la calidad por píxel es poco confiable, por lo que recomiendo usar la primera solución.
const contents = {}; contents.channel_post = {}; contents.channel_post.photo = [ { file_id: "AAAAA", file_size: 11111, width: 253, height: 320 }, { file_id: "BBBBB", file_size: 22222, width: 632, height: 800 }, { file_id: "CCCCC", file_size: 44444, width: 1400, height: 1100 }, { file_id: "DDDDD", file_size: 33333, width: 980, height: 750 } ]; const calcImageQuality = ({ file_size, width, height }) => file_size / (width * height); const highestQualityImage = contents.channel_post.photo.sort((a, b) => calcImageQuality(b) - calcImageQuality(a))[0]; console.log(`The highest quality image's file_id is ${highestQualityImage.file_id}, which contains ${calcImageQuality(highestQualityImage)} bytes per pixel on average`);Puedes encontrar una imagen de la más alta calidad como esta:
Math.max.apply(Math, array.map(function(o) { return o.width * o.height; }))