Telegram Bot API'ni fayl saqlash sifatida ishlatish: Django loyihasiga ulash

10 Sen 2026 41 ko'rish 1 ~7 min
Telegram Bot API'ni fayl saqlash sifatida ishlatish: Django loyihasiga ulash

Har qanday veb-loyihaning muammolaridan biri β€” fayllarni qayerda saqlash kerak. Rasm, hujjat, video, backup fayllar... Ular vaqt o'tishi bilan gigabaytlab joy egallaydi, server diskini to'ldiradi, va agar bulutli saqlash (S3, Cloudinary, DigitalOcean Spaces) ishlatmoqchi bo'lsangiz β€” bu allaqachon pul degani. Kichik loyihalar, pet-project'lar yoki MVP bosqichidagi startaplar uchun bu xarajat ba'zan asossiz tuyuladi.

Shu yerda kutilmagan, ammo juda amaliy yechim bor: Telegram Bot API. Telegram fayllarni saqlash uchun rasmiy "storage service" sifatida taqdim etilmagan, lekin texnik jihatdan u aynan shunday ishlaydi β€” cheksiz bepul joy, tezkor CDN orqali yetkazib berish, va oddiy REST API. Ushbu maqolada men bu yondashuvni qanday qilib Django loyihasiga ulash mumkinligini, qanday cheklovlar borligini va qachon undan foydalanish mantiqiy ekanini ko'rib chiqaman. Maqola oxirida mavzuni video darslik bilan ham mustahkamlaysiz.

Nega aynan Telegram?

G'oya oddiy: siz o'z botingizga (yoki maxsus kanalga) faylni yuborasiz, Telegram esa unga file_id beradi β€” bu ID orqali istalgan vaqt faylni qayta yuklab olish mumkin. Amalda bu quyidagini beradi:

  • Bepul va cheksiz β€” hech qanday oylik to'lov, hech qanday kvota yo'q (oqilona foydalanish doirasida).
  • Tezkor yetkazib berish β€” Telegram o'zining global CDN infratuzilmasidan foydalanadi, fayllar dunyoning istalgan nuqtasidan tez yuklanadi.
  • Oddiy API β€” HTTP so'rov yuborish yetarli, murakkab SDK yoki autentifikatsiya sozlamalari kerak emas.
  • Tayyor infratuzilma β€” agar loyihangizda allaqachon Telegram bot ishlatilayotgan bo'lsa (masalan, bildirishnomalar uchun), qo'shimcha xizmat ulashning hojati yo'q.

Albatta, bu S3 yoki Cloudinary'ning to'liq o'rnini bosolmaydi. Qaysi holatda qaysi birini tanlash kerakligini pastdagi jadvalda solishtiramiz.

Telegram vs an'anaviy bulutli saqlash

Mezon Telegram Bot API S3 / Cloudinary
Narx Bepul Hajmga qarab oylik to'lov
Sozlash tezligi Bir necha daqiqa (bot yaratish yetarli) Hisob, kalitlar, bucket sozlash kerak
Fayl hajmi chegarasi 50 MB (standart Bot API) Amalda cheksiz
Kafolatlangan saqlanish Yo'q (SLA berilmagan) Bor, shartnoma bilan
Eng mos vazifa MVP, backup, kichik media Production, katta trafik

Texnik jihatdan qanday ishlaydi

Jarayon uch qadamdan iborat:

  1. Yuklash β€” sendDocument yoki sendPhoto metodi orqali fayl botga (yoki xususiy kanalga) yuboriladi.
  2. file_id ni saqlash β€” Telegram javobida qaytargan file_id qiymatini o'z bazangizga (masalan, Django modelining bitta CharField maydoniga) yozib qo'yasiz.
  3. Qayta olish β€” kerak bo'lganda getFile metodi bilan file_id orqali faylning haqiqiy yuklab olish havolasini so'rab olasiz.

Arxitektura diagrammasi: so'rovning Django, Telegram Bot API va Telegram Cloud orasidagi yo'li
Arxitektura diagrammasi: so'rovning Django, Telegram Bot API va Telegram Cloud orasidagi yo'li

import requests

BOT_TOKEN = "..."
STORAGE_CHAT_ID = "@mening_arxiv_kanalim"  # yoki xususiy kanal ID

def upload_to_telegram(file_path: str) -> str:
    """Faylni Telegramga yuklaydi va file_id qaytaradi."""
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/sendDocument"
    with open(file_path, "rb") as f:
        resp = requests.post(
            url,
            data={"chat_id": STORAGE_CHAT_ID},
            files={"document": f},
        )
    resp.raise_for_status()
    result = resp.json()["result"]
    return result["document"]["file_id"]


def get_download_url(file_id: str) -> str:
    """file_id orqali vaqtinchalik yuklab olish havolasini oladi."""
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/getFile"
    resp = requests.get(url, params={"file_id": file_id})
    resp.raise_for_status()
    file_path = resp.json()["result"]["file_path"]
    return f"https://api.telegram.org/file/bot{BOT_TOKEN}/{file_path}"

