Telegram-боты с помощью aiogram в Python: полное руководство

KEDU
Автор статьи

Содержание

Дата публикации 19.01.2025 Обновлено 23.01.2025
Telegram-боты с помощью aiogram в Python: полное руководство
Источник фото: Freepik

Telegram-боты стали неотъемлемой частью экосистемы мессенджера Telegram. Они позволяют автоматизировать множество задач, начиная от простых напоминалок и заканчивая сложными системами взаимодействия с пользователями. Одним из самых популярных инструментов для создания Telegram-ботов является библиотека aiogram на языке программирования Python.

В этой статье мы подробно рассмотрим процесс создания Telegram-ботов с помощью aiogram, разберемся с основными компонентами библиотеки, научимся работать с командами, сообщениями, кнопками и состоянием пользователей. Также обсудим вопросы отладки и развертывания готового бота на сервере.

Что такое Telegram-боты и зачем они нужны?

Telegram-бот – это программа, которая взаимодействует с пользователем внутри мессенджера Telegram. Бот может выполнять различные задачи: отправлять уведомления, отвечать на вопросы, собирать данные, управлять задачами, проводить опросы и многое другое.

Удобство Пользователи могут общаться с ботом так же легко, как с другим человеком в чате.
Автоматизация Боты способны выполнять рутинные операции быстрее и точнее человека.
Масштабируемость Один бот может обслуживать тысячи пользователей одновременно
Гибкость Можно настроить бота под любые нужды, будь то простой помощник или сложная система автоматизации.

Обзор библиотеки aiogram и её преимущества

Aiogram – это асинхронная библиотека для создания Telegram-ботов на Python. Она была разработана специально для работы с Telegram API и предоставляет удобные инструменты для быстрого создания и масштабирования ботов.

Преимущества aiogram

  • Асинхронность: Aiogram использует asyncio, что позволяет эффективно обрабатывать несколько запросов одновременно.
  • Простота использования: библиотека имеет интуитивно понятный интерфейс и хорошо документирована.
  • Богатый функционал: поддерживает работу с командами, сообщениями, кнопками, инлайн-клавиатурами, состояниями пользователя и другими возможностями Telegram.
  • Расширяемость: легко интегрируется с другими библиотеками и фреймворками.

Установка и настройка aiogram

Перед началом работы необходимо установить библиотеку aiogram и настроить среду разработки.

Шаги по установке библиотеки через pip

Для установки aiogram используем менеджер пакетов pip: pip install aiogram

Настройка среды разработки

Мы будем использовать PyCharm, но вы можете выбрать любую другую IDE или редактор кода. Создайте новый проект и убедитесь, что у вас установлен Python версии 3.6 или выше.

Создание простейшего Telegram-бота

Теперь перейдем к созданию нашего первого Telegram-бота.

Получение токена от BotFather

Первым шагом нужно получить токен для вашего бота. Для этого зайдите в Telegram и найдите @BotFather. Отправьте команду /newbot, следуйте инструкциям и получите уникальный токен для своего бота.

Простейший код для запуска бота

Создадим файл bot.py и напишем следующий код:

from aiogram import Bot, Dispatcher, types from aiogram.utils import executor API_TOKEN = 'Ваш_токен' # Инициализируем бота и диспетчер bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) # Обработчик команд /start и /help 

@dp.message_handler(commands=['start', 'help']) async def send_welcome(message: types.Message): await message.reply("Привет! Я ваш первый Telegram-бот.") # 

Запускаем поллинг if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)

Этот код создает простого бота, который отвечает на команды /start и /help. Давайте разберём основные компоненты:

  • Bot: класс, представляющий сам бота.
  • Dispatcher: диспетчер, который обрабатывает входящие сообщения и вызывает соответствующие обработчики.
  • message_handler: декоратор, который указывает, какие сообщения должны быть обработаны функцией.
  • executor.start_polling: функция, запускающая бесконечный цикл опроса сервера Telegram на наличие новых сообщений.

Запустив этот скрипт, вы увидите, что бот начинает работать и реагирует на команды.

Работа с командами и сообщениями

Как обрабатывать команды с помощью декораторов

Aiogram предоставляет удобный способ обработки команд с помощью декораторов. Например, чтобы обработать команду /hello, можно написать такой код:

@dp.message_handler(commands='hello') async def handle_hello(message: types.Message): await message.reply("Hello!")

Таким образом, каждый раз, когда пользователь отправляет команду /hello, бот ответит ему "Hello!".

Примеры обработки текстовых сообщений и команд

Кроме команд, бот также может реагировать на обычные текстовые сообщения. Вот пример обработки приветственного сообщения:

@dp.message_handler(lambda message: 'привет' in message.text.lower()) async def greet_user(message: types.Message): await message.reply(f"Привет, {message.from_user.first_name}!")

Здесь используется лямбда-функция для проверки наличия слова "привет" в сообщении. Если оно присутствует, бот отвечает пользователю персональным приветствием.

