
Создание Telegram-бота с использованием библиотеки aiogram даёт возможность реализовать асинхронное взаимодействие с пользователями без лишних задержек. В отличие от классических решений, основанных на telebot или синхронных подходах, aiogram использует asyncio, что позволяет обрабатывать сотни запросов одновременно без блокировки основного процесса.
Для работы потребуется установленный Python версии 3.8+, библиотека aiogram и токен, полученный через BotFather. Минимальный рабочий пример включает подключение диспетчера (Dispatcher), регистрацию хэндлеров и запуск долгого опроса (long polling). Такой подход подходит для тестирования и небольших проектов, а для продакшена предпочтительно использовать webhook.
Библиотека поддерживает гибкую систему фильтров, работу с состояниями пользователей и удобное управление командами через встроенные декораторы. Это позволяет легко разделять бизнес-логику, подключать базы данных и интегрировать внешние API без избыточного кода. Именно поэтому aiogram стал стандартом де-факто при разработке современных Telegram-ботов на Python.
Установка и настройка окружения для aiogram

Для разработки бота на aiogram требуется изолированное окружение, чтобы зависимости проекта не конфликтовали с другими пакетами Python.
- Установите Python версии 3.8–3.12. Проверить текущую версию можно командой:
python --version - Создайте виртуальное окружение в каталоге проекта:
python -m venv venv - Активируйте окружение:
- Windows:
venv\Scripts\activate - Linux/macOS:
source venv/bin/activate
- Windows:
- Обновите менеджер пакетов:
pip install --upgrade pip - Установите библиотеку aiogram:
pip install aiogram - Для управления зависимостями создайте файл
requirements.txt:pip freeze > requirements.txt
Рекомендуется использовать .env-файл для хранения токена бота и других настроек, подключая его через библиотеку python-dotenv:
pip install python-dotenv
Пример файла .env:
BOT_TOKEN=ваш_токен_здесь
Создание нового бота и получение токена у BotFather
Для регистрации бота используется официальный сервисный бот Telegram – @BotFather. Все действия выполняются в его чате.
- Откройте диалог с @BotFather и отправьте команду
/start. - Создайте бота через команду
/newbot. - Введите название – это отображаемое имя, которое видят пользователи.
- Укажите уникальный логин, который обязательно должен оканчиваться на
bot(например, myhelper_bot). - После подтверждения BotFather выдаст API-токен в формате длинной строки, например:
1234567890:AAEexampleToken.
Сразу после получения токена:
- Сохраните его в отдельный конфигурационный файл или переменную окружения, чтобы не хранить в коде напрямую.
- Не публикуйте токен в открытых репозиториях – при утечке его нужно моментально отозвать через
/revokeу BotFather и сгенерировать новый. - Для удобства можно настроить описание бота:
/setdescription,/setabouttext,/setuserpic.
На этом этапе бот зарегистрирован, имеет уникальный токен и готов к подключению в Python-приложении через библиотеку aiogram.
Инициализация проекта и подключение aiogram

Создайте отдельную директорию для бота и перейдите в неё:
Linux/macOS: mkdir telegram_bot && cd telegram_bot
Windows: mkdir telegram_bot && cd telegram_bot
Рекомендуется использовать виртуальное окружение для изоляции зависимостей:
python -m venv venv
source venv/bin/activate (Linux/macOS) или venv\Scripts\activate (Windows)
Установите aiogram последней версии:
pip install aiogram —upgrade
Проверьте успешность установки:
pip show aiogram
Создайте файл bot.py и подключите библиотеку:
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
API_TOKEN = "ВАШ_ТОКЕН"
bot = Bot(token=API_TOKEN)
dp = Dispatcher(bot)
Для запуска событийного цикла добавьте:
if __name__ == "__main__":
executor.start_polling(dp, skip_updates=True)
Теперь бот готов к обработке входящих сообщений, а структура проекта позволяет без проблем расширять функционал.
Обработка команд и сообщений с помощью Dispatcher

