
Telegram боты становятся всё более популярными инструментами для автоматизации различных процессов. Чтобы создать бота для Telegram, вам не обязательно быть опытным разработчиком. В этой статье мы рассмотрим, как быстро и эффективно создать Telegram бота на Python с использованием библиотеки aiogram.
Для начала, важно понимать, что aiogram – это современная и удобная библиотека для работы с Telegram API, которая поддерживает асинхронное выполнение. Это даёт несколько преимуществ, таких как высокая производительность и возможность обрабатывать запросы пользователей в реальном времени. В отличие от других библиотек, aiogram обладает простым интерфейсом, но в то же время предлагает широкие возможности для настройки.
Перед тем как приступить к созданию бота, вам потребуется зарегистрировать его в BotFather, который предоставляет уникальный токен для взаимодействия с Telegram API. Этот токен будет необходим для отправки сообщений и обработки команд через бота. После регистрации и получения токена можно приступать к установке aiogram и созданию первого скрипта.
Регистрация бота в Telegram и получение API токена
Для интеграции aiogram с Telegram необходимо создать бота через BotFather и получить API токен.
- В Telegram найдите
@BotFather. - Отправьте команду
/newbot. - Введите название бота (например,
ФинансовыйАссистент). - Задайте уникальный username, оканчивающийся на
bot(например,finance_assistant_bot). - Скопируйте API токен, который BotFather выдаст (например,
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).
Рекомендации по работе с токеном:
- Храните токен в файле
.envили в переменных окружения, а не в открытом коде. - Добавьте
.envв.gitignore, чтобы исключить файл из репозитория. - При утечке токена используйте
/revokeу BotFather для генерации нового. - Сохраняйте username и ID бота – они понадобятся для настройки и администрирования.
После получения токена можно переходить к настройке aiogram и написанию кода бота.
Установка и настройка библиотеки aiogram

Проверьте версию Python командой python —version. Aiogram работает с Python 3.8 и выше. Если требуется обновление, скачайте актуальный установщик с python.org и выполните установку.
Создайте виртуальное окружение: python -m venv venv. Активируйте его: Windows – venv\Scripts\activate, Linux/macOS – source venv/bin/activate. Это гарантирует, что зависимости проекта не повлияют на систему.
Установите aiogram: pip install aiogram. Для конкретной версии, например 3.5.0, используйте pip install aiogram==3.5.0. Проверить установленную версию можно с помощью pip show aiogram.
Создайте файл .env с содержимым BOT_TOKEN=ваш_токен. Установите pip install python-dotenv и подключите загрузку окружения в коде: from dotenv import load_dotenv; load_dotenv(). Это позволяет скрывать чувствительные данные.
Для оптимизации работы на Linux/macOS установите uvloop: pip install uvloop. Библиотека aiohttp входит в зависимости aiogram, отдельная установка не требуется.
Проверьте корректность установки, выполнив импорт: from aiogram import Bot, Dispatcher. Если ошибок нет, библиотека готова к использованию.
Создание базовой структуры проекта для бота

В корне проекта создаём папку, например my_bot. Внутри неё – файл bot.py, который будет точкой входа. Для изоляции зависимостей создаём виртуальное окружение: python -m venv venv, затем активируем его командой source venv/bin/activate (Linux/Mac) или venv\Scripts\activate (Windows).
Устанавливаем aiogram через pip install aiogram. Добавляем файл requirements.txt командой pip freeze > requirements.txt, чтобы зафиксировать версии библиотек.
Создаём папку handlers для файлов с логикой обработки сообщений, например start.py, help.py. В корне добавляем config.py для хранения токена бота и других настроек. Рекомендуется подключить python-dotenv, чтобы не хранить чувствительные данные в коде: создаём файл .env с переменной BOT_TOKEN и читаем её в config.py с помощью dotenv.
Для удобства структурируем проект: my_bot/bot.py, my_bot/handlers/, my_bot/config.py, .env, requirements.txt. Добавляем __init__.py в каждую папку, чтобы обозначить их как модули.
На этом этапе проект готов для написания основного кода бота: инициализация диспетчера, регистрация хендлеров и запуск бота. Чёткая структура ускоряет разработку и упрощает поддержку кода.
Обработка команд и сообщений с помощью aiogram

