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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:48:18