Asosiy mazmunga o'tish
Socialift
Qo'llanma

Python'da Telegram bot yaratish: tokendan ishlab chiqarishgacha

Python'da Telegram bot yaratish uchun @BotFather'da /newbot buyrug'i bilan token olasiz va Bot API'ga HTTPS so'rov yuborasiz. Yangilanishlarni ikki usulda olish mumkin: getUpdates (long polling) yoki webhook — lekin bir vaqtda faqat bittasi. Ishlab chiqarishda webhook'ni secret_token bilan himoyalang, limitlarga rioya qiling va 429 xatosida retry_after soniya kuting.

Yangilangan:

Telegram bot qanday ishlaydi?

Bot — Telegram'dagi maxsus akkaunt, uni dasturingiz boshqaradi. Har bir amal oddiy HTTPS so'rov: https://api.telegram.org/bot<token>/METOD_NOMI. Foydalanuvchi botga yozganda Telegram bu hodisani «update» sifatida saqlaydi, siz uni getUpdates bilan olasiz yoki Telegram uni webhook manzilingizga POST qiladi. Javob berish — yana bitta so'rov, masalan sendMessage.

Bot oddiy foydalanuvchidan farq qiladi: u suhbatni birinchi bo'lib boshlay olmaydi — odam avval botga yozishi yoki uni guruhga qo'shishi kerak. Guruhlarda esa standart holatda bot faqat o'ziga tegishli xabarlarni ko'radi (privacy mode, pastda batafsil).

Python uchun maxsus kutubxona shart emas: Bot API — oddiy JSON ustidagi HTTP. Lekin tayyor klient token maskalash, fayl yuklash (multipart), xatolarni tasniflash va qayta urinish kabi ishlarni o'z zimmasiga oladi. Quyidagi misollar asinxron Socialift Python SDK'dagi Telegram klienti bilan yozilgan (pip install socialift, Python 3.11+).

BotFather'da bot yaratish: 5 qadam

  1. @BotFather'ni oching

    Telegram'da rasmiy @BotFather botini toping va /newbot buyrug'ini yuboring.

  2. Nom bering

    Nom (name) kontakt kartasida ko'rinadi va keyin o'zgartirilishi mumkin, masalan «Do'kon yordamchisi».

  3. Username tanlang

    Username 5–32 belgi, faqat lotin harflari, raqamlar va pastki chiziq, oxiri «bot» bilan tugashi shart (masalan, dokon_uz_bot). Uni keyin o'zgartirib bo'lmaydi — ehtiyotkorlik bilan tanlang.

  4. Tokenni saqlang

    BotFather 110201543:AAHdqTc... ko'rinishidagi token beradi. Token kimda bo'lsa, bot o'shaning nazoratida — uni kodga yozmang, TELEGRAM_BOT_TOKEN muhit o'zgaruvchisida yoki sirlar omborida saqlang.

  5. Tokenni tekshiring

    getMe so'rovi (SDK'da bot.get_me()) bot profilini qaytarsa, token to'g'ri. Token sizib chiqsa, BotFather'dagi /token buyrug'i bilan yangisini oling — eskisi ishlamay qoladi.

Birinchi so'rov: tokenni tekshirish va xabar yuborish

Token kodda emas — Telegram.from_env() uni TELEGRAM_BOT_TOKEN dan o'qiydi.

hello_bot.py
import asyncio
from socialift import Telegram

async def main():
    async with Telegram.from_env() as bot:
        me = await bot.get_me()
        print("Bot:", me["username"])

        # chat_id — raqamli ID yoki kanal uchun @username
        await bot.send_message("@mening_kanalim", "<b>Salom!</b> Bot ishga tushdi.",
                               parse_mode="HTML")

asyncio.run(main())

Kanalga yozish uchun bot o'sha kanalda admin bo'lishi kerak. Shaxsiy chatga esa faqat botga avval /start bosgan foydalanuvchiga yoza olasiz — uning raqamli ID si kelgan update ichida bo'ladi.

Matnli xabar 1–4096 belgi, rasm yoki fayl izohi (caption) 0–1024 belgi bo'lishi mumkin. Uzun matnni bir nechta xabarga bo'ling.

