Telegram Bot Yaratishda Eng Ko'p Uchraydigan 7 Xato va Ularning Yechimi
Muallif: Javohir Abdullayev · · Telegram botlar

Telegram Bot Ishlab Chiqishda Nega Xatolar Ko'p Uchraydi?
Telegram botlar bugungi kunda O'zbekistonda biznes va xizmatlar uchun eng ommabop vositaga aylandi. Ko'plab yosh dasturchilar aynan Python va aiogram kutubxonasi orqali dasturlash olamiga kirib kelishadi. Ammo loyiha foydalanuvchilari soni bir necha yuztadan oshishi bilan bot sekinlasha boshlaydi, xabarlar adashadi yoki server kutilmaganda to'xtab qoladi.
Ushbu maqolada Telegram bot yaratish jarayonida eng ko'p yo'l qo'yiladigan 7 ta jiddiy texnik xatoni va ularni professional tarzda bartaraf etish usullarini ko'rib chiqamiz.
1. Bot Tokenini Kod Ichida Qoldirish (Hardcoded Secrets)
Eng xavfli va afsuski eng keng tarqalgan xatolardan biri bu bot tokenini to'g'ridan-to'g'ri Python fayli ichiga yozishdir. Kod GitHub yoki GitLab platformasiga yuklanganda bot tokeni o'g'irlanadi va botingiz boshqalar nazoratiga o'tib ketadi.
To'g'ri yechim: Muhit o'zgaruvchilari (environment variables) va .env faylidan foydalaning. Kutubxona sifatida python-decouple yoki pydantic-settings tavsiya etiladi.
from aiogram import Bot
from decouple import config
BOT_TOKEN = config('BOT_TOKEN')
bot = Bot(token=BOT_TOKEN).gitignore fayliga .env qatorini qo'shishni hech qachon unutmang.
2. Holat (State) Ma'lumotlarini Xotirada (In-Memory) Saqlash
Boshlang'ich dasturchilar ko'pincha MemoryStorage yordamida FSM (Finite State Machine) holatlarini saqlashadi yoki foydalanuvchi ma'lumotlarini oddiy Python lug'atida (dict) ushlab turishadi. Natijada bot qayta ishga tushganda (restart) barcha foydalanuvchilarning to'ldirayotgan arizalari va savatlari o'chib ketadi.
To'g'ri yechim: Holatlarni saqlash uchun Redis kabi tezkor xotira bazalaridan foydalaning:
from aiogram.fsm.storage.redis import RedisStorage
from redis.asyncio import Redis
redis = Redis(host='localhost', port=6379)
storage = RedisStorage(redis=redis)3. Sekin va Og'ir Kodlarni Asosiy Event Loop'da Ishlatish
Python'dagi asinxron kutubxonalar (aiogram, asyncio) bitta oqimda (single thread) ishlaydi. Agar siz bitta foydalanuvchi so'rovida requests.get(), og'ir fayllarni qayta ishlash yoki sinxron time.sleep() chaqirsangiz, butun bot to'xtab qoladi va boshqa foydalanuvchilarga javob bermaydi.
To'g'ri yechim: Barcha so'rovlar asinxron bo'lishi kerak. requests o'rniga aiohttp yoki httpx ishlating. Og'ir hisob-kitoblarni esa asyncio.to_thread() yoki Celery yordamida alohida fonga o'tkazing.
import asyncio
import aiohttp
# Noto'g'ri: time.sleep(5)
# To'g'ri:
await asyncio.sleep(5)
# Noto'g'ri: requests.get(url)
# To'g'ri:
async with aiohttp.ClientSession() as session:
async with session.get(url) as response:
data = await response.json()4. Telegram Cheklovlarini (Rate Limits) Hisobga Olmaslik
Barcha foydalanuvchilarga ommaviy xabar yuborish (broadcast) paytida dasturchilar ko'pincha barcha ID'lar bo'yicha sikl aylanib, await bot.send_message() chaqirishadi. Natijada Telegram botingizga 429 Too Many Requests: retry after X seconds xatosini beradi va xabarlar to'xtaydi.
Telegram sekundiga 30 tagacha xabar yuborishga ruxsat beradi. Ommaviy xabarlar uchun navbat tizimlari (masalan, Celery, RabbitMQ) yoki asinxron limitlar (asyncio.Semaphore) hamda aiogram-broadcaster kabi tayyor kutubxonalardan foydalanish shart.
5. Foydalanuvchi Kiritmasini Filtrlash va Validatsiyadan O'tkazmaslik
Foydalanuvchi yuborgan har qanday matn, telefon raqami yoki fayl formati kutilganidan boshqacha bo'lishi mumkin. Xom ma'lumotlarni to'g'ridan-to'g'ri ma'lumotlar bazasiga yozish xatolarga yoki SQL inyeksiyaga olib keladi.
Har doim matn uzunligini, formatini tekshiring. HTML yozuvlar bilan javob qaytarayotganda foydalanuvchi kiritgan matnni ekranlash (escaping) uchun html.escape() yoki aiogram.utils.text_decorations funksiyalaridan foydalaning.
6. Qayta Ishga Tushganda drop_pending_updates Ishlatmaslik
Bot ma'lum vaqt o'chirilgan yoki server nosozligi tufayli to'xtab qolgan bo'lsa, Telegram serverlarida xabarlar yig'ilib qoladi. Bot qayta yoqilganda barcha eski xabarlarni bir zumda qayta ishlashga urinadi, bu esa serverni qotirib qo'yishi yoki foydalanuvchilarga keraksiz eski javoblarni yuborishi mumkin.
To'g'ri yechim: Polling boshlanishidan oldin eski so'rovlarni tozalab tashlang:
await bot.delete_webhook(drop_pending_updates=True)
await dp.start_polling(bot)7. Global Xatolarni Ushlovchi (Error Handling) Middleware Yo'qligi
Bot kutilmagan vaziyatlarda (masalan, tashqi API javob bermaganda yoki foydalanuvchi botni bloklaganda) xatolik yuz bersa, bot foydalanuvchiga hech qanday javob bermaydi va sukut saqlaydi. Bu esa bot ishdan chiqdi degan taassurot uyg'otadi.
aiogram 3.x versiyasida xatoliklarni ushlash uchun maxsus Error Router mavjud:
from aiogram import Router
from aiogram.types.error_event import ErrorEvent
import logging
error_router = Router()
@error_router.errors()
async def global_error_handler(event: ErrorEvent):
logging.exception(f'Kutilmagan xatolik: {event.exception}')
if event.update.message:
await event.update.message.answer(
'Kechirasiz, tizimda nosozlik yuz berdi. Iltimos, keyinroq urinib ko\'ring.'
)Xulosa
Sifatli va millionlab foydalanuvchilarga bardosh beruvchi Telegram bot yaratish faqatgina tugmalarni chiqarishdan iborat emas. Asinxron dasturlash qoidalariga amal qilish, holatlarni Redis'da saqlash va limitlarni to'g'ri boshqarish sizning botingizni professional darajaga olib chiqadi.
Teglar: #telegram bot #aiogram #python #backend