Отправить файл большого размера через телеграм бота
Приветствую всех. В этой небольшой статье я покажу один из способов, как можно отправить файл большого размера в телеграм боте с помощью Python. Для примера буду использовать библиотеку pyTelegramBotAPI (telebot).
Что бы лучше понять о чем речь, попробуйте воспроизвести код ниже.
import telebot bot = telebot.TeleBot("ТОКЕН") @bot.message_handler(func=lambda message: message.text.lower() in ['файл']) def echo_all(message): bot.reply_to(message, 'Загрузка файла') file = open('file.rar', 'rb') bot.send_document(message.chat.id, file) bot.infinity_polling()
Данный бот при получении сообщения файл отвечает пользователю и отправляет документ file.rar .
![]()
Если документ file.rar будем иметь вес больше 50МБ, то пользователь его не получит.
![]()
Проблему можно решить способом отправки file_id .
Отправка файла по file_id
Откройте в браузере ссылку указав свой токен.
https://api.telegram.org/bot/getUpdates
После чего, отправьте своему боту документ. Я отправил file.rar с весом ~70МБ.
![]()
Перезагрузите страницу с ссылкой что вы открыли в браузере ранее, и вы увидите массив данных где присутствует file_id вашего документа.
![]()
Теперь вы можете использовать его в коде, и таким образом отправлять документы больше 50МБ.
import telebot bot = telebot.TeleBot("ТОКЕН") @bot.message_handler(func=lambda message: message.text.lower() in ['файл']) def echo_all(message): bot.reply_to(message, 'Загрузка файла') file ='IAAxkBAAIFIWJYZMHvbYpgCRAAIKGQACdSfBSqBQd6lVllkwIwQ' bot.send_document(message.chat.id, file) bot.infinity_polling()
Конвертируйте файлы для Telegram
Telegram — отличный инструмент обмена сообщениями, однако он поддерживает всего несколько встраиваемых медиаформатов. Наш онлайн-сервис гарантирует то, что ваш видео-файл будет соответствовать характеристикам Telegram, и что вы сможете поделиться им в этом мессенджере. Просто выберите свой файл, которым вы хотите поделиться, ниже, а также укажите предустановку для Telegram. Наш конвертер проследит за тем, чтобы ваш файл имел правильные характеристики после обработки, чтобы вы могли поделиться им с помощью Телеграма.
Отправка огромных файлов в Телеграмм
Для многих пользователей основным преимуществом Telegram является возможность отправки очень объемных файлов. Их размер может достигать 1,5 Гб. Читайте, куда сохраняются файлы Телеграм.

Одно из последних обновлений Telegram для обладателей устройств с iOS предоставляет им кардинально усовершенствованное меню отправки файлов. В Telegram теперь интегрированы такие облачные сервисы, как:
- Dropbox;
- iCloud;
- Google Drive.
Это нововведение даёт людям возможность без проблем делиться уже имеющимися у них документами через инструмент отправки файлов в Telegram.
Можно делиться одновременно несколькими большими файлами и редактировать видео

С недавних пор появилась возможность одновременной отправки нескольких файлов. При этом еще до отсылки можно увидеть их размер и разрешение. Если говорить о видеофайлах, то теперь добавлены ожидаемые всеми пользователями функции:
- предпросмотра;
- обрезки видео;
- обработки в приложении.
Еще одно усовершенствование Telegram (пока только для iOS) заключается в возможности открывать местоположение с помощью навигационных приложений, таких, как Google Maps. Это можно сделать, например, в навигаторе для автомобиля.
Функции для пользователей Android, хэштеги

Хэштегами на обеих платформах теперь поддерживаются не только латинские символы. Важно также то, что недавно применённые хэштеги теперь будут предлагаться на выбор при нажатии символа #. Это упрощает работу с ними во много раз.
Еще одним полезным новшеством для операционной системы Android стала возможность очищать поисковую историю в сети картинок, хэштегов и GIF. Достаточно просто нажать и удерживать недавние поисковые запросы.
Для сообщений в открытых чатах появились новые звуки. Улучшен дизайн и интерфейс.
Telegram получили отзыв от специалистов компании Google о том, как можно усовершенствовать интерфейс приложения для пользователей Android. В данном обновлении некоторые идеи воплощаются. К примеру, для личных чатов можно устанавливать индивидуальный фон. Он будет использован и в меню.
Telegram боты. Загружаем файлы больше 50мб

