Telegram botlarining ko'pchiligi api.telegram.org manziliga so'rov yuborib ishlaydi va bu ko'p hollarda yetarli. Lekin bot fayllar bilan ishlay boshlaganda cheklovlar seziladi: rasmiy hujjatlarga ko'ra standart Bot API orqali bot 20 MB gacha bo'lgan fayllarnigina yuklab oladi va 50 MB gacha bo'lgan fayllarnigina yubora oladi. Video, arxiv yoki katta PDF bilan ishlaydigan bot uchun bu jiddiy to'siq. Telegram bu muammo uchun ochiq kodli yechim taklif qiladi: Bot API serverini o'z serveringizda ishga tushirish.
Local server nima beradi
Telegram Bot API serverining manba kodi tdlib/telegram-bot-api omborida ochiq e'lon qilingan. U --local rejimida ishga tushirilganda bot bir qator kengaytirilgan imkoniyatlarga ega bo'ladi. Hujjatlarda keltirilgan asosiy farqlar quyidagicha:
- Fayllarni hajm cheklovisiz yuklab olish va 2000 MB gacha bo'lgan fayllarni yuborish.
- Fayl yuborishda serverdagi lokal yo'ldan foydalanish, ya'ni faylni HTTP orqali qayta yuklamasdan
file://URI bilan ko'rsatish. getFilefaylni yuklab olish havolasi o'rniga serverdagi mutlaq yo'lni qaytaradi.- Webhook uchun istalgan port va lokal IP manzil, shuningdek oddiy HTTP ishlatish imkoniyati.
Muhim jihat shundaki, bot baribir Telegram tarmog'i bilan bog'langan holda ishlaydi. Local server faqat bot bilan Telegram o'rtasidagi vositachini sizning serveringizga ko'chiradi, xabarlar va fayllar esa avvalgidek Telegram orqali foydalanuvchilarga yetib boradi.
Real misol: video studiya boti
Farg'onadagi kichik video studiya mijozlardan to'y va tadbir videolarini bot orqali qabul qilmoqchi deylik. Mijozlar telefondan 300-800 MB hajmdagi fayllarni yuboradi, bot ularni qabul qilib, montaj jamoasining saqlash diskiga joylashi kerak. Standart Bot API bilan bot bunday faylni yuklab ola olmaydi va getFile chaqiruvi xato qaytaradi. Local server o'rnatilgach, fayl to'g'ridan-to'g'ri serverning diskiga tushadi va bot uni oddiy fayl sifatida ko'chirib qo'yadi. Bunday yechim uchun VPS kerak bo'ladi, chunki oddiy shared hostingda o'z dasturingizni kompilyatsiya qilib, doimiy xizmat sifatida ishlatib bo'lmaydi.
api_id va api_hash olish
Local server Telegram'ga o'z nomidan ulanadi, shuning uchun unga ilova identifikatorlari kerak. Ularni my.telegram.org saytida Telegram akkauntingiz bilan kirib, "API development tools" bo'limida olasiz. Natijada ikki qiymat beriladi: raqamli api_id va satr ko'rinishidagi api_hash. Bu qiymatlar bot tokeni kabi maxfiy hisoblanadi, ularni ochiq repozitoriyga qo'ymang va faqat serverdagi konfiguratsiyada saqlang.
Serverda kompilyatsiya qilish
Rasmiy ombordagi ko'rsatmalar turli tizimlar uchun buyruqlarni beradi. Ubuntu yoki Debian uchun jarayon taxminan quyidagicha bo'ladi. Kompilyatsiya ko'p operativ xotira talab qilishi va bir necha o'n daqiqa davom etishi mumkin, kichik VPS'larda vaqtinchalik swap qo'shish yoki rasmiy hujjatlardagi kam xotira uchun tavsiyalardan foydalanish foydali.
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
Hamjamiyat tomonidan tayyorlangan Docker obrazlari ham mavjud, ular kompilyatsiya vaqtini tejaydi. Lekin ular rasmiy emas, shuning uchun ishlatishdan oldin manbasini va yangilanib turishini tekshiring.
systemd xizmati sifatida ishga tushirish
Server doimiy ishlashi va qayta yuklanishdan keyin o'zi ko'tarilishi kerak. Buning uchun alohida foydalanuvchi, fayllar uchun katalog va systemd xizmati yaratamiz. --http-port server tinglaydigan portni, --dir esa fayllar va ish ma'lumotlari saqlanadigan katalogni belgilaydi.
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 fayliga TELEGRAM_API_ID=... va TELEGRAM_API_HASH=... qatorlarini yozing; server bu muhit o'zgaruvchilarini o'qiy oladi. So'ng sudo systemctl enable --now telegram-bot-api bilan ishga tushiring. 8081-port tashqariga ochilmasligi kerak, aks holda token bilgan har kim serveringiz orqali so'rov yubora oladi.
Botni local serverga o'tkazish
Bot avval rasmiy serverda ishlagan bo'lsa, uni local serverga o'tkazishdan oldin api.telegram.org manzilida logOut metodini chaqirish kerak. Hujjatlarga ko'ra shundan keyin botni bir muddat, taxminan 10 daqiqa, rasmiy serverga qayta ulab bo'lmaydi, shuning uchun o'tishni rejalashtirib qiling.
curl "https://api.telegram.org/bot<TOKEN>/logOut"
Keyin bot kodida API manzilini almashtirish kifoya. Masalan, aiogram 3 da bu quyidagicha bajariladi:
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)
Disk va xavfsizlik haqida unutmang
Local rejimda yuklab olingan fayllar --dir katalogida qoladi va o'z-o'zidan o'chirilmaydi. Video studiya misolida bir necha hafta ichida disk to'lib qolishi mumkin, shuning uchun qayta ishlangan fayllarni boshqa joyga ko'chirib, eski fayllarni muntazam tozalaydigan skript yozing. Bot jarayoni bu fayllarni o'qiy olishi uchun ikkala xizmat bitta guruhga kiritilishi yoki katalog huquqlari to'g'ri sozlanishi kerak. Server versiyasini ham vaqti-vaqti bilan yangilab turing, chunki Telegram Bot API'ga yangi metodlar qo'shilganda ular local serverga ham yangi versiya orqali keladi.