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
- Python o‘rnatish: Python 3.8+ ni rasmiy saytdan o‘rnating.
- Kod muharrirlari:
- Virtual muhit (Windows / macOS / Linux):
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
- Telegramda
@BotFatherga yozing. /newbotbuyrug‘i → bot nomi → username → sizga token beradi (123456:ABC-DEF...).- 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 Unauthorizedxatosi beradi. skip_updates=Trueqo‘ymasangiz, bot ishga tushganda backlogdagi xabarlarni qayta ishlashi mumkin.- Loggerlar uchun
loggingmodulidan 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())