Telegram 机器人 - 接收照片 URL

问题描述 投票:0回答:3

当用户通过 Telegram 机器人发送图像时,有什么方法可以获取图像 URL?或者我只需要将图像保存在某个地方?

node.js telegram-bot
3个回答
17
投票

在您收到的消息数组中,您可以找到密钥

photo
。 在那里你会发现多个具有以下格式的数组

"file_id" : "XXXX",
"file_size" : 1107,
"width" : 90,
"height" : 51

您需要从其中一个数组中取出

file_id
。然后,您可以通过简单的 get get 网址来请求
file_path
https://api.telegram.org/bot<token>/getFile?file_id=<file_id>

您将收到一个如下所示的数组

"ok" : true,
"result" : {
    "file_id" : "XXXX",
    "file_size" : 27935,
    "file_path" : "photo\/file_1.jpg"
}

从结果中您需要

file_path
然后您就可以获得图像位置
https://api.telegram.org/file/bot<token>/<file_path>


3
投票

我知道我来得太晚了,但我研究得太久了。答案如下:

const TelegramBot =         require('node-telegram-bot-api');
let bot = new TelegramBot(token, {polling: true});

下载它的功能需要文件ID,该ID包含在消息中

var file_id  = (msg.photo[msg.photo.length-1].file_id);




  var downloadDir = './images';
  let something = ''
  var https = require('https')
  bot.getFileLink(fileId).then( async (fileUri) => {
    var base64Img = require('base64-img');

      let time = process.hrtime();
      let extension = fileUri.split('.').pop();
      let newName = `${time[0]}${time[1]}.${extension}`;
      let file = fs.createWriteStream(`${downloadDir}/${newName}`);
      let request = await https.get(fileUri, (response) => {
         response.pipe(file);

        });
        file.on('finish', () =>{
          console.log('msg.text ='/images/'+newName')
         })
      //

  });
};

主要函数是bot.getFileLink(fileId)。希望它会对阅读本文的人有所帮助:)


3
投票

这是一个三步过程 首先,当用户发送图像时,您的机器人会获得如下 JSON 结构:

Array
(
    [update_id] => 820488009
    [message] => Array
        (
            [message_id] => 11338
            [from] => Array
                (
                    [id] => xxxxxx
                    [is_bot] => 
                    [first_name] => ANSB
                    [language_code] => fr
                )

            [chat] => Array
                (
                    [id] => 333333333
                    [first_name] => ANSB
                    [type] => private
                )

            [date] => 1606316785
            [photo] => Array
                (
                    [0] => Array
                        (
                            [file_id] => AgACAgEAAxkBAAIsSl--cvE_bez8g1Kzbk6LsR4JZOJWAALxqDEbw8TxRQpbG7Np1dvbARV2ShcAAwEAAwIAA20AA6SRAAIeBA
                            [file_unique_id] => AQADARV2ShcAA6SRAAI
                            [file_size] => 34888
                            [width] => 320
                            [height] => 240
                        )

                    [1] => Array
                        (
                            [file_id] => AgACAgEAAxkBAAIsSl--cvE_bez8g1Kzbk6LsR4JZOJWAALxqDEbw8TxRQpbG7Np1dvbARV2ShcAAwEAAwIAA3gAA6WRAAIeBA
                            [file_unique_id] => AQADARV2ShcAA6WRAAI
                            [file_size] => 204583
                            [width] => 800
                            [height] => 600
                        )

                    [2] => Array
                        (
                            [file_id] => AgACAgEAAxkBAAIsSl--cvE_bez8g1Kzbk6LsR4JZOJWAALxqDEbw8TxRQpbG7Np1dvbARV2ShcAAwEAAwIAA3kAA6KRAAIeBA
                            [file_unique_id] => AQADARV2ShcAA6KRAAI
                            [file_size] => 372915
                            [width] => 1280
                            [height] => 960
                        )
                )
        )
)

如您所见,Telegram 创建的图像分辨率较低。如果原始图像很小,则只能拥有原始图像。如果是中等的,你会得到两个。在这里你可以看到我有3张图片(原图是大的1280*960)。 所以你必须检查图像数组的大小(例如我的PHP)

$nbr_image = count($jsondata['message']['photo']);

为了读取您选择的 file_id,以便读取最小的、最大的等...注意,该 id 是不是file_unique_id,而是大的所以file_id

请注意,如果用户一次发送多于一张图片,您将为每张图片收到一条消息。所以每条消息都是关于一张图片,具有多种分辨率。

一旦您的机器人获得了 file_id,您必须调用 Telegram 发送 file_id。该通话是一个基本通话:

https://api.telegram.org/bot<token_of_your_bot>/getFile?file_id=<file_id of the picture>

您将返回一个 JSON:

{"ok":true,
   "result":
   {"file_id":"AgACAgEAAxkBAAIsUV--hZoxZ5_ctnfbVa0zFWjRtMYUAALyqDEbw8TxRdkTI6iDNvHUmKQSMAAEAQADAgADeAADsx8EAAEeBA",
   "file_unique_id":"AQADmKQSMAAEsx8EAAE",
   "file_size":41597,
   "file_path":"photos/file_0.jpg"
 }

所以是 file_id、权重(注意你没有得到像素大小!)和路径的副本。

之后,只需使用如下路径进行调用即可:

https://api.telegram.org/file/bot<token_of_your_bot>/<file_path from the JSON>

然后你就会得到图片

一点:每次我得到一个包含多个分辨率的图片的 JSON 时,大的就是最后一个。但我在文档中没有找到任何关于这一事实的内容。所以我确信索引 [0] 中不能有大的...

注意:只需编辑我的答案即可。当然,您可以查看图片的大小,然后将与您想要的大小相对应的 file_id 发送到 Telegram。但如果您仔细查看图片的所有 file_id,您会发现它们...相同!所以事实上似乎不可能要求“小图像”或“大图像”,因为 Telegram 会向您发送相同的...

© www.soinside.com 2019 - 2024. All rights reserved.