You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Telegram Bot单消息发多文件失败:单文件发送遇400错误求助

问题解决方法

1. 单个文件发送失败的原因及修复

你遇到的400 Bad Request错误,是因为用JSON格式传递本地文件路径给Telegram API时,API无法识别本地路径。发送本地文件必须用multipart/form-data格式上传文件二进制流,而非直接传路径。

修复后的单文件发送代码:

import requests

BOT_TOKEN = "xxxxxxxxxxxxxxx"
CHAT_ID = "xxxxx"
FILE_PATH = "students10.txt"

# 计算文件行数
def get_line_count(file_path):
    with open(file_path, 'r', encoding='utf-8') as f:
        return sum(1 for line in f)

line_count = get_line_count(FILE_PATH)
url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendDocument"

payload = {
    "chat_id": CHAT_ID,
    "caption": f"Total students in 10: {line_count}"
}
# 用files参数上传文件二进制流
with open(FILE_PATH, 'rb') as f:
    files = {"document": f}
    response = requests.post(url, data=payload, files=files)

print(response.text)

2. 批量发送三个文件并添加行数标题

循环处理三个文件,先计算每个文件的行数,再生成对应标题发送,也可以先发送一条汇总所有行数的消息:

import requests

BOT_TOKEN = "xxxxxxxxxxxxxxx"
CHAT_ID = "xxxxx"
# 定义要发送的文件和对应班级编号
FILE_LIST = [
    ("students10.txt", "10"),
    ("students11.txt", "11"),
    ("students12.txt", "12")
]

def get_line_count(file_path):
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            return sum(1 for line in f)
    except FileNotFoundError:
        print(f"找不到文件:{file_path}")
        return 0

# 发送汇总行数的消息(可选)
summary_text = ""
for file_name, class_num in FILE_LIST:
    count = get_line_count(file_name)
    summary_text += f"Total students in {class_num}: {count}\n"

summary_url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage"
requests.post(summary_url, json={"chat_id": CHAT_ID, "text": summary_text.strip()})

# 逐个发送文件
for file_name, class_num in FILE_LIST:
    line_count = get_line_count(file_name)
    if line_count == 0:
        continue
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendDocument"
    payload = {
        "chat_id": CHAT_ID,
        "caption": f"Total students in {class_num}: {line_count}"
    }
    with open(file_name, 'rb') as f:
        files = {"document": f}
        response = requests.post(url, data=payload, files=files)
    print(f"{file_name} 发送结果:{response.text}")

需要注意的点

  • 必须用files参数传递文件二进制流,不能在JSON里传本地路径
  • 读取文件时指定编码(如utf-8),避免因编码错误导致行数计算出错
  • 确保Bot已加入目标聊天会话,且有发送消息和文件的权限
  • Telegram Bot发送普通文件最大限制为50MB,不要超过该大小

内容的提问来源于stack exchange,提问作者Ajesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:55:19