Telegram боты позволяют автоматизировать многие процессы. Их использование не ограничивается одним чатом, по сути — бот это всего лишь интерфейс ввода-вывода, который помимо текста также может принимать и передавать файлы: изображения, видео, аудио, документы…
- Для пользователей максимальный размер файла — 1.5Гб
- Боты ограничены размером всего лишь в 50мб
Telegram API
Раз пользователи могут загружать файлы до 1.5Гб — значит и мы можем — для этого создадим агента (назвал чтобы не путать с ботами) который будет работать в связке с нашим Telegram ботом. Для этого потребуется отдельный аккаунт и Telegram API.
Для начала идем на https://core.telegram.org и по инструкции регистрируем приложение, в итоге вы должны получить api_id и api_hash

Что делает агент?
Бот не может загружать файлы больше 50мб, но если у него есть file_id уже загруженного на сервера Telegram файла — то он может его пересылать. Так что алгоритм следующий
- Приложение, работающее на сервере через Bot API формирует файл для отправки
- Вызывает агента для загрузки файла на сервера Telegram
- Получает от агента file_id
- Пользуется загруженным файлом
Пример кода
Потребность загружать большие файлы появилась при написании @AudioTubeBot — изначально аудиофайл разбивался на части и отправлялся по частям. Функционал загрузки больших файлов было решено вынести в отдельное приложение, которое вызывается через subprocess.check_call
#!/usr/bin/env python3 # -*- coding: utf-8 -*- from telethon import TelegramClient from telethon.tl.types import DocumentAttributeAudio import mimetypes entity = 'AudioTube_bot' #имя сессии - все равно какое api_id = 1959 api_hash = '88b68d6da53fe68c1c3541bbefc' phone = '+79620181488' client = TelegramClient(entity, api_id, api_hash, update_workers=None, spawn_read_thread=False) client.connect() if not client.is_user_authorized(): # client.send_code_request(phone) #при первом запуске - раскомментить, после авторизации для избежания FloodWait советую закомментить client.sign_in(phone, input('Enter code: ')) client.start() def main(argv): file_path = argv[1] file_name = argv[2] chat_id = argv[3] object_id = argv[4] bot_name = argv[5] duration = argv[6] mimetypes.add_type('audio/aac','.aac') mimetypes.add_type('audio/ogg','.ogg') msg = client.send_file( str(bot_name), file_path, caption=str(chat_id + ':' + object_id + ':' + duration), file_name=str(file_name), use_cache=False, part_size_kb=512, attributes=[DocumentAttributeAudio( int(duration), voice=None, title=file_name[:-4], performer='')] ) client.disconnect() return 0 if __name__ == '__main__': import sys main(sys.argv[0:])
Комментарии:
Вот и весь код — тут используется библиотека Telethon — при запуске программе передается путь к файлу для отправки, имя файла, chat_id — для кого предназначается данный файл), имя бота, который вызвал агента(например у меня это beta и release боты).
client.send_file
Просто загрузить файл на сервер через upload, получить file_id и передать его боту — не выйдет, file_id работает только внутри чата, в котором он был создан — чтобы наш бот мог переслать файл пользователю по file_id — агент должен переслать ему этот файл
— тогда бот получит свой file_id для этого файла и сможет распоряжаться им.
caption=str(. ) — wat?!
Агент пересылает файлы только боту, добавляя комментарий в caption-у меня это:

- chat_id конечного пользователя
- длительность трека
- object_id в базе данных, к которому нужно привязать file_id, чтобы повторно не загружать файл(индексация, оптимизация и все такое)
Пример вызова в коде бота
На диске в path_file_mp3 уже сохранен файл для загрузки, вызываем подпрограмму и ждем ее завершения.
status = subprocess.check_call( "python3.6 audiotubeagent36/main.py " + path_file_mp3 + ' ' + audio_title + '.'+ us_audio_codec + ' ' + str(chat_id) + ' ' + str(pool_object['_id']) + ' ' + config.BOT_NAME + ' ' + str(duration),shell=True)
В обработчике входящих сообщений делаем что то подобное
if message.content_type in ['document','audio']: user_id = message.from_user.id bot_settings = SafeConfigParser() bot_settings.read(config.PATH_SETTINGS_FILE) c_type = message.content_type if functions.check_is_admin(bot_settings, user_id): if c_type == 'audio': file_id = message.audio.file_id audio_title = message.audio.title else: file_id = message.document.file_id audio_title = message.document.file_name[:-4] client_chat_id = message.caption if client_chat_id.find(u':') != -1: client_chat_id, q_pool_obj_id, duration_s = re.split(r':',client_chat_id) #добавляем file_id в базу q_pool.update_request_file_id(str(q_pool_obj_id), str(file_id)) #пересылаем конечному адресату bot.send_audio(int(client_chat_id), file_id,caption='', duration=int(duration_s), title=audio_title, performer='') return
Вопросы/предложения пишите в комментариях или в чате.
- Ненормальное программирование
- Python
- Программирование
- API
- Хранение данных