Расширенные возможности aiogram

Использование кнопок (Inline и Reply)

Кнопки – это мощный инструмент для взаимодействия с пользователями. Aiogram поддерживает два типа кнопок: Inline и Reply.

Inline кнопки

Inline кнопки отображаются прямо в сообщении и могут вызывать определенные действия при нажатии. Пример создания инлайн клавиатуры:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton inline_kb = InlineKeyboardMarkup() inline_btn_1 = InlineKeyboardButton('Нажми меня!', callback_data='button1') inline_kb.add(inline_btn_1) await bot.send_message(chat_id, 'Выбери действие:', reply_markup=inline_kb)

Когда пользователь нажмет кнопку, бот получит сообщение с callback_data='button1'.

Reply кнопки

Reply кнопки появляются под сообщением и могут использоваться для быстрого выбора вариантов ответа. Пример создания reply клавиатуры:

from aiogram.types import ReplyKeyboardMarkup, KeyboardButton reply_kb = ReplyKeyboardMarkup(resize_keyboard=True) btn1 = KeyboardButton('/команда1') btn2 = KeyboardButton('/команда2') reply_kb.row(btn1, btn2) await bot.send_message(chat_id, 'Выберите команду:', reply_markup=reply_kb)

Работа с состояниями и хранилищем данных

Иногда бывает необходимо сохранять состояние пользователя между запросами. Для этого aiogram предлагает механизм FSM (Finite State Machine). Пример использования состояний:

from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.dispatcher.filters.state import StatesGroup, State from aiogram.dispatcher import FSMContext class Form(StatesGroup): name = State() age = State() storage = MemoryStorage() dp = Dispatcher(bot, storage=storage) 

@dp.message_handler(commands='form') async def process_start(message: types.Message): await Form.name.set() await message.reply("Как тебя зовут?") 

@dp.message_handler(state=Form.name) async def process_name(message: types.Message, state: FSMContext): async with state.proxy() as data: data['name'] = message.text await Form.next() await message.reply("Сколько тебе лет?") 

@dp.message_handler(state=Form.age) async def process_age(message: types.Message, 

state: FSMContext): async with state.proxy() as data: data['age'] = int(message.text) await message.reply(f"Твое имя: {data['name']}, возраст: {data['age']}") await state.finish()

В этом примере создается форма, состоящая из двух шагов: ввод имени и возраста. Данные сохраняются в контексте состояния и используются после завершения формы.

Обработка вебхуков и долгих опросов

Aiogram также поддерживает обработку вебхуков и долгие опросы. Вебхук позволяет отправлять обновления напрямую на ваш сервер, а долгий опрос полезен для выполнения длительных операций.

Пример настройки вебхука:

import logging from aiogram import Bot, Dispatcher, executor logging.basicConfig(level=logging.INFO) API_TOKEN = 'Ваш_токен' WEBHOOK_URL = 'https://yourdomain.com/telegram/webhook'; bot = Bot(token=API_TOKEN) dp = Dispatcher(bot) async def on_startup(dp): await bot.set_webhook(WEBHOOK_URL) async def on_shutdown(dp): await bot.delete_webhook() if __name__ == '__main__': executor.start_webhook( dispatcher=dp, webhook_path='/telegram/webhook', on_startup=on_startup, on_shutdown=on_shutdown, host='0.0.0.0', port=8000 )

Примеры использования

Давайте рассмотрим несколько примеров реальных ботов, которые можно создать с помощью aiogram.

Простой бот для управления задачами

Этот бот позволит пользователям создавать, просматривать и удалять задачи.

from aiogram import Bot, Dispatcher, types from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.dispatcher import FSMContext from aiogram.dispatcher.filters.state import StatesGroup, State from aiogram.types import 

ParseMode API_TOKEN = 'Ваш_токен' bot = Bot(token=API_TOKEN) dp = Dispatcher(bot, storage=MemoryStorage()) class TaskManager(StatesGroup): task_description = State() 

@dp.message_handler(commands='add_task') async def add_task(message:

task: types.Message, state: FSMContext): await TaskManager.task_description.set() await message.reply("Опишите задачу:")

@dp.message_handler(state=TaskManager.task_description) async def process_task_description(message: types.Message, state: FSMContext): async with state.proxy() as data: data['description'] = message.text await message.reply(f"Задача добавлена: {data['description']}") await state.finish()

@dp.message_handler(commands='list_tasks') async def list_tasks(message: types.Message): tasks = get_tasks_from_db(message.from_user.id) # Предположим, что есть функция для получения задач из базы данных if not tasks: await message.reply("У вас нет задач.") else: response = "Вот ваши задачи:\n" for i, task in enumerate(tasks, start=1): response += f"{i}. {task}\n" await message.reply(response, parse_mode=ParseMode.HTML)

