Asosiy qismga oʻtish
Barcha maqolalar
Dasturlash4 daqiqa

Birinchi Telegram botni aiogram 3 bilan yozamiz

BotFatherdan token olishdan tortib buyruq, klaviatura va xabarni qaytaruvchi handlerga ega tayyor botgacha. Kod aiogram 3 ning hozirgi versiyasiga mos.

Mundarija

Telegram bot — Telegram orqali odamlar bilan muloqot qiladigan kichik dastur. Bu maqolada shunday botni Python va botlar uchun mashhur asinxron freymvork aiogram 3 yordamida yozamiz. Botimiz foydalanuvchi bilan salomlashadi, klaviatura koʻrsatadi va yozilgan xabarni qaytarib yuboradi. Maqola Python asoslarini biladigan, lekin hali bot yozib koʻrmagan odamlar uchun. Bunga taxminan yigirma daqiqa ketadi, xuddi shu tuzilma esa keyinchalik haqiqiy loyihalarga ham asos boʻladi.

Nima kerak

  • Python 3.12 yoki undan yangi versiya. python3 --version buyrugʻi bilan tekshiring (Windowsda python --version). Pythonni Windowsga python.org saytidan oʻrnatsangiz, oʻrnatuvchidagi “Add python.exe to PATH” belgisini qoʻyishni unutmang.
  • Telegram akkaunti.
  • Istalgan kod muharriri.

BotFatherdan token olish

Har bir bot @BotFather orqali yaratiladi. Bu Telegramning botlarni boshqarish uchun rasmiy boti. Uni oching, /newbot buyrugʻini yuboring, botga koʻrinadigan nom tanlang, keyin oxiri bot bilan tugaydigan foydalanuvchi nomini kiriting, masalan my_first_aiogram_bot. BotFather javob sifatida 123456789:AAH... koʻrinishidagi token yuboradi. Shu yerning oʻzida /setdescription va /setuserpic buyruqlari bilan botga tavsif va rasm qoʻyish mumkin: foydalanuvchi botni birinchi marta ochganda aynan shularni koʻradi.

Token — botning paroli. Token kimning qoʻlida boʻlsa, bot ham oʻshaning ixtiyorida, shuning uchun unga parol kabi ehtiyot boʻling.

Loyihani tayyorlash

Bot paketlari tizimingizning qolgan qismidan alohida turishi uchun virtual muhitli papka yarating va aiogram kutubxonasini oʻrnating:

Bash
mkdir my-bot && cd my-bot
python3 -m venv .venv
source .venv/bin/activate   # Windows: .venv\Scripts\activate
pip install -U aiogram

Keyinroq pip freeze > requirements.txt buyrugʻi aniq versiyalarni saqlab qoʻyadi, shunda botni serverga ham aynan shunday oʻrnatish mumkin boʻladi.

Botni yozamiz

bot.py nomli fayl yarating:

Python
import asyncio
import logging
import os

from aiogram import Bot, Dispatcher, F, Router, html
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from aiogram.filters import CommandStart
from aiogram.types import KeyboardButton, Message, ReplyKeyboardMarkup

router = Router()

menu = ReplyKeyboardMarkup(
    keyboard=[[KeyboardButton(text="Bot haqida"), KeyboardButton(text="Yordam")]],
    resize_keyboard=True,
)


@router.message(CommandStart())
async def start(message: Message) -> None:
    name = html.quote(message.from_user.full_name)
    await message.answer(
        f"Salom, <b>{name}</b>! Menga istalgan matn yuboring.",
        reply_markup=menu,
    )


@router.message(F.text == "Bot haqida")
async def about(message: Message) -> None:
    await message.answer("Men aiogram 3 bilan yozilgan namuna botman.")


@router.message(F.text == "Yordam")
async def help_(message: Message) -> None:
    await message.answer("Istalgan narsa yozing, men uni sizga qaytaraman.")


@router.message(F.text)
async def echo(message: Message) -> None:
    await message.answer(html.quote(message.text))


async def main() -> None:
    bot = Bot(
        token=os.environ["BOT_TOKEN"],
        default=DefaultBotProperties(parse_mode=ParseMode.HTML),
    )
    dp = Dispatcher()
    dp.include_router(router)
    await dp.start_polling(bot)


if __name__ == "__main__":
    logging.basicConfig(level=logging.INFO)
    asyncio.run(main())

