python-3.x 发送图像到Telegram时,“请求实体太大”错误的原因是什么?

hkmswyz6  于 2023-01-06  发布在  Python
关注(0)|答案(3)|浏览(100)

文件大小:51.2 KB尝试发送:

>>> send_img_url = 'https://api.telegram.org/botXXXXXXXXXXXXXXXXXXXXX/sendPhoto'
>>> img_name = 'C:/Users/Administrator/Downloads/WhatsApp Image 2019-05-30 at 20.54.40.jpeg'
>>> r = requests.post(send_img_url, data={'chat_id': '-351543550', 'photo': open(img_name, 'rb')})
>>> r
<Response [413]>
>>> r.reason
'Request Entity Too Large'
>>> r.content
b''
>>>

此外,我尝试一些其他的请求,如:

photo = open(('C:/Users/Administrator/Downloads/WhatsAppImage.jpeg').encode('utf-8'), 'rb')
r = requests.post(send_img_url, data={'chat_id': '-351543550', 'photo': photo})

以及:

with io.open('C:/Users/Administrator/Downloads/WhatsAppImage.jpeg', encoding='utf-8', errors='ignore') as f:
    r = requests.post(send_img_url, data={'chat_id': '-351543550', 'photo': f})

最后一个选项给予下一个错误:

>>> r
<Response [400]>
>>> r.reason
'Bad Request'
wixjitnu

wixjitnu1#

你可能做错了。
正如Bot API文档所述:
使用multipart/form-data以通常通过浏览器上传文件的方式发布文件。照片最大大小为10 MB,其他文件最大大小为50 MB。
在requests lib中,通过使用data=关键字参数,您将使用form-encoded类型而不是multipart/form-data发送有效负载。
试着这样提出你的要求:

import requests

chat_id = '-351543550'
url = 'https://api.telegram.org/botXXXXXXXXXXXXXXX/sendPhoto?chat_id={}'.format(chat_id)
filepath = 'C:\correct\path\to\your\file.jpg'
r = requests.post(url, files={"photo": open(filepath, 'rb')})  # note: files, not data
print(r.status_code)

P.S.:您也可以使用以下命令将chat_id作为form-encoded参数发送

url = 'https://api.telegram.org/botXXXXXXXXXXXXXXX/sendPhoto'
...
r = requests.post(url, data={'chat_id': '-351543550'}, files={"photo": open(filepath, 'rb')})
mrfwxfqh

mrfwxfqh2#

在我的例子中,Ivan Vinogradov提出的解决方案由于西里尔文文件名而不起作用,将路径改为拉丁文就解决了这个问题。

eqoofvh9

eqoofvh93#

    • 使用本地Bot API服务器,您可以发送高达2GB的大文件。**

源代码:
https://github.com/tdlib/telegram-bot-api
正式文件
https://core.telegram.org/bots/api#using-a-local-bot-api-server
您可以按照此链接https://tdlib.github.io/telegram-bot-api/build.html上的说明将其build and install到您的服务器
基本设置:
1.从https://my.telegram.org/apps生成电报应用程序ID
1.启动服务器./telegram-bot-api --api-id=<your-app-id> --api-hash=<your-app-hash> --verbosity=20
1.默认地址为http://127.0.0.1:8081/,端口为8081。
1.所有的官方API都可以使用这个设置,只需将地址更改为http://127.0.0.1:8081/bot<token>/METHOD_NAME reference:https://core.telegram.org/bots/api
示例代码:

import requests

url = "http://127.0.0.1:8081/bot<your-bot-token>/sendVideo"

payload={'chat_id': 'chat_id',
'supports_streaming': 'true'}
files=[
  ('video',('your_file_name.mp4',open('path_of_file','rb'),'application/octet-stream'))
]
headers = {}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)

相关问题