← Назад к курсу

Использование aiogram 3.x для создания Telegram ботов на Python

Введение

aiogram 3.x — это современная асинхронная библиотека для создания Telegram-ботов на Python. В этом уроке мы научимся создавать ботов с основными функциями: обработка команд, клавиатур, медиафайлов и инлайн-запросов.


1. Подготовка

Требования:

  • Python 3.8+
  • Аккаунт Telegram
  • Токен бота (получается у @BotFather)

Установка:

pip install aiogram

2. Первый бот (Эхо-бот)

import asyncio
from aiogram import Bot, Dispatcher, types
from aiogram.filters import Command

bot = Bot(token="YOUR_TOKEN")
dp = Dispatcher()

@dp.message(Command("start"))
async def start(message: types.Message):
    await message.answer("Привет! Я эхо-бот. Отправь мне любое сообщение!")

@dp.message()
async def echo(message: types.Message):
    await message.answer(message.text)

if __name__ == "__main__":
    asyncio.run(dp.start_polling(bot))

3. Расширенные функции

Клавиатуры:

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton

@dp.message(Command("menu"))
async def menu(message: types.Message):
    keyboard = ReplyKeyboardMarkup(
        keyboard=[
            [KeyboardButton(text="Помощь"), KeyboardButton(text="О боте")]
        ],
        resize_keyboard=True
    )
    await message.answer("Выберите действие:", reply_markup=keyboard)

Инлайн-клавиатуры:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton

@dp.message(Command("links"))
async def links(message: types.Message):
    keyboard = InlineKeyboardMarkup(
        inline_keyboard=[
            [InlineKeyboardButton(text="GitHub", url="https://github.com")]
        ]
    )
    await message.answer("Ссылки:", reply_markup=keyboard)

4. Обработка медиа

@dp.message(F.photo)
async def photo(message: types.Message):
    await message.answer("Фото получено!")
    # Сохранение фото:
    await message.photo[-1].download("photo.jpg")

5. Инлайн-режим

@dp.inline_query()
async def inline_query(inline_query: types.InlineQuery):
    results = [
        types.InlineQueryResultArticle(
            id="1",
            title="Википедия",
            input_message_content=types.InputTextMessageContent(
                message_text=f"https://ru.wikipedia.org/wiki/{inline_query.query}"
            )
        )
    ]
    await inline_query.answer(results, cache_time=3600)

6. Колбэки (Callback-и)

@dp.callback_query(F.data == "help")
async def help_callback(callback: types.CallbackQuery):
    await callback.message.edit_text("Помощь: /start - начало, /menu - меню")
    await callback.answer()

7. Мидлвари

@dp.message.middleware()
class LoggingMiddleware:
    async def __call__(self, handler, event, data):
        print(f"Сообщение от {event.from_user.full_name}: {event.text}")
        return await handler(event, data)

8. Запуск (Production)

from aiogram.fsm.storage.memory import MemoryStorage
from aiogram.fsm.strategy import FSMStrategy

dp = Dispatcher(storage=MemoryStorage(), fsm_strategy=FSMStrategy.CHAT)

Важно: Для продакшена используйте вебхуки и храните токен в переменных окружения.


Документация и ресурсы


Задание на закрепление

Создать бот, который:

  1. Отвечает на /start и /help
  2. Имеет меню с кнопками
  3. Обрабатывает текстовые сообщения и фото
  4. Поддерживает инлайн-поиск