大家早上好。我想用Python和Telegram Bot的API发送一个文档。Bot已经成功创建,我也可以发送消息,但不幸的是,我没有设法发送文件,在我的笔记本电脑。
我的守则如下:
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()
输出总是:
{'ok': False, 'error_code': 400, 'description': 'Bad Request: there is no document in the request'}
发布于 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'))
这样的文件参数中打开文件时,它工作得很好。
所以最后的代码应该如下所示:
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()
发布于 2022-11-27 22:09:36
我试过以上所有的方法,花了一天时间寻找问题的正确答案,但在任何地方都没有发现。奇怪!但是最后,在测试和修改@Nengha的答案之后,我的解决方案非常好。
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()
发布于 2020-11-16 09:30:11
首先,我从来没有使用电报API发送文件与电报。
从他们的文件:
(资料来源:https://core.telegram.org/bots/api#sending-files)
发送文件有三种发送文件的方式(照片、贴纸、音频、媒体等):
您需要首先上传文件并引用ID,或者需要一个POST
-Request,而不是附加到URL
。
https://stackoverflow.com/questions/64855334
复制相似问题