В aiogram за маршрутизацию событий отвечает Dispatcher. Он хранит список хендлеров и определяет, какой из них вызвать при получении обновления от Telegram.
Для регистрации обработчика используется метод @dp.message_handler(). В параметрах можно задать условия фильтрации: commands, regexp, content_types. Это позволяет разделять логику и избегать лишних проверок внутри функций.
Пример обработки команды:
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
bot = Bot(token="TOKEN")
dp = Dispatcher(bot)
@dp.message_handler(commands=["start"])
async def start_handler(message: types.Message):
await message.reply("Бот запущен")
executor.start_polling(dp)
Обработка текстовых сообщений с фильтрацией:
@dp.message_handler(regexp="привет")
async def hello_handler(message: types.Message):
await message.answer("Здравствуйте!")
@dp.message_handler(content_types=["photo"])
async def photo_handler(message: types.Message):
await message.reply("Фото получено")
Важно использовать специфичные фильтры, чтобы Dispatcher быстрее выбирал нужный обработчик. Например, если бот принимает изображения и команды, лучше явно разделить их в разных хендлерах, а не проверять тип сообщения вручную.
Dispatcher также поддерживает middlewares и state machine, что позволяет внедрять промежуточную логику и работать с диалогами без смешивания кода. Это ключевой инструмент для структурированной архитектуры бота.
Работа с кнопками и клавиатурами в aiogram

В aiogram для создания интерактивных элементов используются объекты ReplyKeyboardMarkup и InlineKeyboardMarkup. ReplyKeyboardMarkup отображает клавиатуру прямо под полем ввода пользователя, а InlineKeyboardMarkup прикрепляется к сообщению и поддерживает callback-запросы.
Пример создания простой клавиатуры с двумя кнопками:
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
button1 = KeyboardButton("Да")
button2 = KeyboardButton("Нет")
keyboard.add(button1, button2)
Для inline-кнопок используется InlineKeyboardButton. Пример:
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
inline_keyboard = InlineKeyboardMarkup(row_width=2)
btn1 = InlineKeyboardButton("Кнопка 1", callback_data="btn1")
btn2 = InlineKeyboardButton("Кнопка 2", callback_data="btn2")
inline_keyboard.add(btn1, btn2)
Обработка нажатий inline-кнопок требует регистрации обработчика callback:
@dp.callback_query_handler(lambda c: c.data == 'btn1')
async def process_callback_btn1(callback_query):
await bot.answer_callback_query(callback_query.id)
await bot.send_message(callback_query.from_user.id, "Вы нажали кнопку 1")
Рекомендуется использовать параметр row_width для контроля количества кнопок в строке. Метод add() добавляет кнопки по одной строке, row() позволяет группировать кнопки в отдельные строки.
Пример комплексной таблицы кнопок:
| Тип кнопки | Класс | Особенности |
|---|---|---|
| Reply | KeyboardButton | Отображается под полем ввода, отправляет текст |
| Inline | InlineKeyboardButton | Прикрепляется к сообщению, поддерживает callback_data и URL |
Для динамического создания клавиатур используйте циклы и списки. Это удобно при генерации меню из базы данных или конфигурационных файлов. Всегда учитывайте удобство пользователя: не перегружайте клавиатуру большим количеством кнопок.
При необходимости скрыть Reply-клавиатуру используется ReplyKeyboardRemove():
from aiogram.types import ReplyKeyboardRemove
await message.answer("Клавиатура скрыта", reply_markup=ReplyKeyboardRemove())
Подключение к базе данных для хранения данных бота