E'tibor bering: getFile qaytargan havola vaqtinchalik (odatda bir necha soat amal qiladi). Shuning uchun uni to'g'ridan-to'g'ri foydalanuvchiga ko'rsatish o'rniga, so'rov kelganda serverda yangilab, keyin redirect qilish kerak bo'ladi.

Django'ga ulash: maxsus Storage backend

Eng toza yondashuv β€” Django'ning Storage abstraksiyasidan foydalanish. Shunda FileField va ImageField hech narsani bilmagan holda, oddiy fayl kabi ishlashda davom etadi, faqat orqa fonda fayl Telegramga ketadi:

# core/storage.py
from django.core.files.storage import Storage
from django.conf import settings
import requests


class TelegramStorage(Storage):
    def _save(self, name, content):
        url = f"https://api.telegram.org/bot{settings.TELEGRAM_BOT_TOKEN}/sendDocument"
        resp = requests.post(
            url,
            data={"chat_id": settings.TELEGRAM_STORAGE_CHAT_ID},
            files={"document": (name, content)},
        )
        resp.raise_for_status()
        file_id = resp.json()["result"]["document"]["file_id"]
        # file_id'ni fayl nomi sifatida saqlaymiz β€”
        # keyinchalik shu orqali qayta topamiz
        return file_id

    def _open(self, name, mode="rb"):
        raise NotImplementedError("Telegram fayllari to'g'ridan-to'g'ri o'qilmaydi")

    def url(self, name):
        # amalda bu yerda getFile natijasini keshlab qaytarish kerak
        from core.telegram import get_download_url
        return get_download_url(name)

    def exists(self, name):
        return False  # har doim yangi file_id yaratilaveradi

Shundan so'ng settings.py ichida:

DEFAULT_FILE_STORAGE = "core.storage.TelegramStorage"

Va model darajasida hech qanday o'zgarish shart emas β€” models.FileField(upload_to="blog/files/") avvalgidek ishlayveradi, faqat endi fayl diskda emas, Telegram serverlarida saqlanadi.

Fayl yuklash va qayta olish jarayoni β€” 6 bosqichli to'liq oqim
Fayl yuklash va qayta olish jarayoni β€” 6 bosqichli to'liq oqim

Xavfsizlik: bot tokenini qanday himoyalash kerak

Bot tokeni β€” amalda parolingiz. Uni hech qachon kodga yozib commit qilmang. Aynan shu loyihada ham bot tokeni .env faylida saqlanadi va settings.py ichida os.environ.get('TELEGRAM_BOT_TOKEN', '') orqali o'qiladi β€” xuddi shu naqshni TelegramStorage uchun ham ishlatish kerak. Agar token qandaydir tarzda oshkor bo'lib qolsa, uni @BotFather orqali darhol qayta generatsiya qiling β€” eskisi shu zahoti ishlamay qoladi.

Muhim cheklovlar

Bu yondashuvni ishlatishdan oldin bilishingiz kerak bo'lgan real cheklovlar bor:

  • Fayl hajmi β€” standart (bulutli) Bot API orqali maksimal 50 MB (yuklash) / 20 MB (yuklab olish) chegarasi bor. Buni 2 GB gacha qanday ko'tarish mumkinligini pastda, "Chegarani 2 GB gacha ko'tarish" bo'limida to'liq ko'rib chiqamiz.
  • file_id "abadiy" emas β€” Telegram vaqti-vaqti bilan eski, kam ishlatiladigan fayllarni serverlaridan tozalab turishi mumkin. Muhim, qayta tiklab bo'lmaydigan ma'lumotlar uchun bu yagona manba bo'lmasligi kerak.
  • Rate limit β€” Telegram Bot API sekundiga taxminan 30 ta so'rovga cheklov qo'yadi. Yuqori trafikli loyihalar uchun navbat (queue) mexanizmi kerak bo'ladi.
  • Kechikish β€” har bir yuklash tashqi API'ga tarmoq so'rovi degani, bu local diskka yozishdan sezilarli sekinroq.
  • Google, GDPR va shartnoma masalalari β€” foydalanuvchi ma'lumotlarini uchinchi tomon xizmatida saqlash haqida to'g'ri ma'lumot berish (Privacy Policy) zarur.

Chegarani 2 GB gacha ko'tarish: Local Bot API Server

Yuqorida aytilgan 50/20 MB chegarasi "Telegram'ning o'zi shunday ekan" degani emas β€” bu aslida api.telegram.org orqali ishlaydigan bulutli (cloud) Bot APIning cheklovi, xolos. Telegram buning yonida ikkinchi, kam kishi biladigan variantni ham taqdim etadi: Local Bot API Server.

Bu β€” Telegram tomonidan ochiq kodda chiqarilgan (tdlib/telegram-bot-api), siz o'z serveringizda ishga tushiradigan alohida dastur. U oddiy Telegram mijoz-ilovalari foydalanadigan MTProto protokoli orqali to'g'ridan-to'g'ri Telegram'ning data-markazlariga ulanadi β€” shu sababli HTTP Bot API'dagi sun'iy cheklovlar olib tashlanadi:

  • Yuklash (upload) limiti: 50 MB β†’ 2000 MB (2 GB)
  • Yuklab olish (download) limiti: 20 MB β†’ amalda deyarli cheklovsiz

