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 в области обработки случайных чисел.