- Создайте объект
Dispatcher, связанный с вашимBot:
bot = Bot(token='ВАШ_ТОКЕН')
dp = Dispatcher(bot)
- Для обработки команд используйте декоратор
@dp.messageс фильтромcommands:
@dp.message(commands=['start'])
async def cmd_start(message: types.Message):
await message.answer('Бот запущен. Используйте /help для списка команд.')
- Чтобы обрабатывать текстовые сообщения без команды, применяйте фильтр
textили более гибкие фильтры:
@dp.message(F.text == 'Привет')
async def greet_user(message: types.Message):
await message.reply('Привет! Чем могу помочь?')
- Для обработки любых сообщений без фильтров добавьте хэндлер без условий:
@dp.message()
async def catch_all(message: types.Message):
await message.answer('Я пока не знаю, как ответить на это сообщение.')
- Рекомендуется использовать регулярные выражения для точного сопоставления сообщений:
@dp.message(F.text.regexp(r'^Заказ \d+$'))
async def handle_order(message: types.Message):
order_id = message.text.split()[1]
await message.answer(f'Вы запросили информацию по заказу №{order_id}')
- Чтобы повысить читаемость кода, группируйте хэндлеры в роутеры (
Router):
router = Router()
@router.message(commands=['help'])
async def cmd_help(message: types.Message):
await message.answer('Список команд: /start, /help, /about')
dp.include_router(router)
- Приоритет обработки: aiogram применяет хэндлеры в порядке регистрации. Размещайте более узкие фильтры выше общих, чтобы избежать перехвата сообщений нецелевыми хэндлерами.
- Для запуска бота используйте
dp.start_polling():
if __name__ == '__main__':
dp.run_polling()
Эти практики обеспечивают точное и эффективное реагирование бота на входящие команды и сообщения, минимизируя конфликт хэндлеров и улучшая масштабируемость проекта.
Добавление кнопок и инлайн-меню для взаимодействия с пользователем

Для создания кнопок в aiogram используются два типа клавиатур: ReplyKeyboardMarkup и InlineKeyboardMarkup. Первый вариант добавляет кнопки под строкой ввода, второй – прямо в сообщении.
Чтобы добавить Reply-кнопки, создаём объект:
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
keyboard.add(KeyboardButton('Старт'), KeyboardButton('Помощь'))
Эти кнопки отправляют текст в чат, как если бы его написал пользователь. Чтобы отправить сообщение с кнопками, используйте:
await message.answer("Выберите действие:", reply_markup=keyboard)
Для Inline-кнопок, которые не вставляют текст, а отправляют callback, создаём:
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
inline_kb = InlineKeyboardMarkup()
inline_kb.add(InlineKeyboardButton('Подробнее', callback_data='details'))
Чтобы отобразить такое меню:
await message.answer("Что вас интересует?", reply_markup=inline_kb)
Важно правильно обрабатывать callback-запросы. Для этого добавляем хэндлер:
@dp.callback_query_handler(lambda c: c.data == 'details')
async def process_callback(callback_query: CallbackQuery):
await callback_query.answer('Информация загружена.')
await callback_query.message.answer('Вот подробности...')
Для сложных меню используйте метод row() или insert():
inline_kb = InlineKeyboardMarkup(row_width=2)
inline_kb.add(
InlineKeyboardButton('Опция 1', callback_data='opt1'),
InlineKeyboardButton('Опция 2', callback_data='opt2')
)
inline_kb.row(InlineKeyboardButton('Назад', callback_data='back'))
Не забывайте про resize_keyboard=True для Reply-клавиатуры, чтобы кнопки подстраивались под экран, и one_time_keyboard=True, если нужно скрывать их после нажатия. Для Inline-кнопок callback_data должен быть коротким (до 64 байт).
Рекомендация: используйте aiogram.utils.keyboard.InlineKeyboardBuilder (начиная с aiogram 3.x) для динамического создания клавиатур, если кнопки формируются из данных.
Реализация логики обработки ошибок и повторных попыток

Для устойчивой работы Telegram-бота на базе aiogram важно обрабатывать ошибки и реализовать механизм повторных попыток. Без этого бот может упасть при сетевых сбоях или нестандартных ответах Telegram API.
Основной инструмент – декоратор @dp.errors_handler. Он позволяет ловить все исключения, возникшие при обработке обновлений. Внутри хэндлера ошибок можно определить конкретные действия для разных типов исключений.
Пример базового хэндлера:
from aiogram.utils.exceptions import RetryAfter, Throttled
@dp.errors_handler()
async def global_error_handler(update, exception):
if isinstance(exception, RetryAfter):
await asyncio.sleep(exception.timeout)
return True
if isinstance(exception, Throttled):
await asyncio.sleep(exception.retry_after)
return True
return False
Для реализации повторных попыток удобно использовать асинхронные циклы с ограничением количества попыток и интервалом между ними. Например, при отправке сообщений:
async def safe_send_message(chat_id, text, max_retries=3, delay=2):
for attempt in range(max_retries):
try:
await bot.send_message(chat_id, text)
break
except RetryAfter as e:
await asyncio.sleep(e.timeout)
except Exception as e:
if attempt < max_retries - 1:
await asyncio.sleep(delay)
else:
raise e
Важно различать RetryAfter (блокировка Telegram из-за превышения лимитов) и общие ошибки (например, проблемы сети). Для RetryAfter нужно всегда использовать рекомендуемое время ожидания (e.timeout), а для других ошибок – заданный интервал повторных попыток.
При проектировании логики стоит избегать бесконечных циклов попыток, чтобы не загружать систему и не попасть в бан Telegram API. Рекомендуется ограничивать число повторов и добавлять логирование неудачных попыток для последующего анализа.
Если бот выполняет критичные задачи (например, пересылку платежных уведомлений), имеет смысл дополнительно сохранять сообщения в очередь (например, Redis), чтобы после сбоя перезапустить доставку из сохранённого состояния.
Обработка ошибок – не опция, а необходимый элемент архитектуры. Без неё бот будет нестабилен и уязвим к любым сбоям инфраструктуры.
Развертывание бота на сервере и запуск в фоновом режиме

