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

使用Python-telegram-bot发送视频消息异常:返回普通视频而非视频消息

问题解决方法

问题根源

Telegram平台里,**普通视频(Video)和视频消息(Video Note)**是完全独立的媒体类型,二者的File ID不兼容。你直接传入普通视频的File ID调用reply_video_note,Telegram会默认按原视频类型返回,不会自动转换为视频消息格式。

解决步骤

要实现将收到的普通视频转为视频消息回复,需要先对视频进行格式处理,再调用API发送:

  • 视频必须是正方形分辨率(推荐640x640)
  • 编码格式需为MP4
  • 文件大小不超过1GB,时长不超过60秒

修改后的代码示例

这里用moviepy库处理视频格式转换,先安装依赖:

pip install moviepy python-telegram-bot

代码实现:

from moviepy.editor import VideoFileClip
import os
from telegram import Update
from telegram.ext import ContextTypes.DEFAULT_TYPE

async def send_video_note_to_user(update: Update, context: ContextTypes.DEFAULT_TYPE):
    video = update.message.video
    if video:
        # 1. 下载收到的普通视频到本地
        video_file = await context.bot.get_file(video.file_id)
        local_video_path = "temp_video.mp4"
        await video_file.download_to_drive(local_video_path)
        
        # 2. 转换视频为正方形格式,符合Video Note要求
        with VideoFileClip(local_video_path) as clip:
            # 获取视频最短边长度,裁剪成正方形
            min_dim = min(clip.size)
            square_clip = clip.crop(x_center=clip.size[0]/2, y_center=clip.size[1]/2, width=min_dim, height=min_dim)
            # 保存转换后的视频
            converted_path = "video_note.mp4"
            square_clip.write_videofile(converted_path, codec="libx264", audio_codec="aac")
        
        # 3. 发送转换后的视频消息
        with open(converted_path, "rb") as f:
            await update.message.reply_video_note(video_note=f)
        
        # 清理临时文件
        os.remove(local_video_path)
        os.remove(converted_path)

补充说明

  • 如果不需要保留原视频的音频,可以在转换时添加audio=False参数
  • 若视频时长超过60秒,需要额外裁剪时长,比如square_clip.subclip(0, 60)
  • 生产环境建议增加异常处理,避免文件操作或转换失败导致报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 17:56:03