Telegram ботларининг кўпчилиги api.telegram.org манзилига сўров юбориб ишлайди ва бу кўп ҳолларда етарли. Лекин бот файллар билан ишлай бошлаганда чекловлар сезилади: расмий ҳужжатларга кўра стандарт Bot API орқали бот 20 MB гача бўлган файлларнигина юклаб олади ва 50 MB гача бўлган файлларнигина юбора олади. Видео, архив ёки катта PDF билан ишлайдиган бот учун бу жиддий тўсиқ. Telegram бу муаммо учун очиқ кодли ечим таклиф қилади: Bot API серверини ўз серверингизда ишга тушириш.
Локал сервер нима беради
Telegram Bot API серверининг манба коди tdlib/telegram-bot-api омборида очиқ эълон қилинган. У --local режимида ишга туширилганда бот бир қатор кенгайтирилган имкониятларга эга бўлади. Ҳужжатларда келтирилган асосий фарқлар қуйидагича:
- Файлларни ҳажм чекловисиз юклаб олиш ва 2000 MB гача бўлган файлларни юбориш.
- Файл юборишда сервердаги локал йўлдан фойдаланиш, яъни файлни HTTP орқали қайта юкламасдан
file://URI билан кўрсатиш. getFileфайлни юклаб олиш ҳаволаси ўрнига сервердаги мутлақ йўлни қайтаради.- Webhook учун исталган порт ва локал IP манзил, шунингдек оддий HTTP ишлатиш имконияти.
Муҳим жиҳат шундаки, бот барибир Telegram тармоғи билан боғланган ҳолда ишлайди. Локал сервер фақат бот билан Telegram ўртасидаги воситачини сизнинг серверингизга кўчиради, хабарлар ва файллар эса аввалгидек Telegram орқали фойдаланувчиларга етиб боради.
Реал мисол: видео студия боти
Фарғонадаги кичик видео студия мижозлардан тўй ва тадбир видеоларини бот орқали қабул қилмоқчи дейлик. Мижозлар телефондан 300-800 MB ҳажмдаги файлларни юборади, бот уларни қабул қилиб, монтаж жамоасининг сақлаш дискига жойлаши керак. Стандарт Bot API билан бот бундай файлни юклаб ола олмайди ва getFile чақируви хато қайтаради. Локал сервер ўрнатилгач, файл тўғридан-тўғри сервернинг дискига тушади ва бот уни оддий файл сифатида кўчириб қўяди. Бундай ечим учун VPS керак бўлади, чунки оддий shared хостингда ўз дастурингизни компиляция қилиб, доимий хизмат сифатида ишлатиб бўлмайди.
api_id ва api_hash олиш
Локал сервер Telegram'га ўз номидан уланади, шунинг учун унга илова идентификаторлари керак. Уларни my.telegram.org сайтида Telegram аккаунтингиз билан кириб, "API development tools" бўлимида оласиз. Натижада икки қиймат берилади: рақамли api_id ва сатр кўринишидаги api_hash. Бу қийматлар бот токени каби махфий ҳисобланади, уларни очиқ репозиторийга қўйманг ва фақат сервердаги конфигурацияда сақланг.
Серверда компиляция қилиш
Расмий омбордаги кўрсатмалар турли тизимлар учун буйруқларни беради. Ubuntu ёки Debian учун жараён тахминан қуйидагича бўлади. Компиляция кўп оператив хотира талаб қилиши ва бир неча ўн дақиқа давом этиши мумкин, кичик VPS'ларда вақтинчалик swap қўшиш ёки расмий ҳужжатлардаги кам хотира учун тавсиялардан фойдаланиш фойдали.
sudo apt-get update
sudo apt-get install -y 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=/usr/local ..
cmake --build . --target install
telegram-bot-api --help
Ҳамжамият томонидан тайёрланган Docker образлари ҳам мавжуд, улар компиляция вақтини тежайди. Лекин улар расмий эмас, шунинг учун ишлатишдан олдин манбасини ва янгиланиб туришини текширинг.
systemd хизмати сифатида ишга тушириш
Сервер доимий ишлаши ва қайта юкланишдан кейин ўзи кўтарилиши керак. Бунинг учун алоҳида фойдаланувчи, файллар учун каталог ва systemd хизмати яратамиз. --http-port сервер тинглайдиган портни, --dir эса файллар ва иш маълумотлари сақланадиган каталогни белгилайди.
sudo useradd -r -s /usr/sbin/nologin tgapi
sudo mkdir -p /var/lib/telegram-bot-api
sudo chown tgapi:tgapi /var/lib/telegram-bot-api
# /etc/systemd/system/telegram-bot-api.service
[Unit]
Description=Telegram Bot API local server
After=network.target
[Service]
User=tgapi
EnvironmentFile=/etc/telegram-bot-api.env
ExecStart=/usr/local/bin/telegram-bot-api --local --http-port=8081 \
--http-ip-address=127.0.0.1 --dir=/var/lib/telegram-bot-api
Restart=always
[Install]
WantedBy=multi-user.target
/etc/telegram-bot-api.env файлига TELEGRAM_API_ID=... ва TELEGRAM_API_HASH=... қаторларини ёзинг; сервер бу муҳит ўзгарувчиларини ўқий олади. Сўнг sudo systemctl enable --now telegram-bot-api билан ишга туширинг. 8081-порт ташқарига очилмаслиги керак, акс ҳолда токен билган ҳар ким серверингиз орқали сўров юбора олади.
Ботни локал серверга ўтказиш
Бот аввал расмий серверда ишлаган бўлса, уни локал серверга ўтказишдан олдин api.telegram.org манзилида logOut методини чақириш керак. Ҳужжатларга кўра шундан кейин ботни бир муддат, тахминан 10 дақиқа, расмий серверга қайта улаб бўлмайди, шунинг учун ўтишни режалаштириб қилинг.
curl "https://api.telegram.org/bot<TOKEN>/logOut"
Кейин бот кодида API манзилини алмаштириш кифоя. Масалан, aiogram 3 да бу қуйидагича бажарилади:
from aiogram import Bot
from aiogram.client.session.aiohttp import AiohttpSession
from aiogram.client.telegram import TelegramAPIServer
session = AiohttpSession(
api=TelegramAPIServer.from_base("http://127.0.0.1:8081", is_local=True)
)
bot = Bot(token=TOKEN, session=session)
Диск ва хавфсизлик ҳақида унутманг
Локал режимда юклаб олинган файллар --dir каталогида қолади ва ўз-ўзидан ўчирилмайди. Видео студия мисолида бир неча ҳафта ичида диск тўлиб қолиши мумкин, шунинг учун қайта ишланган файлларни бошқа жойга кўчириб, эски файлларни мунтазам тозалайдиган скрипт ёзинг. Бот жараёни бу файлларни ўқий олиши учун иккала хизмат битта гуруҳга киритилиши ёки каталог ҳуқуқлари тўғри созланиши керак. Сервер версиясини ҳам вақти-вақти билан янгилаб туринг, чунки Telegram Bot API'га янги методлар қўшилганда улар локал серверга ҳам янги версия орқали келади.