getUpdates yoki webhook: qaysi birini tanlash kerak?

Ikkala usul bir-birini istisno qiladi: webhook o'rnatilgan bo'lsa getUpdates ishlamaydi. Olinmagan update'lar Telegram serverida ko'pi bilan 24 soat saqlanadi.

getUpdates yoki webhook: qaysi birini tanlash kerak? — Platformalar bo'yicha imkoniyatlar jadvali
MezongetUpdates (long polling)Webhook
Qanday ishlaydiDasturingiz Telegram'dan o'zi so'raydi va javobni timeout soniyagacha kutadiTelegram har bir update'ni sizning HTTPS manzilingizga POST qiladi
Server talabiOchiq manzil kerak emas — noutbukda ham ishlaydiOchiq HTTPS manzil va haqiqiy SSL sertifikat; redirect qo'llab-quvvatlanmaydi
PortlarAhamiyatsizFaqat 443, 80, 88 yoki 8443
ParallellikBitta jarayon navbat bilan o'qiydimax_connections 1–100, standart 40
Tasdiqlashoffset = oxirgi update_id + 12XX javob; aks holda Telegram qayta urinadi
Qachon qulayLokal ishlab chiqish, kichik botlarIshlab chiqarish, serverless, bir nechta bot

Lokal ishlab chiqish: getUpdates sikli

polling.py
from socialift import Telegram

async def run_polling():
    async with Telegram.from_env() as bot:
        await bot.delete_webhook()  # webhook turgan bo'lsa getUpdates ishlamaydi
        offset = None
        while True:
            updates = await bot.get_updates(offset=offset, timeout=25)
            for update in updates:
                offset = update["update_id"] + 1
                msg = update.get("message") or {}
                if msg.get("text") == "/start":
                    await bot.send_message(msg["chat"]["id"], "Xush kelibsiz!")

offset ni har javobdan keyin qayta hisoblang — aks holda bir xil update qayta keladi. Telegram'ning standart timeout qiymati 0 (qisqa so'rov); ishlab chiqarishda musbat qiymat bering.

Webhook'ni secret_token bilan himoyalash

Telegram webhook tanasini imzolamaydi. Buning o'rniga set_webhook da bergan secret_token har so'rovda X-Telegram-Bot-Api-Secret-Token sarlavhasida qaytadi — shu bilan soxta so'rovlarni ajratasiz.

webhook.py
import os
from aiohttp import web
from socialift import Telegram
from socialift.webhooks import verify_telegram_request

SECRET = os.environ["TG_WEBHOOK_SECRET"]  # 1–256 belgi: A-Z, a-z, 0-9, _ va -

async def setup(bot: Telegram) -> None:
    await bot.set_webhook("https://example.uz/tg/webhook", secret_token=SECRET,
                          allowed_updates=["message", "callback_query"])
    info = await bot.get_webhook_info()
    print(info["pending_update_count"], info.get("last_error_message"))

async def handle(request: web.Request) -> web.Response:
    if not verify_telegram_request(request.headers, SECRET):
        return web.Response(status=403)
    update = await request.json()
    await queue.put(update)  # og'ir ishni navbatga — javobni kechiktirmang
    return web.Response(text="ok")

verify_telegram_request sarlavhani doimiy vaqtda solishtiradi. Secret'ni secrets.token_urlsafe(32) bilan yarating — u faqat ruxsat etilgan belgilardan iborat.

Webhook ishlamasa, avval get_webhook_info() natijasidagi last_error_message va pending_update_count ga qarang. Telegram muvaffaqiyatsiz yetkazishni bir necha marta takrorlaydi, shuning uchun update_id bo'yicha takrorlarni tashlab yuboring.

Rasm, inline tugmalar va menyu klaviaturasi

keyboards.py
async def send_catalog(bot, chat_id: int) -> None:
    inline = {"inline_keyboard": [[
        {"text": "Katalog", "url": "https://example.uz/katalog"},
        {"text": "Buyurtma berish", "callback_data": "order:42"},
    ]]}
    await bot.send_photo(chat_id, "https://example.uz/banner.jpg",
                         caption="Yangi kolleksiya", reply_markup=inline)

    menu = {"keyboard": [[{"text": "Aloqa"}, {"text": "Savat"}]],
            "resize_keyboard": True}
    await bot.send_message(chat_id, "Bo'limni tanlang:", reply_markup=menu)

