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
相关产品推荐
相关产品推荐

