telebot发送本地存储媒体相册报错及媒体组数量限制问题
Telegram本地媒体发送机器人问题解答
问题1:触发400错误 Bad Request: wrong HTTP URL specified
该错误由代码逻辑错误导致,核心触发原因:
- 路径拼接错误:
os.listdir("./vid/")仅返回目标目录下的文件名(如demo.mp4),不带./vid/路径前缀,直接将该短文件名传入InputMediaVideo时,pyTelegramBotAPI会默认将字符串识别为远程HTTP URL,不会按本地文件读取,最终触发URL非法报错。 - 传参逻辑错误:代码中
with open(i, 'rb') as f的文件读取逻辑没有实际生效,打开的二进制文件对象f未传入媒体构造方法或发送接口,属于无效代码。 - 循环逻辑错误:遍历
vid_media列表的循环中,每次迭代都调用send_media_group发送全量媒体列表,会导致同一批视频被重复发送多次。
问题2:媒体数量超过10个时接口是否自动拆分相册
不会。Telegram Bot API对sendMediaGroup接口有硬性限制:单次调用传入的媒体条目最多为10个,超出数量会直接返回400错误,服务端不会自动将多出来的媒体拆分为其他相册发送,必须在业务代码中手动按每组最多10个分片,再分批调用接口发送。
修正后可运行代码
import telebot import os from telebot.types import InputMediaVideo # 替换为你自己的机器人Token bot = telebot.TeleBot("YOUR_BOT_TOKEN") @bot.message_handler(commands=['test']) def test(message): chat_id = message.chat.id video_dir = "./vid/" media_list = [] # 遍历目录生成合法的媒体对象 for filename in os.listdir(video_dir): # 过滤非mp4格式文件 if not filename.lower().endswith(".mp4"): continue full_file_path = os.path.join(video_dir, filename) # 本地文件必须以rb二进制模式打开后传入InputMediaVideo media_list.append(InputMediaVideo(open(full_file_path, 'rb'))) bot.send_message(chat_id, "Sending videos...") # 按每组10个分片批量发送 for idx in range(0, len(media_list), 10): current_batch = media_list[idx:idx+10] bot.send_media_group(chat_id, current_batch) # 发送完成后关闭所有打开的文件句柄,避免资源泄漏 for media_item in media_list: media_item.media.close() bot.polling()
补充说明
- 发送本地存储的媒体时,必须传入
rb模式打开的二进制文件对象,直接传入本地路径字符串会被库识别为远程URL,触发本次遇到的400错误。 - 普通机器人账号发送的单条视频大小不能超过50MB,超出大小限制会触发其他API报错。
- 分批发送时注意控制接口调用频率,避免触发Telegram的限流规则。
内容的提问来源于stack exchange,提问作者ciumai
相关产品推荐
相关产品推荐

