Найти в Дзене
IT, Python, Mikrotik, Linux

Как поднять Local Bot API и подключить к нему бота

Я недавно столкнулся с задачей которую нельзя было выполнить обычным Bot API, так как там есть ограничения по размеру отправляемых данных. А мне нужно было перепрыгнуть такие ограничения, Прочитал несколько статей, попробовал некоторые из них. Все безрезультатно. 📂 my_it_space

Потом узнал что можно поднять локальный Bot API и можно будет получить вот такие привилегии:

  • Загружайте файлы без ограничений по размеру.
  • Загружайте файлы размером до 2000 МБ.
  • Загружайте файлы, используя их локальный путь и схему URI файла.

и т.д., подробный список тут

Для моего бота возможность более чем достаточно было. Решил поднять локальный Бот API и все получилось. Решил поделиться с вами чтобы вы тоже не тратили время на поиски и сразу по моей инструкции все сделали и запустили бота.

Установка Local Bot API на Ubuntu

Локального Bot API можно ставить на разные версии ОС тут подробности). Я выбрал Ubuntu/

Нам надо скачать и запустить вот эти команды по строга по очереди:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install make git zlib1g-dev libssl-dev gperf cmake g++
git clone --recursive https://github.com/tdlib/telegram-bot-api.git
cd telegram-bot-api
rm -rf build
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX:PATH=.. ..
cmake --build . --target install
cd ../..

Если вы не спешили и все команды по очереди вводили и получали результат то, поздравляю вы установили Local Bot API

Запуск Local Bot API

Чтобы запустить сервер нам необходимо получить api_id и api_hash, как это сделать написано подробно вот тут. От себя добавлю что у меня это получилось примерно с 15 раза. Пытайтесь, пробуйте разные варианты имен для приложения и у Вас тоже получиться.

Как только получите эти данные, никому их не передавайте)

1-й этап просто запустим сервер и посмотрим все ли хорошо, переходим в ту папку куда установлен сервер (обычно это папка /root) и запускаем команду:

telegram-bot-api/bin/telegram-bot-api --local --api-id=<api_id> --api-hash=<api_hash>

если после этой команды не высветилась ошибка то сервер успешно запустился. Остановить можно с помощью CRTL+C

Чтобы сервер запускался сам автоматически добавляем его в systemd/

sudo nano /etc/systemd/system/tg-bot-api.service

Выставляете свои данные your_dir, api_id и api_hash и сохраняйте.

[Unit]
After=network.target
Description=BotAPI
[Service]
Type=simple
WorkingDirectory=/<your_dir>/
ExecStart=/<your_dir>/telegram-bot-api/bin/telegram-bot-api --local --api-id=<api_id> --api-hash=<api_hash>
Restart=always
[Install]
WantedBy=multi-user.target

Вот теперь с помощи команды запускаем сервер

sudo systemctl start tg-bot-api.service

Добавляем в автозапуск

sudo systemctl enable tg-bot-api.service

Чтобы проверить можно набрать команду

curl http://localhost:8081

Если сервер правильно запустился то покажет вот такой ответ:

{"ok":false,"error_code":404,"description":"Not Found"}

Перевод Бота на ваш Local Bot API

Чтобы Ваш бот начал работать с Local Bot API его надо вывести с сервера телеграм. Это называется logOut.

Вот небольшой скрипт который использует библиотеку aiogram:

from aiogram import Bot
bot = Bot(token='API_TOKEN')
async def main():
    await bot.log_out()
if __name__ == '__main__':
    import asyncio
    asyncio.run(main())

После запуска этого скрипта Бот вылетит из телеграм сервера, вот теперь можно работать и с вашим Local Bot API

Вот небольшой пример кода как надо настраивать Бота. Давайте сделаем так что при получение команды /largefile бот отправит пользователю файл 50мб

from aiogram import Bot, Dispatcher, executor, types
from aiogram.bot.api import TelegramAPIServer
local_server = TelegramAPIServer.from_base('http://localhost:8081')
bot = Bot(token='API_TOKEN', server=local_server)
dp = Dispatcher(bot)
LARGE_FILE = "путь к файлу который весит 50мб"
@dp.message_handler(commands=['largefile'])
async def large_file(message: types.Message):
    await bot.send_document(
        chat_id=message.from_user.id,
        document=open(LARGE_FILE, 'rb'),
        caption='Test!',
    )
if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

Вот после этого скрипта ваш бот будет привязан к вашему Local Bot API