Aiogram telegtam-bot
October 13

AIOgram 1-dars

Python va aiogram yordamida Telegram-bot yaratishni o‘rganmoqchisiz. Quyida bosqichma-bosqich, oddiy va ishlaydigan misollar bilan tushuntiraman: muharrir, virtual muhit, aiogram o‘rnatish, birinchi bot (echo), yangilanishlarni olish (polling), «raqamni toping» o‘yincha va filtrlar. Kodlar aiogram (v2) ga mos yozilgan (eng keng tarqalgan va boshlovchilar uchun oddiyroq).

1) Tayyorlov: Python, kod muharriri, virtual muhit

  1. Python o‘rnatish: Python 3.8+ ni rasmiy saytdan o‘rnating.
  2. Kod muharrirlari:
    • VS Code — yengil va kengaytmalar bilan.
    • PyCharm — to‘liq IDE (Community bepul).
  3. Virtual muhit (Windows / macOS / Linux):
    • Loyihaning papkasiga o‘ting va: python -m venv venv
    • Muhitni faollashtirish:
      • Windows: venv\Scripts\activate
      • macOS/Linux: source venv/bin/activate
    • O‘rnatish paketlarini yangilash: pip install --upgrade pip

2) Aiogram o‘rnatish

Virtual muhit faollashganidan keyin:

pip install aiogram

(Standart: aiogram paketini o‘rnatadi. Agar sizga maxsus versiya kerak bo‘lsa, pip install aiogram==X.Y.Z deb yoziladi.)

3) Bot tokenini olish

  1. Telegramda @BotFather ga yozing.
  2. /newbot buyrug‘i → bot nomi → username → sizga token beradi (123456:ABC-DEF...).
  3. Tokenni hech kimga ko‘rsatmang.

4) Birinchi bot — Echo bot (kod)

bot.py faylini yarating va quyidagicha yozing:

import asyncio
from aiogram import Bot, Dispatcher
from aiogram.enums import ParseMode
from aiogram.types import Message
from aiogram.filters import CommandStart
from aiogram.client.default import DefaultBotProperties

# Tokenni shu yerga yozing
TOKEN = "8271438037:AAEcPckGQr1vZYr-8CemFSxX3vp4rLjAj5k"

# /start komandasi uchun javob
async def start_handler(message: Message):
    await message.answer("Salom! Men echo botman. Nima yozsangiz, o'shani qaytaraman.")

# Echo uchun handler
async def echo_handler(message: Message):
    await message.answer(message.text)

# Asosiy ishga tushirish funksiyasi
async def main():
    bot = Bot(
        token=TOKEN,
        default=DefaultBotProperties(parse_mode=ParseMode.HTML)
    )
    dp = Dispatcher()

    dp.message.register(start_handler, CommandStart())
    dp.message.register(echo_handler)

    await dp.start_polling(bot)

# Ishga tushirish
if __name__ == "__main__":
    asyncio.run(main())
  • executor.start_polling — oxirgi yangilanishlardan (updates) foydalanib polling orqali ishlaydi.
  • skip_updates=True — bot ishga tushganda eski xabarlarni o‘tkazib yuboradi.

5) Yangilanishlar (updates) — Polling va Webhook

  • Polling: oddiy va lokal ravishda ishlatish oson (yuqoridagi misol).
  • Webhook: serverga joylashtirish, HTTPS zarur, prod-da tavsiya etiladi.
    (Hozirgi boshlang‘ich uchun polling yetarli.)

6) Filtrlar va handlerlar

Aiogram message_handler dekoratori orqali filtrlarni qo‘llab-quvvatlaydi. Ba'zi misollar:

# faqat /start komandasi
@dp.message_handler(commands=['start'])
async def cmd_start(message: types.Message):
    await message.reply("Buyruqni qabul qildim.")

# faqat text xabarlar (content_types orqali)
@dp.message_handler(content_types=['text'])
async def only_text(message: types.Message):
    pass

# regex bilan filter (masalan, raqamlar)
import re
@dp.message_handler(regexp=r'^\d+#39;)
async def only_numbers(message: types.Message):
    await message.reply("Siz faqat raqam yozdingiz.")

# lambda bilan murakkab filter
@dp.message_handler(lambda message: 'hello' in message.text.lower())
async def has_hello(message: types.Message):
    await message.reply("Hello topildi!")

7) «Bot — raqamni toping» o‘yini (oddiy)

Bu yerda foydalanuvchi bilan oddiy interaktiv o‘yin: bot tasodifiy 1–100 oralig‘ida raqam tanlaydi — foydalanuvchi topishga harakat qiladi.

Har bir foydalanuvchi uchun hozircha oddiy xotira (dictionary) ishlatamiz — kichik botlar uchun yetadi.

import random
from aiogram import Bot, Dispatcher, executor, types

