← Назад к курсу
Использование 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)
Важно: Для продакшена используйте вебхуки и храните токен в переменных окружения.
Документация и ресурсы
Задание на закрепление
Создать бот, который:
- Отвечает на /start и /help
- Имеет меню с кнопками
- Обрабатывает текстовые сообщения и фото
- Поддерживает инлайн-поиск