Для стабильной работы Telegram-бота с использованием aiogram потребуется сервер с установленным Python (не ниже 3.8) и доступом по SSH. Рекомендуется использовать Linux-сервер (например, Ubuntu 22.04).
1. Подготовка окружения:
Подключитесь к серверу через SSH. Установите Python и pip, если они отсутствуют:
sudo apt update && sudo apt install python3 python3-pip -y
Создайте виртуальное окружение в директории проекта:
python3 -m venv venv
Активируйте окружение:
source venv/bin/activate
Установите зависимости, включая aiogram:
pip install -r requirements.txt
2. Настройка постоянного запуска:
Для работы бота в фоне используйте systemd – встроенный менеджер служб. Создайте unit-файл:
sudo nano /etc/systemd/system/telegrambot.service
Пример содержимого:
[Unit]
Description=Telegram Bot
After=network.target
[Service]
User=ваш_пользователь
WorkingDirectory=/путь/к/проекту
ExecStart=/путь/к/проекту/venv/bin/python bot.py
Restart=always
[Install]
WantedBy=multi-user.target
3. Запуск и управление:
Перезапустите конфигурацию systemd:
sudo systemctl daemon-reload
Запустите службу:
sudo systemctl start telegrambot
Добавьте автозапуск при перезагрузке:
sudo systemctl enable telegrambot
Проверьте статус:
sudo systemctl status telegrambot
Для перезапуска после изменений используйте:
sudo systemctl restart telegrambot
4. Логи:
Просмотр логов через journalctl:
sudo journalctl -u telegrambot -f
Эти шаги обеспечат автоматический и надежный запуск вашего aiogram-бота в фоновом режиме без использования сторонних процессов вроде screen или nohup.
Вопрос-ответ:
Какой минимальный набор знаний нужен, чтобы написать Telegram-бота на Python с помощью aiogram?
Чтобы написать простого Telegram-бота на Python с использованием библиотеки aiogram, нужно понимать основы Python: что такое функции, переменные, условия, циклы. Также полезно разобраться, как работают асинхронные функции (async/await), потому что aiogram построен на асинхронном программировании. Желательно иметь базовое представление о том, как устроены HTTP-запросы и что такое API, поскольку бот взаимодействует с Telegram через их API. Если всё это знакомо хотя бы на начальном уровне, можно приступать к созданию бота.
Чем aiogram лучше других популярных библиотек для создания Telegram-ботов, например python-telegram-bot?
aiogram построен на асинхронном программировании, что позволяет обрабатывать множество запросов одновременно без блокировки. Это особенно заметно, если бот должен отвечать нескольким пользователям одновременно или выполнять задачи, требующие времени (например, запросы к базе данных или внешним API). В отличие от python-telegram-bot, который использует синхронный подход, aiogram обычно требует меньше ресурсов при высокой нагрузке. Кроме того, у aiogram довольно удобная система маршрутизации команд и сообщений, что упрощает организацию кода. Но стоит учитывать, что асинхронное программирование требует чуть большего понимания принципов работы кода.
Как можно протестировать Telegram-бота на aiogram, если он еще не загружен на сервер?
Вы можете запускать бота локально на своем компьютере. Для этого нужно запустить Python-скрипт с кодом бота и убедиться, что у вас открыт доступ к интернету. Telegram-боты работают через сервера Telegram, поэтому ваш локально работающий бот сможет принимать сообщения и отправлять ответы, если настроен правильно и если в коде указан правильный токен бота, выданный BotFather. При локальной работе желательно использовать polling (опрос сервера Telegram на новые сообщения), потому что webhook требует публичного URL и SSL-сертификата. Так что, даже без размещения на сервере, вы сможете тестировать большую часть функциональности.
Как реализовать у бота на aiogram обработку команд и текстовых сообщений одновременно, чтобы они не мешали друг другу?
В aiogram для обработки команд и обычных текстовых сообщений используются разные хэндлеры. Для команд — это `@dp.message_handler(commands=[‘start’, ‘help’])`, а для текстовых сообщений — `@dp.message_handler(content_types=types.ContentType.TEXT)`. Aiogram позволяет задавать фильтры, чтобы четко разделить, какие хэндлеры срабатывают на какие сообщения. Важно помнить про порядок регистрации хэндлеров: если сначала сработает один, другие могут быть пропущены, если не использовать `await message.answer()` аккуратно. Для сложных случаев можно использовать FSM (машину состояний), чтобы бот понимал контекст: например, если пользователь отправил команду, а потом пишет обычные сообщения, бот будет знать, в каком он сейчас «режиме».