Cloud Bot API (50/20 MB) va Local Bot API Server (2000 MB) solishtiruvi
Cloud Bot API (50/20 MB) va Local Bot API Server (2000 MB) solishtiruvi

Qanday ishga tushiriladi

Ikki narsa kerak bo'ladi: my.telegram.org saytidan olinadigan api_id va api_hash (bot tokenidan farqli, bu β€” ilovangiz uchun beriladigan hisob ma'lumotlari), va serverni ko'tarish uchun Docker:

docker run -d \
  --name telegram-bot-api \
  -p 8081:8081 \
  -e TELEGRAM_API_ID=123456 \
  -e TELEGRAM_API_HASH=your_api_hash \
  -v telegram-bot-api-data:/var/lib/telegram-bot-api \
  aiogram/telegram-bot-api:latest

Shundan so'ng bot kodingizda faqat bitta narsa o'zgaradi β€” so'rov manzili:

# avval
BASE_URL = "https://api.telegram.org"

# endi (o'z serveringiz)
BASE_URL = "http://localhost:8081"

url = f"{BASE_URL}/bot{BOT_TOKEN}/sendDocument"

sendDocument, getFile β€” barcha metodlar bir xil nom va parametrlar bilan ishlayveradi, faqat manzil o'zgardi.

Bu nega "bepul, lekin tekinga tushmaydi"

2 GB chegara pulsiz, ammo evazsiz emas:

  • Endi bu β€” sizning serveringizda ishlayotgan, o'zingiz kuzatib turishingiz kerak bo'lgan qo'shimcha xizmat (Docker konteyner yoki systemd service). U ham qulab tushishi, xotira yeyishi, yangilanishi mumkin.
  • api_id/api_hash β€” bu ham maxfiy ma'lumot, bot tokeni kabi ehtiyotkorlik bilan saqlanishi kerak.
  • Kichik, past trafikli loyiha uchun bu murakkablik ortiqcha bo'lishi mumkin β€” agar fayllaringiz 50 MB dan oshmasa, oddiy bulutli Bot API to'liq yetarli.

Xulosa: agar loyihangizda video yoki katta hajmli fayllar bilan ishlash rejalashtirilgan bo'lsa, Local Bot API Server β€” pullik bulutli saqlashga o'tishdan oldingi juda arzon oraliq bosqich bo'la oladi.

Qachon ishlatish mantiqiy?

Men buni quyidagi holatlarda tavsiya qilardim:

  • Pet-project yoki MVP β€” budjet yo'q, lekin ishonchli fayl saqlash kerak.
  • Backup arxivi β€” masalan, kunlik baza backup'larini alohida "arxiv" kanaliga yuborish (bu, aytmoqchi, ayni shu loyihada rejalashtirilgan celery.service orqali amalga oshirilishi mumkin).
  • Vaqtinchalik yoki katta bo'lmagan media fayllar β€” blog rasm-videolari, foydalanuvchi tomonidan yuklangan kichik hujjatlar.

Va quyidagi holatlarda ishlatmang:

  • Katta hajmli media (video streaming, yuqori sifatli galereya) β€” bu yerda haqiqiy CDN (Cloudflare, S3 + CloudFront) kerak.
  • Yuqori yozish tezligi talab qilinadigan tizimlar β€” rate limit sizni tezda cheklab qo'yadi.
  • Qonuniy jihatdan qat'iy ma'lumotlar saqlash talablari bo'lgan loyihalar (bank, tibbiyot va h.k.).

Video darslik

Sahifa boshidagi video β€” "How to run your own local Telegram Bot API server" β€” aynan yuqorida tasvirlangan Local Bot API Server'ni amalda qanday ishga tushirish kerakligini ko'rsatadi: server ko'tarish, api_id/api_hash sozlash va botni shu serverga ulash. 2 GB limitni real loyihada qo'llashdan oldin ko'rib chiqishga arziydi.

Xulosa

Telegram Bot API'ni fayl saqlash sifatida ishlatish β€” "hack" ma'nosida ayyorlik emas, balki mavjud, ishonchli infratuzilmadan oqilona foydalanish usuli. Kichik va o'rta loyihalar uchun u pulli bulutli saqlash xizmatlariga arzon, tez sozlanadigan alternativa bo'la oladi. Asosiysi β€” uning cheklovlarini oldindan bilib, unga faqat mos keladigan vazifalarni yuklash kerak: kritik ma'lumotlar uchun emas, balki qo'shimcha, arzon qatlam sifatida.

Keyingi maqolada shu TelegramStorage klassini to'liq ishlaydigan holatga keltirib, getFile havolalarini keshlash va avtomatik yangilash mexanizmini ham ko'rsataman.

Izohlar (1)

Sardor dev 10 Sen 2026, 23:42

Yaxshi maqola bolibdi

Izoh qoldirish