【问题标题】:Telegram bot - receive photo URL电报机器人 - 接收照片 URL
【发布时间】:2016-06-29 17:41:08
【问题描述】:

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

【问题讨论】:

    标签: node.js telegram-bot


    【解决方案1】:

    在您收到的消息数组中,您可以找到密钥photo。 在那里你会发现多个具有以下格式的数组

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

    您需要从其中一个数组中获取file_id。然后,您可以通过简单的获取请求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>

    【讨论】:

    • 我可以知道如何回显 file_path 的值吗?我将数组插入变量 $file 并调用例如; $file['result]['file_path'] 但它在我的日志中返回非法偏移错误。你能帮我吗,因为我不确定调用卷曲数组吗?通常普通数组就可以正常工作。
    【解决方案2】:

    我知道我为时已晚,但我研究的时间太长了。答案如下:

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

    并且下载它的功能需要文件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的大图)。 所以你必须检查图像数组的大小(例如 i PHP)

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

      为了读取您选择的 file_id,以便读取最小、最大等的 oe...请注意,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] 中有大的...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-10
        • 2016-10-17
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 2016-08-15
        • 1970-01-01
        • 2023-03-12
        相关资源
        最近更新 更多