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
@BotFather'ni oching
Telegram'da rasmiy @BotFather botini toping va /newbot buyrug'ini yuboring.
Nom bering
Nom (name) kontakt kartasida ko'rinadi va keyin o'zgartirilishi mumkin, masalan «Do'kon yordamchisi».
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.
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.
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.
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.
| Mezon | getUpdates (long polling) | Webhook |
|---|---|---|
| Qanday ishlaydi | Dasturingiz Telegram'dan o'zi so'raydi va javobni timeout soniyagacha kutadi | Telegram har bir update'ni sizning HTTPS manzilingizga POST qiladi |
| Server talabi | Ochiq manzil kerak emas — noutbukda ham ishlaydi | Ochiq HTTPS manzil va haqiqiy SSL sertifikat; redirect qo'llab-quvvatlanmaydi |
| Portlar | Ahamiyatsiz | Faqat 443, 80, 88 yoki 8443 |
| Parallellik | Bitta jarayon navbat bilan o'qiydi | max_connections 1–100, standart 40 |
| Tasdiqlash | offset = oxirgi update_id + 1 | 2XX javob; aks holda Telegram qayta urinadi |
| Qachon qulay | Lokal ishlab chiqish, kichik botlar | Ishlab chiqarish, serverless, bir nechta bot |
Lokal ishlab chiqish: getUpdates sikli
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.
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
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.
| Holat | Limit |
|---|---|
| Xabar matni | 1–4096 belgi |
| Media izohi (caption) | 0–1024 belgi |
| Rasm, multipart yuklash | 10 MB; eni va bo'yi yig'indisi 10000 dan oshmaydi, nisbat 20 dan oshmaydi |
| Boshqa fayllar, multipart yuklash | 50 MB |
| HTTPS havola orqali yuborish | rasm 5 MB, boshqa fayllar 20 MB |
file_id orqali qayta yuborish | limit 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 serveringiz | yuklash 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.
| Qayerga | Limit |
|---|---|
| Bitta chatga | sekundiga 1 xabardan oshirmaslik tavsiya etiladi; qisqa portlashlarga ruxsat bor |
| Guruhga | daqiqasiga 20 xabardan ko'p emas |
| Ommaviy xabarnoma (turli foydalanuvchilarga) | sekundiga taxminan 30 xabar |
| Pullik broadcast yoqilganda | sekundiga 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
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 pastdaSDK 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_tokenbilan va har so'rovda sarlavha tekshiriladi. allowed_updatesda faqat kerakli update turlari (masalan, message, callback_query).update_idbo'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.
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").