Как написать telegram бота на python aiogram

Как написать telegram бота на python aiogram

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

Для начала, важно понимать, что aiogram – это современная и удобная библиотека для работы с Telegram API, которая поддерживает асинхронное выполнение. Это даёт несколько преимуществ, таких как высокая производительность и возможность обрабатывать запросы пользователей в реальном времени. В отличие от других библиотек, aiogram обладает простым интерфейсом, но в то же время предлагает широкие возможности для настройки.

Перед тем как приступить к созданию бота, вам потребуется зарегистрировать его в BotFather, который предоставляет уникальный токен для взаимодействия с Telegram API. Этот токен будет необходим для отправки сообщений и обработки команд через бота. После регистрации и получения токена можно приступать к установке aiogram и созданию первого скрипта.

Регистрация бота в Telegram и получение API токена

Для интеграции aiogram с Telegram необходимо создать бота через BotFather и получить API токен.

  1. В Telegram найдите @BotFather.
  2. Отправьте команду /newbot.
  3. Введите название бота (например, ФинансовыйАссистент).
  4. Задайте уникальный username, оканчивающийся на bot (например, finance_assistant_bot).
  5. Скопируйте API токен, который BotFather выдаст (например, 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).

Рекомендации по работе с токеном:

  • Храните токен в файле .env или в переменных окружения, а не в открытом коде.
  • Добавьте .env в .gitignore, чтобы исключить файл из репозитория.
  • При утечке токена используйте /revoke у BotFather для генерации нового.
  • Сохраняйте username и ID бота – они понадобятся для настройки и администрирования.

После получения токена можно переходить к настройке aiogram и написанию кода бота.

Установка и настройка библиотеки 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

Обработка команд и сообщений с помощью 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 (машину состояний), чтобы бот понимал контекст: например, если пользователь отправил команду, а потом пишет обычные сообщения, бот будет знать, в каком он сейчас «режиме».

Ссылка на основную публикацию