API_TOKEN = "Sizning_TOKENingiz"

bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)

games = {}  # {user_id: secret_number}

@dp.message_handler(commands=['start', 'help'])
async def start(message: types.Message):
    await message.reply("Salom! /game buyrug‘i bilan o‘yinni boshlang yoki oddiy xabar yuboring.")

@dp.message_handler(commands=['game'])
async def start_game(message: types.Message):
    secret = random.randint(1, 100)
    games[message.from_user.id] = secret
    await message.reply("Men 1 dan 100 gacha son o'yladim. Uni topishga harakat qiling!")

@dp.message_handler(regexp=r'^\d+#39;)
async def guess_number(message: types.Message):
    user_id = message.from_user.id
    if user_id not in games:
        await message.reply("O‘yin boshlanmadi — /game bilan boshlang.")
        return

    guess = int(message.text)
    secret = games[user_id]

    if guess < secret:
        await message.reply("Kichikroq (yoki: «kattaroq» — o‘zgartiring).")
    elif guess > secret:
        await message.reply("Kattaroq (yoki: «kichikroq»).")
    else:
        await message.reply("Tabriklayman! Topdingiz 🎉")
        del games[user_id]  # o'yinni tugatamiz

@dp.message_handler()
async def fallback(message: types.Message):
    await message.reply("Iltimos, raqam yuboring yoki /game bilan boshlang.")

if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

(Kichik izoh: games dict server qayta ishga tushsa yo‘qoladi — agar doimiy saqlash kerak bo‘lsa, Redis yoki DB (SQLite, PostgreSQL) ishlatish kerak.)

8) Qo‘shimcha foydali filtr va imkoniyatlar

  • content_types=['photo']rasmlarni qabul qilish.
  • commands_prefix='!/' — agar xohlasangiz.
  • Inline klaviaturalar (InlineKeyboardMarkup, InlineKeyboardButton) — interaktiv tugmalar yaratish.
  • Callback query handler: @dp.callback_query_handler(lambda c: True) — tugma bosilganda ishlaydi.
  • Middlewares (o‘rnatish, autentifikatsiya va boshqalar).

9) Test qilish va xatoliklarni tuzatish

  • Token noto‘g‘ri bo‘lsa, bot 401 Unauthorized xatosi beradi.
  • skip_updates=True qo‘ymasangiz, bot ishga tushganda backlogdagi xabarlarni qayta ishlashi mumkin.
  • Loggerlar uchun logging modulidan foydalaning: import logging logging.basicConfig(level=logging.INFO)

“Raqamni toping” o‘yini (aiogram 3.22 uchun)

from aiogram import Bot, Dispatcher
from aiogram.types import Message
from aiogram.filters import CommandStart, Command
import random, asyncio

API_TOKEN = "SIZNING_TOKENINGIZ_BU_YERDA"

bot = Bot(token=API_TOKEN)
dp = Dispatcher()

# Har bir foydalanuvchi uchun tanlangan raqamni saqlaymiz
games = {}

@dp.message(CommandStart())
async def start_handler(message: Message):
    await message.answer("Salom! 🎯 'Raqamni toping' o‘yini uchun /game deb yozing.")

@dp.message(Command("game"))
async def start_game(message: Message):
    user_id = message.from_user.id
    secret = random.randint(1, 100)
    games[user_id] = secret
    await message.answer("Men 1 dan 100 gacha son o‘yladim. Uni topishga harakat qiling!")

@dp.message()
async def guess_number(message: Message):
    user_id = message.from_user.id
    if user_id not in games:
        await message.answer("Avval /game buyrug‘i bilan o‘yinni boshlang 🎮")
        return

    # Faqat raqam yuborilganini tekshiramiz
    if not message.text.isdigit():
        await message.answer("Iltimos, faqat raqam yuboring 🔢")
        return

    guess = int(message.text)
    secret = games[user_id]

    if guess < secret:
        await message.answer("Kattaroq son yozing ⬆️")
    elif guess > secret:
        await message.answer("Kichikroq son yozing ⬇️")
    else:
        await message.answer(f"🎉 To‘g‘ri! Men {secret} sonini o‘ylagan edim.")
        del games[user_id]

async def main():
    await dp.start_polling(bot)

if __name__ == "__main__":
    asyncio.run(main())

🚀 Ishlatish

  1. pip install aiogram==3.22
  2. Tokenni API_TOKEN ga joylang.
  3. Faylni ishga tushiring: python bot.py

🎮 Natija

  • /start → bot sizga salom beradi.
  • /game → bot raqam tanlaydi (1–100).
  • Siz raqam yuborasiz → bot «Kattaroq» yoki «Kichikroq» deb javob beradi.
  • To‘g‘ri topsangiz → «🎉 To‘g‘ri!» deb aytadi.