Для эффективного хранения данных Telegram бота на Python с aiogram рекомендуется использовать SQLite для небольших проектов или PostgreSQL для масштабируемых решений. SQLite не требует отдельного сервера и подходит для локальной разработки. PostgreSQL обеспечивает параллельный доступ, транзакции и масштабируемость.
Для работы с SQLite подключение осуществляется через стандартный модуль sqlite3:
Пример:
import sqlite3
conn = sqlite3.connect('bot_data.db')
cursor = conn.cursor()
cursor.execute('''CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, username TEXT)''')
conn.commit()
Для PostgreSQL требуется библиотека asyncpg или psycopg2. Asyncpg рекомендуется для асинхронного взаимодействия с aiogram:
Пример:
import asyncpg
import asyncio
async def create_pool():
pool = await asyncpg.create_pool(user='user', password='password', database='bot_db', host='localhost')
return pool
loop = asyncio.get_event_loop()
pool = loop.run_until_complete(create_pool())
Для интеграции с aiogram создается отдельный модуль database.py, который хранит функции для добавления, удаления и получения данных. Это упрощает поддержку кода и предотвращает блокировку основного потока бота при работе с базой.
Рекомендуется использовать асинхронные запросы при работе с PostgreSQL и транзакции для всех критичных операций, чтобы избежать потери данных и конфликтов при параллельных запросах.
При хранении пользовательских данных обязательно определять уникальные ключи и индексы на столбцах, используемых для поиска, например, id или username, чтобы ускорить выборку и сохранить целостность данных.
Запуск бота и организация структуры проекта
Для начала работы с aiogram создайте виртуальное окружение: python -m venv venv и активируйте его. Установите необходимые пакеты командой pip install aiogram python-dotenv. Рекомендуется хранить токен бота в файле .env и загружать его через from dotenv import load_dotenv, чтобы избежать утечки данных.
Структура проекта должна быть модульной. Минимальная организация выглядит так: bot.py для запуска бота, handlers/ для обработчиков сообщений, keyboards/ для inline и reply клавиатур, middlewares/ для промежуточной логики, services/ для работы с API и базами данных, config.py для конфигураций.
Файл bot.py содержит инициализацию бота и диспетчера: bot = Bot(token=TOKEN) и dp = Dispatcher(bot). Подключение обработчиков осуществляется через отдельные модули, например: from handlers.start import register_start_handler и вызов register_start_handler(dp).
Для запуска используйте python bot.py. В продакшн-режиме рекомендуется использовать uvloop и aiohttp для ускорения работы и устойчивости к нагрузкам. Логи удобнее вести через стандартный модуль logging, задавая формат %(asctime)s - %(levelname)s - %(message)s.
Организация проекта в виде модулей упрощает тестирование и расширение функционала. Каждый обработчик и сервис изолирован, что позволяет добавлять новые команды, не нарушая существующую логику. Для сложных проектов полезно применять пакет aiogram.contrib.middlewares.logging.LoggingMiddleware для отладки и анализа событий бота.
Вопрос-ответ:
Какие шаги нужны для создания простого бота с aiogram?
Для начала требуется зарегистрировать бота у BotFather в Telegram и получить токен. Далее нужно установить библиотеку aiogram через pip. Затем создается Python-файл, где импортируются необходимые модули, создается объект бота и диспетчер. После этого прописываются обработчики команд и сообщений, например, приветствие пользователя. В конце запускается цикл polling, который позволяет боту получать обновления от Telegram.
Как обрабатывать текстовые сообщения от пользователей?
В aiogram для обработки сообщений используются декораторы или хэндлеры с фильтрацией по типу контента. Например, можно создать функцию, которая срабатывает на любой текст и отвечает на него определенным сообщением. Для этого применяется декоратор @dp.message_handler(content_types=[‘text’]). Внутри функции можно анализировать текст, проверять команды и отправлять ответы с помощью метода bot.send_message.
Можно ли добавить кнопки в сообщения бота?
Да, в aiogram есть поддержка клавиатур. Можно использовать ReplyKeyboardMarkup для отображения стандартной клавиатуры с кнопками под полем ввода или InlineKeyboardMarkup для интерактивных кнопок прямо в сообщении. Каждая кнопка создается с текстом и при необходимости callback_data, чтобы бот понимал, какая кнопка была нажата. Обработку нажатий на inline-кнопки осуществляют callback-хэндлеры.
Как хранить данные пользователей между сессиями?
aiogram сам по себе не хранит состояние пользователей, поэтому нужно использовать внешние хранилища. Можно подключить базу данных SQLite или PostgreSQL для постоянного хранения. Для короткоживущих данных можно использовать встроенный FSM (Finite State Machine), который позволяет отслеживать текущее состояние пользователя и реагировать на последовательность сообщений. Данные FSM могут быть временными или сохраняться в памяти между перезапусками бота с помощью бекендов.
Что делать, если бот перестал отвечать после нескольких часов работы?
Чаще всего это связано с проблемами соединения или перегрузкой. Нужно убедиться, что polling запущен корректно, и проверить ошибки в логах. Иногда помогает перезапуск скрипта. Также стоит добавить обработку исключений и логирование, чтобы бот не останавливался при возникновении ошибок. Если используется хостинг с ограничениями, важно учитывать лимиты по времени работы процесса и памяти.
Как подключить бота к Telegram через aiogram?
Для подключения нужно создать бота через BotFather в Telegram и получить токен. После этого в коде Python подключается библиотека aiogram, и создается объект Bot с этим токеном. Далее создается диспетчер, который будет обрабатывать входящие сообщения. Такой подход позволяет боту принимать команды и отвечать на них, а также использовать различные типы хэндлеров для обработки текста, кнопок и других событий.
Какие структуры данных лучше использовать для хранения информации внутри бота?
Выбор структуры зависит от того, как бот будет взаимодействовать с пользователем. Для простых задач можно использовать словари и списки для хранения текущего состояния или настроек пользователя. Если необходимо сохранять данные между перезапусками бота, лучше применять базы данных, например SQLite или PostgreSQL. Использование базы данных позволяет создавать таблицы с пользователями, сообщениями и другими объектами, что делает управление информацией более прозрачным и масштабируемым.
