Я недавно столкнулся с задачей которую нельзя было выполнить обычным Bot API, так как там есть ограничения по размеру отправляемых данных. А мне нужно было перепрыгнуть такие ограничения, Прочитал несколько статей, попробовал некоторые из них. Все безрезультатно. 📂 my_it_space
Потом узнал что можно поднять локальный Bot API и можно будет получить вот такие привилегии:
- Загружайте файлы без ограничений по размеру.
- Загружайте файлы размером до 2000 МБ.
и т.д., подробный список тут
Для моего бота возможность более чем достаточно было. Решил поднять локальный Бот 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