Запрос к API Telegram завершился неудачей. Код ошибки: 400. Описание: Неверный запрос: файл слишком большой.

Вопрос или проблема

Происходит ошибка при отправке видео большого размера: Запрос к API Telegram был неуспешным. Код ошибки: 400. Описание: Неверный запрос: файл слишком большой

import telebot

bot = telebot.TeleBot('xxxxxx')
chat_id= xxxxx

@bot.message_handler(commands=['start'])
def start(message):
    mess = f'текст'
    bot.send_message(message.chat.id, mess, parse_mode="html" )


@bot.message_handler(content_types=['photo'])
def handle_photo(message):
    photo = message.photo[-1]
    file_info = bot.get_file(photo.file_id)
    downloaded_file = bot.download_file(file_info.file_path)
    save_path="photo.jpg"
    with open(save_path, 'wb') as new_file:
        new_file.write(downloaded_file)
    bot.reply_to(message, 'текст')
    bot.send_photo(chat_id=chat_id, photo=downloaded_file, caption=message.caption)

@bot.message_handler(content_types=['video'])
def get_file(message):
    file_info = bot.get_file(message.video.file_id)
    file_content = bot.download_file(file_info.file_path)
    bot.reply_to(message, 'текст')
    bot.send_video(chat_id=chat_id, video=file_content, caption=message.caption)

bot.polling(none_stop=True)

Ответ или решение

Ошибка, с которой вы столкнулись, связана с тем, что Telegram API имеет ограничения на размер файлов, которые можно отправлять. Для видеофайлов максимальный размер ограничен 20 MB (в противном случае вы получите ошибку 400: Bad Request: file is too big). Чтобы решить эту проблему, рассмотрим несколько подходов.

Решение 1: Проверка размера файла

Перед отправкой видео можно проверить его размер. Если файл превышает допустимый лимит, вы можете либо не отправлять его, либо уведомить пользователя об этом.

Вот как это можно сделать:

import telebot

bot = telebot.TeleBot('xxxxxx')
chat_id = xxxxx

@bot.message_handler(commands=['start'])
def start(message):
    mess = 'Привет! Отправьте видео или фото.'
    bot.send_message(message.chat.id, mess, parse_mode="html")

@bot.message_handler(content_types=['photo'])
def handle_photo(message):
    photo = message.photo[-1]
    file_info = bot.get_file(photo.file_id)
    downloaded_file = bot.download_file(file_info.file_path)
    save_path = "photo.jpg"
    with open(save_path, 'wb') as new_file:
        new_file.write(downloaded_file)
    bot.reply_to(message, 'Фотография сохранена и отправлена.')
    with open(save_path, 'rb') as photo_file:
        bot.send_photo(chat_id=chat_id, photo=photo_file, caption=message.caption)

@bot.message_handler(content_types=['video'])
def get_file(message):
    file_info = bot.get_file(message.video.file_id)
    file_content = bot.download_file(file_info.file_path)

    # Проверим размер видео
    if message.video.file_size > 20 * 1024 * 1024:  # 20 MB
        bot.reply_to(message, 'Файл слишком большой для отправки. Максимальный размер: 20 MB.')
        return

    bot.reply_to(message, 'Видео успешно обработано.')
    bot.send_video(chat_id=chat_id, video=file_content, caption=message.caption)

bot.polling(none_stop=True)

Решение 2: Сжатие или обрезка видео

Если вы хотите отправить видео, которое превышает 20 MB, вам следует рассмотреть возможность его сжатия или обрезки перед отправкой. Это можно сделать с помощью библиотек, таких как moviepy или ffmpeg. Этот подход требует дополнительной обработки, но позволяет избежать ошибок при отправке.

Пример с использованием moviepy:

from moviepy.video.io.ffmpeg_tools import ffmpeg_extract_subclip

def compress_video(input_file, output_file):
    # Здесь можно добавить логику сжатия, например, изменить разрешение.
    # Вместо этого можно просто создать сокращенную версию видео.
    ffmpeg_extract_subclip(input_file, 0, 10, targetname=output_file)  # Обрезаем 10 секунд

@bot.message_handler(content_types=['video'])
def get_file(message):
    file_info = bot.get_file(message.video.file_id)
    file_content = bot.download_file(file_info.file_path)

    with open('original_video.mp4', 'wb') as f:
        f.write(file_content)

    # Сжимаем или обрезаем видео
    compress_video('original_video.mp4', 'compressed_video.mp4')

    with open('compressed_video.mp4', 'rb') as video_file:
        bot.send_video(chat_id=chat_id, video=video_file, caption=message.caption)

bot.polling(none_stop=True)

Заключение

Убедитесь, что вы соблюдаете ограничения Telegram на размер файлов. Вы можете либо проверять размер файла перед его отправкой, либо использовать техники сжатия. Также всегда полезно сообщать пользователю о проблемах, связанных с отправкой файлов, чтобы повысить качество взаимодействия.

Оцените материал
Добавить комментарий

Капча загружается...