【问题标题】:How do I download a file or photo that was sent to my Telegram bot?如何下载发送到我的 Telegram 机器人的文件或照片?
【发布时间】:2015-09-14 18:37:14
【问题描述】:

我正在使用电报机器人 API,但无论如何我都无法下载发送到我的机器人的文件。我得到了文件的哈希值,但不知道如何处理它。有什么办法吗?谢谢。

【问题讨论】:

    标签: api telegram-bot


    【解决方案1】:

    如果你有 file_id 那么你需要使用 sendDocumentsendPhoto 方法,如果你想发送给自己,你需要告诉你的机器人你的用户 ID 或你的聊天 ID(同一个 -一对一聊天)。

    【讨论】:

    • OP 询问的是接收,而不是发送。将文件转发或重新发送给自己只会让您遇到同样的问题。
    • 如果机器人将文件发送给我,那么我可以从与机器人的对话中将文件下载到我的手机或计算机(从电报本身)。根据您的评论,Arthur 想在 bot 中接收消息,然后 bot 将图像或文件下载到服务器(运行 de bot 的位置)?
    • 我现在明白你的意思了。但是,是的,通常您希望机器人自动下载文件并以某种方式处理它。毕竟,这就是拥有机器人的意义所在。
    【解决方案2】:

    处理文件的方法尚不可用。 来源:推特电报

    https://twitter.com/telegram/status/614468951926509568

    【讨论】:

      【解决方案3】:

      现在可以使用了!

      https://core.telegram.org/bots/api#getfile

      万岁!它是在 9 月 18 日添加的:

      https://core.telegram.org/bots/api

      用法:

      在消息的 JSON 中,您将像以前一样收到 file_id。带有语音文件的消息对象示例:

      {
        message_id: 2675,
        from: {
          id: 10000001,
          first_name: 'john',
          username: 'john'
        },
        chat: {
          id: 10000001,
          first_name: 'john',
          username: 'john'
        },
        date: 1442848171,
        voice: {
          duration: 2,
          mime_type: 'audio/ogg',
          file_id: 'AwADBAADYwADO1wlBuF1ogMa7HnMAg',  //  <------- file_id
          file_size: 17746
        }
      }
      

      现在您可以通过 API 的 getFile 获取文件所需的路径信息:

      https://api.telegram.org/bot<bot_token>/getFile?file_id=the_file_id
      

      这将返回一个具有 file_idfile_sizefile_path 的对象。然后您可以使用 file_path 下载文件:

      https://api.telegram.org/file/bot<token>/<file_path>
      

      请注意,此链接仅在一个小时内可用。一小时后,您可以请求另一个链接。这意味着,如果您想以某种方式托管文件,并且避免在每次提供文件时检查并重新检查新链接,则最好将文件下载到您自己的托管服务中。

      通过这种方法获得的文件最大为20MB。 错误:使用大于 20mb 的文件时获取。(如下所示)

      {"ok":false,"error_code":400,"description":"Bad Request: file is too big[size:1556925644]"}
      

      来自电报的文档:

      成功时,返回一个 File 对象。然后可以通过链接https://api.telegram.org/file/bot/ 下载该文件,该链接取自响应。保证该链接至少在 1 小时内有效。当链接过期时,可以通过再次调用 getFile 来请求新的链接。目前,机器人可以下载最大 20MB 大小的文件。

      【讨论】:

      • 澄清一下,getFile API 调用必须在 GET 查询字符串中包含 ?file_id=the_file_id
      • 当我使用 /getFile 时,有时我无法获取 file_path,例如,当文件为 ogg 时,file_path 已定义且文件已正确下载,但当文件为 mp3 时,filr_path 未定义,只返回 file_id 和 file_size!
      • 对于它的价值,关于此的电报文档不是很有帮助。这里有用的位是“api.telegram.org/bot<bot_token>/…”和“api.telegram.org/file/bot<token>/<file_path>”
      • 谢谢,您的回答对我帮助很大。
      【解决方案4】:

      耶! 2015 年 9 月 18 日刚刚添加

      您可以使用getFile(file_id)。该函数返回一个包含file_path 的文件对象。您可以通过这个地址下载文件:

      https://api.telegram.org/file/bot&lt;token&gt;/&lt;file_path&gt;

      Telegram Bot API Documentation 中所述,File 对象的有效期约为一小时。如果旧的 File 对象过期,您应该再次调用 getFile 以获取新的 File 对象。

      【讨论】:

      • getFile 端点的格式是什么?我尝试过 /getFile、/getFile?file_id=xxx、getFile(xxx),但都没有奏效。
      【解决方案5】:

      如果您使用pyTelegramBotAPI,您可以使用此代码下载您的照片:

      raw = message.photo[2].file_id
      path = raw+".jpg"
      file_info = bot.get_file(raw)
      downloaded_file = bot.download_file(file_info.file_path)
      with open(path,'wb') as new_file:
          new_file.write(downloaded_file)
      

      【讨论】:

      • photo[2] 那里有 4 个版本的照片。如果我想下载更小的 [0] 零索引是我的吗? php示例代码呢?
      【解决方案6】:

      另外,请注意,Telegram api(通过 webhook)提供 thumbs 属性,对于图像和 gif,它将提供文件的 thumbnail。要获取源文件,您需要检查根对象 file_id。

      【讨论】:

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