@dp.message_handler(commands='delete_task') async def delete_task(message: types.Message): tasks = get_tasks_from_db(message.from_user.id) if not tasks: await message.reply("У вас нет задач для удаления.") else: keyboard = types.InlineKeyboardMarkup() for i, task in enumerate(tasks, start=1): button = types.InlineKeyboardButton(text=f"{i}", callback_data=f"delete_{i}") keyboard.add(button) await message.reply("Выберите задачу для удаления:", reply_markup=keyboard)

@dp.callback_query_handler(lambda c: c.data.startswith('delete_')) async def process_delete_callback(callback_query: types.CallbackQuery): index = int(callback_query.data.split('_')[1]) - 1 tasks = get_tasks_from_db(callback_query.from_user.id) deleted_task = tasks.pop(index) update_tasks_in_db(callback_query.from_user.id, tasks) await bot.answer_callback_query(callback_query.id, text=f"Удалено: {deleted_task}")

if name == 'main': executor.start_polling(dp, skip_updates=True)

#### Расширенный пример с использованием API Бот для отслеживания курсов валют с использованием стороннего API: ```python import requests from aiogram import Bot, Dispatcher, types from aiogram.types import ParseMode API_TOKEN = 'Ваш_токен' CURRENCY_API_URL = 'https://api.exchangerate-api.com/v4/latest/{currency}'; bot =   Bot(token=API_TOKEN) dp = Dispatcher(bot) 

@dp.message_handler(commands='rate') async def currency_rate(message: types.Message): args = message.get_args().split() if len(args) != 2: await message.reply("Формат команды: /rate ") return base_currency, amount = args try: amount = float(amount) except ValueError: await message.reply("Некорректная сумма.") return url = 

CURRENCY_API_URL.format(currency=base_currency.upper()) response = requests.get(url) if response.status_code != 200: await message.reply("Произошла ошибка при получении курса валюты.") return rates = response.json()['rates'] result = [] for currency, rate in rates.items(): converted_amount = round(rate * amount, 2) 

result.append(f"{amount} {base_currency} = {converted_amount} {currency}") response_text = "\n".join(result) await message.reply(response_text, parse_mode=ParseMode.HTML) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True)

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

Отладка и деплой бота

Советы по отладке кода

При разработке ботов часто возникают ошибки и баги. Вот несколько советов по отладке:

  • Логирование: используйте модуль logging для записи информации о работе бота. Это поможет вам понять, где происходит ошибка: import logging logging.basicConfig(level=logging.DEBUG)
  • Проверка токенов и настроек: убедитесь, что токены и другие настройки корректны. Ошибки в этих параметрах могут привести к тому, что бот не будет работать.
  • Тестирование в локальной среде: перед развертыванием на сервере протестируйте бота в локальной среде. Это поможет выявить большинство ошибок до того, как они станут проблемой в продакшн-среде.

Создание Telegram-ботов с помощью aiogram – это увлекательный и полезный процесс. Мы рассмотрели основы работы с библиотекой, узнали, как обрабатывать команды и сообщения, использовать кнопки и состояния, а также как развертывать бота на сервере.

Если вы только начинаете свой путь в программировании или хотите расширить свои навыки, создание ботов на aiogram станет отличным стартом. Продолжайте учиться, экспериментировать и улучшать свои проекты!

Онлайн-ресурсы для самостоятельного изучения

Coursera

Coursera — одна из крупнейших образовательных платформ, предлагающих курсы от ведущих мировых университетов и компаний. Курсы на Coursera обычно структурированы и включают видеолекции, задания, тесты и проекты.

Stepik

Stepik — российская образовательная платформа, предлагающая курсы по различным дисциплинам, включая программирование. Курсы на Stepik отличаются интерактивными заданиями и возможностью общения с преподавателями и сокурсниками.

Udemy

Udemy — глобальная платформа, предлагающая тысячи курсов по самым разным темам, включая программирование. Курсы на Udemy создаются независимыми инструкторами и могут сильно различаться по качеству и глубине охвата материала.

GeekBrains

GeekBrains — российский образовательный портал, специализирующийся на IT-образовании. Предлагает как отдельные курсы, так и полноценные программы обучения с наставничеством и карьерной поддержкой.

Codecademy

Codecademy — интерактивная платформа для изучения программирования, которая фокусируется на практической стороне дела. Курсы проходят в форме пошаговых заданий, выполняемых непосредственно в браузере.

Мы надеемся, что эта статья помогла вам лучше понять работу функции randint и вдохновила на дальнейшее изучение возможностей Python в области обработки случайных чисел.

Вопрос — ответ
Какие основные этапы создания Telegram-бота с помощью aiogram?

Какую роль играет декоратор @dp.message_handler в aiogram?

Чем отличаются inline и reply кнопки в aiogram?

Как можно сохранить состояние пользователя между запросами в aiogram?
Комментарии
Всего
2
2025-01-23T00:00:00+05:00
А как быть с безопасностью бота?
2025-01-23T00:00:00+05:00
очень полезно, что вы указали примеры кода.
Читайте также
Все статьи