首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用电报bot API发送文件?

如何用电报bot API发送文件?
EN

Stack Overflow用户
提问于 2020-11-16 09:18:59
回答 3查看 3.6K关注 0票数 1

大家早上好。我想用Python和Telegram Bot的API发送一个文档。Bot已经成功创建,我也可以发送消息,但不幸的是,我没有设法发送文件,在我的笔记本电脑。

我的守则如下:

代码语言:javascript
运行
复制
import requests


def telegram_bot_send_document():

    bot_token = '####'
    bot_chatID = '####'

    file = open('test.txt', 'rb')
    send_document = 'https://api.telegram.org/bot' + bot_token + '/sendDocument?chat_id=' + bot_chatID + '&multipart/form-data=' + str(file.read())

    r = requests.post(send_document)
    print(r.url)

    return r.json()

输出总是:

代码语言:javascript
运行
复制
{'ok': False, 'error_code': 400, 'description': 'Bad Request: there is no document in the request'}
EN

回答 3

Stack Overflow用户

发布于 2022-09-07 09:42:09

虽然已经很晚了,但我想我必须为那些可能会遇到和我一样的问题的人分享。

从Antonio的代码中有两个主要的修改:

在post()中传递stream=True

在上传文件时,请求要求我们传递stream=True参数,以便可以在服务器端下载该文件。您可以阅读更多关于它的这里。另外,由于它是一个包含多部分/表单数据的post请求,因此我们需要传递数据参数(chat_id、标题、parse_mode等)以及以二进制方式携带文档的文件参数。

在post()中打开文件

这很奇怪,我还没有找到原因,但是当我打开像file = open('text.txt','rb)这样的varible文件并在文件参数(如requests.post(url, data=data, files=file) )中引用它时,Telegram会抛出一个糟糕的请求,说没有找到文档,但是当我在requests.post(url, data=data, files=open('text.txt','rb'))这样的文件参数中打开文件时,它工作得很好。

所以最后的代码应该如下所示:

代码语言:javascript
运行
复制
import requests


def telegram_bot_send_document():

    bot_token = '####'
    bot_chatId = '####'

    open('test.txt', 'rb')
    send_document = 'https://api.telegram.org/bot' + bot_token +'/sendDocument?'
    data = {
      'chat_id': bot_chatId,
      'parse_mode':'HTML',
      'caption':'This is my file'
       }

    r = requests.post(send_document, data=data, files=open('test.txt','rb'),stream=True)
    print(r.url)

    return r.json()
票数 0
EN

Stack Overflow用户

发布于 2022-11-27 22:09:36

我试过以上所有的方法,花了一天时间寻找问题的正确答案,但在任何地方都没有发现。奇怪!但是最后,在测试和修改@Nengha的答案之后,我的解决方案非常好。

代码语言:javascript
运行
复制
def telegram_bot_send_document():

bot_token = ""
bot_chatId = ""

file_location = 'test.txt'
send_document = 'https://api.telegram.org/bot' + bot_token +'/sendDocument?'
data = {
  'chat_id': bot_chatId,
  'parse_mode':'HTML',
  'caption':'This is my file'
}
# Need to pass the document field in the files dict
files = {
    'document': open(file_location, 'rb')
}

r = requests.post(send_document, data=data, files=files, stream=True)
print(r.url)

return r.json()
票数 0
EN

Stack Overflow用户

发布于 2020-11-16 09:30:11

首先,我从来没有使用电报API发送文件与电报。

从他们的文件:

(资料来源:https://core.telegram.org/bots/api#sending-files)

发送文件有三种发送文件的方式(照片、贴纸、音频、媒体等):

  1. 如果该文件已经存储在Telegram服务器上的某个地方,您不需要重新上传它:每个文件对象都有一个file_id字段,只需将这个file_id作为参数传递,而不是上传。以这种方式发送的文件没有限制。
  2. 为要发送的文件提供HTTP。电报将下载并发送该文件。照片的最大大小为5 MB,其他类型的内容最大为20 MB。
  3. 使用多部分/表单数据发布文件,其方式通常是通过浏览器上传文件。照片的最大尺寸为10 MB,其他文件为50 MB。

您需要首先上传文件并引用ID,或者需要一个POST-Request,而不是附加到URL

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64855334

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档