async def on_callback(bot, query: dict) -> None:
    await bot.answer_callback_query(query["id"], text="Qabul qilindi")

callback_data 1–64 bayt bo'ladi — unga butun obyekt emas, qisqa kalit yozing. Tugma bosilganda answer_callback_query ni albatta chaqiring: aks holda foydalanuvchi tugmada yuklanish belgisini ko'rib turadi.

Menyu klaviaturasi (ReplyKeyboardMarkup) kanallarda ishlamaydi. Rasmni file_id, HTTPS havola yoki baytlar ko'rinishida berish mumkin.

Fayl va xabar hajmi limitlari

Rasmiy Bot API serveri (api.telegram.org) uchun qiymatlar.

Fayl va xabar hajmi limitlari — Platformalar bo'yicha imkoniyatlar jadvali
HolatLimit
Xabar matni1–4096 belgi
Media izohi (caption)0–1024 belgi
Rasm, multipart yuklash10 MB; eni va bo'yi yig'indisi 10000 dan oshmaydi, nisbat 20 dan oshmaydi
Boshqa fayllar, multipart yuklash50 MB
HTTPS havola orqali yuborishrasm 5 MB, boshqa fayllar 20 MB
file_id orqali qayta yuborishlimit yo'q (file_id har bir botga xos)
Faylni yuklab olish (getFile)20 MB; havola kamida 1 soat amal qiladi
O'z lokal Bot API serveringizyuklash 2000 MB gacha, yuklab olish cheklovsiz

Guruhda bot nega xabarlarni ko'rmaydi? (privacy mode)

Guruhga qo'shilgan har bir bot standart holatda privacy mode'da ishlaydi. Bu rejimda bot faqat unga atalgan buyruqlarni (/command@bot_nomi), bot orqali yuborilgan xabarlarni va bot xabariga berilgan javoblarni oladi. Xizmat xabarlari, shaxsiy chatdagi xabarlar va bot a'zo bo'lgan kanal postlari rejimdan qat'i nazar keladi.

Bot guruhning barcha xabarlarini ko'rishi kerak bo'lsa, ikki yo'l bor: uni guruh admini qilish (admin botlar hamma xabarni oladi) yoki BotFather'da /setprivacy bilan rejimni o'chirish. Rejim o'zgargandan keyin botni guruhdan chiqarib, qayta qo'shish kerak — aks holda o'zgarish kuchga kirmaydi.

Telegram rejimni faqat haqiqatan zarur bo'lsa o'chirishni tavsiya qiladi. Ko'p hollarda bot xabariga «javob berish»ni so'rash (force reply) yetarli. Rejim holati guruh a'zolari ro'yxatida hammaga ko'rinadi.

Ommaviy yuborish limitlari

Bot API FAQ'dagi bepul limitlar. Oshib ketilsa, Telegram HTTP 429 va javobda parameters.retry_after qaytaradi.

Ommaviy yuborish limitlari — Platformalar bo'yicha imkoniyatlar jadvali
QayergaLimit
Bitta chatgasekundiga 1 xabardan oshirmaslik tavsiya etiladi; qisqa portlashlarga ruxsat bor
Guruhgadaqiqasiga 20 xabardan ko'p emas
Ommaviy xabarnoma (turli foydalanuvchilarga)sekundiga taxminan 30 xabar
Pullik broadcast yoqilgandasekundiga 1000 xabargacha; 30 dan ortiq har bir xabar 0,1 Stars
Izohlar va cheklovlar

Pullik broadcast'ni BotFather'da yoqish uchun botda kamida 100 000 Stars balansi va kamida 100 000 oylik faol foydalanuvchi bo'lishi kerak. Aks holda Telegram yuborishni uzoqroq vaqtga (masalan, 8–12 soat) taqsimlashni tavsiya qiladi.

429 xatosini to'g'ri ushlash

broadcast.py
import asyncio
import socialift

