В наше время Telegram стал одной из самых популярных платформ для общения и обмена информацией. В связи с этим, разработка ботов для Telegram также стала востребованным направлением. Одним из важных аспектов работы с ботами является возможность загрузки и обработки больших файлов.

В этой статье мы рассмотрим, как организовать работу с большими файлами в Telegram-ботах, используя фреймворк aiogram 3.x.x, и как можно развернуть локальный сервер для тестирования и разработки бота. Так же приведу пример простейшего телеграмм бота.

Начнем с того, что Telegram API имеет определенные ограничения на размер файлов, которые можно отправлять или получать через ботов составляет 20 мб.

Чтобы обойти данное ограничение можно использовав telegram bot api создав локальный сервер. На нём уже можно будет загружать и отправлять файлы до 2 гб.

Для начала нужно установить telegram-bot-api. Универсальная инструкция по его установке представлена на сайте: ссылка

Для мака удобнее пользоваться следующей инструкцией:

git clone https://github.com/tdlib/telegram-bot-api.git
cd telegram-bot-api
mkdir build
cd build
cmake ..
cmake --build .

Возможные проблемы на данном этапе:

1)

build git:(master) cmake ..
zsh: command not found: cmake

Решение:

Нужно установить cmake, для мака удобнее всего это установить его через brew:

brew install cmake

Для Ubuntu/Debian используем эти команды:

sudo apt-get update
sudo apt-get install cmake

2)

build git:(master) cmake ..
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 3.5 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- The CXX compiler identification is AppleClang 15.0.0.15000100
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
CMake Error at CMakeLists.txt:16 (add_subdirectory):
  The source directory

    /Users/aleksandrvolzanin/pet_project/more50/telegram-bot-api/td

  does not contain a CMakeLists.txt file.


CMake Error at CMakeLists.txt:40 (include):
  include could not find requested file:

    PreventInSourceBuild


CMake Error at CMakeLists.txt:41 (prevent_in_source_build):
  Unknown CMake command "prevent_in_source_build".


-- Configuring incomplete, errors occurred!

Решение:

Нужно установить подмодуль td.

git submodule init
git submodule update

Далее для запуска локального сервера нам нужно зайти в папку build и там мы вводим команду:

./telegram-bot-api --local --api-id=<API-ID> --api-hash=<API-HASH>

Здесь вместо API-ID и API-Hash нужно ввести свои данные, их можно получить на сайте: ссылка

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

Дальше будет код простейшего телеграмм бота, который просто скачивает аудио в папку у вас на компьютер:

import asyncio
from aiogram import Bot, Dispatcher, F
from aiogram.types import Message
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer 


API_TOKEN = '7488158267:AAH1KIiUd-OOFi8HakIDKZg8UMzrLzlWPaE'
session = AiohttpSession(api=TelegramAPIServer.from_base("http://localhost:8081", is_local=True))
bot = Bot(token=API_TOKEN, session=session)
dp = Dispatcher()

@dp.message(F.audio)
async def send_audio(message: Message):

    audio = message.audio
    file_id = audio.file_id
    file = await message.bot.get_file(file_id)

    file_path = file.file_path
    download_path = "/Users/aleksandrvolzanin/pet_project/more50/audio/audio_message.mp3"

    await message.bot.download_file(file_path, download_path)

    await message.answer("Ваше аудиосообщение принято")


async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

Так же вам нужно будет в директории проекта создать папку audio.

После этого файл, в моём случае это запись лекции, которая весит 100+ мб, будет у вас скачан на компьютере, а вы увидите сообщение в телеграмм боте:

Ответ бота
Ответ бота
Иерархия файлов в проекте
Иерархия файлов в проекте

Если у вас не получается, то можете попробовать разлогиниться на сайте: https://api.telegram.org/bot<TOKEN>/logOut

<TOKEN> вам нужно заменить на токен вашего бота.

Вот и всё! Надеюсь вам понравилась статья, я решил её написать, потому что не увидел простого и понятного объяснения этой возможности телеграмм ботов.

Так же можете посмотреть официальный гит хаб репозиторий проекта: ссылка

Если у вас есть замечания или дополнения - обязательно пишите в комментарии, я постараюсь давать обратную связь и дополнять статью!

Комментарии (5)


  1. zoto_ff
    05.09.2024 00:56

    или можно поступить проще: для загрузки использовать MTProto (telethon, pyrogram позволяют авторизоваться через токен бота) – ничего не нужно будет поднимать


    1. MAXH0
      05.09.2024 00:56

      Посмотрел в сторону MTProto. Вы не могли бы статью написать, где хотя бы тезисно описать прототип. Потому что большая часть статей про шифрование.


    1. m4deme1ns4ne Автор
      05.09.2024 00:56

      Интересно, а разве там нету ограничений по загрузке файлов? Те же 2 гб?


      1. zoto_ff
        05.09.2024 00:56

        Bot API – это как раз HTTP надстройка над MTProto. Да, ограничение 2 гб


  1. NotSadMan
    05.09.2024 00:56

    Если локально файлы не нужно сохранять, то можно сохранять их уникальный айди. Они без срока истечения. Имея айди файла, бот может отправить его моментально куда угодно. Это выгодно для какиого нибудь файлообменника.