Aiogram 3 da FSM va SQLite Bilan Buyurtma Boti Yaratish
Muallif: Javohir Abdullayev · · Telegram botlar

Kirish: Nima uchun aynan Aiogram 3 va FSM?
Telegram botlar bugungi kunda biznes va xizmat ko'rsatish sohalarida mijozlar bilan aloqa o'rnatishning eng qulay vositasiga aylandi. Ayniqsa, kichik biznes egalari va frilanserlar uchun mijozlardan buyurtma qabul qiluvchi avtomatlashtirilgan botlar juda katta talabga ega. Ushbu maqolada biz Python va zamonaviy Aiogram 3 kutubxonasi yordamida bosqichma-bosqich buyurtma qabul qiluvchi bot yaratamiz.
Loyiha davomida foydalanuvchi ma'lumotlarini qadamma-qadam yig'ish uchun FSM (Finite State Machine) texnologiyasidan hamda qabul qilingan ma'lumotlarni saqlash uchun SQLite ma'lumotlar bazasidan foydalanamiz.
1. Loyiha muhitini tayyorlash
Dastlab loyihamiz uchun alohida virtual muhit yaratamiz va kerakli kutubxonalarni o'rnatamiz. Terminalda quyidagi buyruqlarni bajaring:
python -m venv venv
source venv/bin/activate # Windows uchun: venv\Scripts\activate
pip install aiogram aiosqliteLoyihamiz fayl tuzilmasi quyidagicha bo'ladi:
main.py— botni ishga tushiruvchi asosiy fayl;database.py— SQLite bilan asinxron ishlash moduli;handlers.py— buyurtma jarayoni va buyruqlar ishlovchilari;states.py— FSM holatlari tavsifi.
2. Ma'lumotlar bazasini sozlash (database.py)
Buyurtmalarni asinxron tarzda bazaga yozish uchun aiosqlite kutubxonasidan foydalanamiz. Bu botning tezligini oshiradi va so'rovlar navbatida to'xtalishlarning oldini oladi.
import aiosqlite
DB_NAME = "orders.db"
async def init_db():
async with aiosqlite.connect(DB_NAME) as db:
await db.execute("""
CREATE TABLE IF NOT EXISTS orders (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
full_name TEXT,
phone_number TEXT,
product_name TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
""")
await db.commit()
async def add_order(user_id: int, full_name: str, phone: str, product: str):
async with aiosqlite.connect(DB_NAME) as db:
await db.execute(
"INSERT INTO orders (user_id, full_name, phone_number, product_name) VALUES (?, ?, ?, ?)",
(user_id, full_name, phone, product)
)
await db.commit()3. FSM holatlarini aniqlash (states.py)
Foydalanuvchi buyurtma berish jarayonida 3 ta bosqichdan o'tadi: ismini kiritadi, telefon raqamini yuboradi va mahsulot nomini tanlaydi. Buning uchun StatesGroup yaratamiz:
from aiogram.fsm.state import State, StatesGroup
class OrderState(StatesGroup):
full_name = State()
phone_number = State()
product_name = State()4. Xabarlar bilan ishlash (handlers.py)
Endi botning mantiqiy qismini yozamiz. Foydalanuvchi /start yoki /order bosganda FSM ishga tushadi va har bir bosqichda kiritilgan ma'lumot xotirada saqlanib boriladi:
from aiogram import Router, F
from aiogram.types import Message, ReplyKeyboardMarkup, KeyboardButton, ReplyKeyboardRemove
from aiogram.filters import CommandStart, Command
from aiogram.fsm.context import FSMContext
from states import OrderState
from database import add_order
router = Router()
@router.message(CommandStart())
async def start_cmd(message: Message):
await message.answer(
f"Assalomu alaykum, {message.from_user.first_name}!\n"
"Buyurtma berish uchun /order buyrug'ini yuboring."
)
@router.message(Command("order"))
async def order_start(message: Message, state: FSMContext):
await state.set_state(OrderState.full_name)
await message.answer("Iltimos, to'liq ism-familiyangizni kiriting:")
@router.message(OrderState.full_name)
async def process_name(message: Message, state: FSMContext):
await state.update_data(full_name=message.text)
await state.set_state(OrderState.phone_number)
phone_btn = ReplyKeyboardMarkup(
keyboard=[[KeyboardButton(text="Raqamni yuborish", request_contact=True)]],
resize_keyboard=True,
one_time_keyboard=True
)
await message.answer("Telefon raqamingizni yuboring yoki yozma kiriting:", reply_markup=phone_btn)
@router.message(OrderState.phone_number)
async def process_phone(message: Message, state: FSMContext):
if message.contact:
phone = message.contact.phone_number
else:
phone = message.text
await state.update_data(phone_number=phone)
await state.set_state(OrderState.product_name)
await message.answer("Qaysi mahsulot yoki xizmatga buyurtma bermoqchisiz?", reply_markup=ReplyKeyboardRemove())
@router.message(OrderState.product_name)
async def process_product(message: Message, state: FSMContext):
product = message.text
user_data = await state.get_data()
full_name = user_data.get("full_name")
phone = user_data.get("phone_number")
# Bazaga saqlash
await add_order(message.from_user.id, full_name, phone, product)
# Holatni tozalash
await state.clear()
await message.answer(
"Rahmat! Buyurtmangiz muvaffaqiyatli qabul qilindi.\n\n"
f"Ism: {full_name}\n"
f"Telefon: {phone}\n"
f"Mahsulot: {product}\n\n"
"Tez orada operator siz bilan bog'lanadi!"
)5. Botni ishga tushirish (main.py)
Asosiy faylda bot va dispatcherni birlashtirib, bazani ishga tushiramiz va botni polling rejimida ishlatamiz:
import asyncio
import logging
from aiogram import Bot, Dispatcher
from database import init_db
from handlers import router
BOT_TOKEN = "BOT_TOKENINGIZNI_SHU_YERGA_YOZING"
async def main():
logging.basicConfig(level=logging.INFO)
bot = Bot(token=BOT_TOKEN)
dp = Dispatcher()
# Bazani ishga tushirish
await init_db()
# Handlerlarni ulash
dp.include_router(router)
print("Bot muvaffaqiyatli ishga tushdi!")
await dp.start_polling(bot)
if __name__ == "__main__":
try:
asyncio.run(main())
except (KeyboardInterrupt, SystemExit):
print("Bot to'xtatildi.")Amaliy maslahatlar va loyihani kengaytirish
Ushbu loyihani yanada takomillashtirish uchun quyidagi imkoniyatlarni qo'shishingiz mumkin:
- Admin panel: Yangi buyurtma tushganda admin Telegram profiliga yoki maxsus guruhga bildirishnoma yuborish.
- Validatsiya: Telefon raqami formati to'g'ri kiritilganligini tekshirish uchun
regular expressions (re)modulidan foydalanish. - Inline tugmalar: Mahsulotlarni ro'yxat qilib chiqarish va foydalanuvchiga matn yozdirmasdan tugma orqali tanlatish.
Xulosa
Aiogram 3 ning FSM imkoniyatlari foydalanuvchilar bilan muloqotni tartibli va xatosiz tashkil qilish imkonini beradi. Ushbu tayyor shablonni o'zingizning portfoliosingizga kiritishingiz yoki kichik biznes mijozlari uchun buyurtma qabul qiluvchi tizim sifatida taklif qilishingiz mumkin.
Teglar: #aiogram 3 #telegram bot #python darslari #sqlite #fsm