Bu qanday ishlaydi

  • Router handlerlarni guruhlaydi. Juda kichik botda handlerlarni toʻgʻridan-toʻgʻri Dispatcherga ulash mumkin, lekin bot oʻsgani sari routerlar tartibni saqlaydi: har bir imkoniyat uchun alohida router, ularning hammasi esa dispetcherga qoʻshiladi.
  • Handlerlar — dekoratorida filtri bor asinxron funksiyalar. CommandStart() /start buyrugʻini, F.text == "Bot haqida" aynan shu matnni, F.text esa istalgan matnli xabarni ushlaydi. aiogram handlerlarni roʻyxatdan oʻtkazilgan tartibda tekshiradi va birinchi mos kelganida toʻxtaydi, shuning uchun hamma narsani ushlaydigan echo eng oxirida turadi.
  • DefaultBotProperties barcha xabarlar uchun HTML formatlashni yoqadi, shuning uchun <b> qalin yozuvga aylanadi. Foydalanuvchi matni html.quote orqali oʻtishining sababi ham shu: aks holda < belgisi bor xabar formatlashni buzadi va Telegram javobni qabul qilmaydi.
  • start_polling Telegramdan yangi xabarlarni muntazam soʻrab turadi. Bu botni ishga tushirishning eng oddiy usuli, unga ochiq IP manzil, domen yoki sertifikat kerak emas.
  • message.answer javobni xabar kelgan chatning oʻziga yuboradi, chat raqamini qoʻlda koʻrsatish shart emas.
  • async bitta kichik jarayonga koʻp odamga xizmat qilish imkonini beradi: bitta handler Telegram javobini kutayotganda boshqalari ishlashda davom etadi.

Ishga tushirish va toʻxtatish

Tokenni muhit oʻzgaruvchisiga yozing va botni ishga tushiring:

Bash
export BOT_TOKEN="123456789:AAH..."   # PowerShell: $env:BOT_TOKEN = "..."
python bot.py

Telegramda botingizni oching va Start tugmasini bosing. Terminal har bir kelgan yangilanishni qayd etib boradi. Toʻxtatish uchun Ctrl+C ni bosing, aiogram ulanishni toʻgʻri yopadi. Terminalni yopsangiz, bot ham toʻxtaydi: doimiy ishlashi uchun uni serverga joylash kerak, bu haqda pastroqda. Agar oʻzgaruvchini yaratishni unutsangiz, os.environ["BOT_TOKEN"] darhol KeyError bilan toʻxtaydi, bu keyinroq chiqadigan tushunarsiz xatodan ancha yaxshi.

Ikki narsa koʻpchilikni hayron qoldiradi. Birinchidan, bot hech kimga birinchi boʻlib yoza olmaydi: odam botni ochib, Start tugmasini bosmaguncha bot unga hech narsa yubora olmaydi. Ikkinchidan, bir vaqtda botning faqat bitta nusxasi polling qila oladi. Ikkinchisini, masalan noutbukda va serverda bir paytda ishga tushirsangiz, Telegram conflict xatosini qaytaradi.

Tokenni sir saqlang

Tokenni hech qachon kodga yozmang va Gitga commit qilmang. Ochiq repozitoriylar maxfiy kalitlarni topish uchun doim skanerlanadi, tokenni topgan odam esa botni boshqara oladi.

Har safar export yozish joningizga tegsa, tokenni .env faylida saqlang, .env faylini .gitignore roʻyxatiga qoʻshing va uni python-dotenv kabi kutubxona bilan yuklang. .venv papkasini ham .gitignore roʻyxatiga qoʻshing, repozitoriyda unga joy yoʻq. Token qachondir sizib chiqsa, BotFatherga /revoke buyrugʻini yuborib, yangisini oling. Eski token shu zahoti ishlamay qoladi.

Keyingi qadamlar

  • FSM (holatlar mashinasi) koʻp bosqichli suhbatlar uchun, masalan avval ismni, keyin telefon raqamini soʻraydigan forma.
  • Inline klaviaturalar va callback querylar xabarning tagiga biriktirilgan tugmalar uchun.
  • Webhooklar polling oʻrniga, bot HTTPS ishlaydigan serverga koʻchganda.
  • Maʼlumotlar bazasi, masalan SQLAlchemy bilan PostgreSQL, foydalanuvchilar va ularning sozlamalarini eslab qolish uchun.
  • systemd yoki Docker botni doimiy ishlatib turish va nosozlik yoki qayta yuklashdan keyin avtomatik qayta ishga tushirish uchun.

aiogram hujjatlari (yangi oynada ochiladi) bularning har birini misollar bilan tushuntiradi. Oʻzingiz yoki doʻstlaringiz haqiqatan foydalanadigan kichik bir narsa yasang: oʻrganishning eng tez yoʻli shu.

Yana oʻqing

Keling, zoʻr narsa quramiz.

Yangi loyiha, hamkorlik yoki shunchaki texnologiya haqida suhbat boʻlsa, yozing.

  • Toshkent, OʻzbekistonMasofadan ishlashga ochiqman

  • Toshkentda hozir (GMT+5)