async def broadcast(bot, chat_ids: list[int], text: str) -> None:
    for chat_id in chat_ids:
        try:
            await bot.send_message(chat_id, text)
        except socialift.RateLimitError as exc:
            await asyncio.sleep(exc.retry_after or 5)
            await bot.send_message(chat_id, text)
        except socialift.PermissionError:
            mark_inactive(chat_id)  # foydalanuvchi botni bloklagan (403)
        await asyncio.sleep(0.05)  # ~20 xabar/s — 30/s chegarasidan pastda

SDK 429 javobini RateLimitError ga aylantiradi va standart RetryPolicy bo'yicha (3 urinish) o'zi qayta urinadi; urinishlar tugasa xato sizga chiqadi. retry_after bo'lmasa, zaxira pauza qo'ying.

403 xatosi (masalan, foydalanuvchi botni bloklagan) qayta urinish bilan tuzalmaydi — bunday chatni ro'yxatdan chiqaring.

Ishlab chiqarishga chiqishdan oldin

  • Token muhit o'zgaruvchisida yoki sirlar omborida; loglarda token ko'rinmaydi.
  • Webhook HTTPS'da, secret_token bilan va har so'rovda sarlavha tekshiriladi.
  • allowed_updates da faqat kerakli update turlari (masalan, message, callback_query).
  • update_id bo'yicha takroriy update'lar tashlab yuboriladi.
  • Webhook javobi tez qaytadi, og'ir ish navbatda bajariladi.
  • 429 va 403 xatolari alohida ushlanadi, ommaviy yuborish sekundiga 30 xabardan past.
  • Guruh ssenariysi uchun privacy mode yoki admin huquqi to'g'ri sozlangan.

← Blogga qaytish

Ko'p so'raladigan savollar

Telegram bot yaratish pullikmi?

Yo'q. BotFather'da bot yaratish va Bot API'dan foydalanish bepul. Pul faqat ixtiyoriy imkoniyatlarda paydo bo'ladi, masalan sekundiga 30 xabardan ko'p yuborish uchun pullik broadcast yoqilganda — u Telegram Stars bilan to'lanadi.

Bot foydalanuvchiga birinchi bo'lib yoza oladimi?

Yo'q. Telegram qoidasiga ko'ra foydalanuvchi avval botga yozishi yoki uni guruhga qo'shishi kerak. Shuning uchun t.me/bot_nomi havolasini sayt, reklama yoki QR-kod orqali tarqating va /start dan keyin kelgan chat ID ni saqlang.

Bot tokeni sizib chiqsa nima qilish kerak?

BotFather'da /token buyrug'i bilan yangi token oling — eski token ishlamay qoladi. Keyin yangi tokenni serveringizdagi muhit o'zgaruvchisiga yozing va webhook'ni qayta o'rnating. Tokenni hech qachon git repozitoriyga yoki mijoz tomoni kodiga qo'ymang.

Webhook o'rnatildi, lekin update kelmayapti. Nimani tekshirish kerak?

Avval getWebhookInfo javobidagi last_error_message ni o'qing. Keyin port 443, 80, 88 yoki 8443 ekanini, SSL sertifikat haqiqiyligini va manzil redirect qilmasligini tekshiring. Webhook turganda getUpdates ishlamasligini ham unutmang.

Bot guruhdagi hamma xabarlarni qanday o'qiydi?

Botni guruh admini qiling yoki BotFather'da /setprivacy bilan privacy mode'ni o'chiring va botni guruhga qayta qo'shing. Shunda ham bot boshqa botlarning xabarlarini olmaydi, Bot API'da esa chat tarixini o'qiydigan metod yo'q — bot faqat yangi update'larni ko'radi.

Python'da Telegram bot uchun qaysi kutubxona kerak?

Bot API oddiy HTTPS + JSON bo'lgani uchun istalgan HTTP klient yetadi. Tayyor klient esa fayl yuklash, xatolarni tasniflash va qayta urinishni hal qiladi: Socialift SDK'da bu asinxron Telegram klienti, SDK'da alohida o'ralmagan metodlar uchun esa bot.call("metodNomi").

Manbalar

  1. Telegram Bot API
  2. Telegram Bot Features: BotFather va privacy mode
  3. Telegram Bots FAQ: limitlar va webhook
  4. Telegram Bots: botlar foydalanuvchidan nimasi bilan farq qiladi

Bog'liq sahifalar