Основная разница библиотек python-telegram-bot и aiogram 3.0

Python-telegram-bot и Aiogram 3.0 — это две среды разработки ботов для мессенджера Telegram, выполненные на Python. И хотя оба инструмента предназначены для одной цели, они все же имеют свои отличия. Рассмотрим разницу между Python-telegram-bot и Aiogram, их плюсы и минусы.

Python-telegram-bot — это библиотека на Python для создания Telegram ботов, которая облегчает создание и управление ботами в Telegram. Она имеет простой интерфейс и множество функций. Python-telegram-bot отлично подходит для начинающих разработчиков, которые хотят быстро создать простого бота с основными функциями. Однако библиотека имеет ограниченные возможности для создания продвинутых функций, таких как сценарии и состояния, а также поддержку inline-режима.

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

Однако недостатком Aiogram является то, что он более сложен в использовании, и разработчику, возможно, понадобится больше времени, чтобы разобраться в его работе. Также Aiogram является более требовательным к использованию асинхронного программирования, чем Python-telegram-bot.

Таким образом, выбор между Python-telegram-bot и Aiogram зависит от конкретных потребностей и компетенций разработчика. Если вам нужен быстрый и простой способ создания базового бота, Python-telegram-bot может стать подходящим выбором. Если вы ищете более продвинутые функции и хотите создать более сложного бота, Aiogram может стать более приоритетным инструментом. Но в любом случае, оба инструмента являются отличными средствами для создания ботов для Telegram.

Простая структура меню для chat-bot

Для чистоты эксперимента, в пример возьмем пустую структуру меню состоящую из 3х пунктов и в каждый добавим 3 пункта подменю:

1. Первый
2. Второй
3. Третий

В каждом из них подменю из 3 пунктов:

1. ПодПервый
2. ПодВторой
3. ПодТретий

И добавим 2 команды:
start
help

Пример пустого скелета чат-бота на python-telegram-bot

Для создания чатбота с помощью python-telegram-bot и кнопками необходимо сначала установить библиотеку python-telegram-bot с помощью команды “pip install python-telegram-bot”. Затем нужно создать файл bot.py и написать в нем следующий код:

# Функция для начала работы с ботом
def start(update, context):
    # Создаем список кнопок главного меню
    keyboard = [
        [InlineKeyboardButton("Первый", callback_data='menu_1')],
        [InlineKeyboardButton("Второй", callback_data='menu_2')],
        [InlineKeyboardButton("Третий", callback_data='menu_3')]
    ]
    # Создаем разметку с кнопками
    reply_markup = InlineKeyboardMarkup(keyboard)
    # Отправляем сообщение с кнопками
    update.message.reply_text('Выберите один из пунктов меню:', reply_markup=reply_markup)

# Функция для обработки нажатий на кнопки
def button(update, context):
    # Получаем id кнопки
    query = update.callback_query
    menu_id = query.data
    # В зависимости от нажатой кнопки показываем соответствующее подменю
    if menu_id == 'menu_1':
        keyboard = [
            [InlineKeyboardButton("ПодПервый", callback_data='submenu_1_1')],
            [InlineKeyboardButton("ПодВторой", callback_data='submenu_1_2')],
            [InlineKeyboardButton("ПодТретий", callback_data='submenu_1_3')]
        ]
    elif menu_id == 'menu_2':
        keyboard = [
            [InlineKeyboardButton("ПодПервый", callback_data='submenu_2_1')],
            [InlineKeyboardButton("ПодВторой", callback_data='submenu_2_2')],
            [InlineKeyboardButton("ПодТретий", callback_data='submenu_2_3')]
        ]
    elif menu_id == 'menu_3':
        keyboard = [
            [InlineKeyboardButton("ПодПервый", callback_data='submenu_3_1')],
            [InlineKeyboardButton("ПодВторой", callback_data='submenu_3_2')],
            [InlineKeyboardButton("ПодТретий", callback_data='submenu_3_3')]
        ]
    else:
        # Если пользователя отвлекли от главного меню, то просто возвращаем ему главное меню
        keyboard = [
            [InlineKeyboardButton("Первый", callback_data='menu_1')],
            [InlineKeyboardButton("Второй", callback_data='menu_2')],
            [InlineKeyboardButton("Третий", callback_data='menu_3')]
        ]
    # Создаем разметку с кнопками подменю
    reply_markup = InlineKeyboardMarkup(keyboard)
    # Редактируем сообщение с главным меню и заменяем его на подменю
    query.edit_message_text(text='Выберите один из пунктов:', reply_markup=reply_markup)

# Функция для отображения справки
def help(update, context):
    update.message.reply_text("Привет! Это тестовый чат-бот с главным меню из трех пунктов. Выбери один из них и подпункты.")

# Основная функция бота
def main():
    # Создаем объект updater и передаем ему токен нашего бота
    updater = Updater("TOKEN", use_context=True)

    # Создаём обработчик команды start и привязываем его к функции start
    updater.dispatcher.add_handler(CommandHandler('start', start))

    # Создаём обработчик команды help и привязываем его к функции help
    updater.dispatcher.add_handler(CommandHandler('help', help))

    # Создаём обработчик нажатий на кнопки и привязываем его к функции button
    updater.dispatcher.add_handler(CallbackQueryHandler(button))

    # Запускаем бота
    updater.start_polling()

    # Останавливаем бота, если было получено Ctrl+C
    updater.idle()

if __name__ == '__main__':
    main()

 

Вышеописанный код создает простейший чатбот, который умеет показывать главное меню из трех пунктов и подменю из трех пунктов для каждого из них. Также бот отображает справку при обращении к нему по команде /help. На кнопках отображаются значки вместо текста, но это легко изменить и настроить под нужды своего бота.

Пример пустого скелета чат-бота на aiogram

Для создания чатбота с помощью aiogram и кнопками необходимо сначала установить библиотеку aiogram с помощью команды “pip install aiogram”. Затем нужно создать файл bot.py и написать в нем следующий код:

from aiogram import Bot, Dispatcher, types
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
from aiogram.utils import executor

# создаем бота
bot = Bot(token="TOKEN")
# создаем диспетчер для бота
dp = Dispatcher(bot)

# Функция для начала работы с ботом
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    # Создаем список кнопок главного меню
    keyboard = ReplyKeyboardMarkup(resize_keyboard=True)
    button_1 = KeyboardButton(text="Первый")
    button_2 = KeyboardButton(text="Второй")
    button_3 = KeyboardButton(text="Третий")
    keyboard.add(button_1, button_2, button_3)

    # Отправляем сообщение с кнопками
    await message.answer(text="Выберите один из пунктов меню:", reply_markup=keyboard)

# Функция для обработки нажатий на кнопки главного меню
@dp.message_handler(content_types=['text'])
async def menu(message: types.Message):
    if message.text == 'Первый':
        # Создаем список кнопок подменю для первого пункта
        keyboard = InlineKeyboardMarkup()
        button_1 = InlineKeyboardButton(text="ПодПервый", callback_data='menu_1_1')
        button_2 = InlineKeyboardButton(text="ПодВторой", callback_data='menu_1_2')
        button_3 = InlineKeyboardButton(text="ПодТретий", callback_data='menu_1_3')
        keyboard.add(button_1, button_2, button_3)

        # Отправляем соответствующее подменю
        await bot.send_message(chat_id=message.chat.id, text='Вы выбрали первый пункт меню. Выберите один из пунктов:', reply_markup=keyboard)
    
    elif message.text == 'Второй':
        # Создаем список кнопок подменю для второго пункта
        keyboard = InlineKeyboardMarkup()
        button_1 = InlineKeyboardButton(text="ПодПервый", callback_data='menu_2_1')
        button_2 = InlineKeyboardButton(text="ПодВторой", callback_data='menu_2_2')
        button_3 = InlineKeyboardButton(text="ПодТретий", callback_data='menu_2_3')
        keyboard.add(button_1, button_2, button_3)

        # Отправляем соответствующее подменю
        await bot.send_message(chat_id=message.chat.id, text='Вы выбрали второй пункт меню. Выберите один из пунктов:', reply_markup=keyboard)

    elif message.text == 'Третий':
        # Создаем список кнопок подменю для третьего пункта
        keyboard = InlineKeyboardMarkup()
        button_1 = InlineKeyboardButton(text="ПодПервый", callback_data='menu_3_1')
        button_2 = InlineKeyboardButton(text="ПодВторой", callback_data='menu_3_2')
        button_3 = InlineKeyboardButton(text="ПодТретий", callback_data='menu_3_3')
        keyboard.add(button_1, button_2, button_3)

        # Отправляем соответствующее подменю
        await bot.send_message(chat_id=message.chat.id, text='Вы выбрали туретий пункт меню. Выберите один из пунктов:', reply_markup=keyboard)

# Функция для обработки нажатий на кнопки подменю
@dp.callback_query_handler(lambda c: c)
async def submenu(callback_query: types.CallbackQuery):
    submenu_id = callback_query.data
    if submenu_id == 'menu_1_1':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодПервый')
    elif submenu_id == 'menu_1_2':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодВторой')
    elif submenu_id == 'menu_1_3':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодТретий')
    elif submenu_id == 'menu_2_1':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодПервый')
    elif submenu_id == 'menu_2_2':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодВторой')
    elif submenu_id == 'menu_2_3':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодТретий')
    elif submenu_id == 'menu_3_1':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодПервый')
    elif submenu_id == 'menu_3_2':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодВторой')
    elif submenu_id == 'menu_3_3':
        await bot.send_message(chat_id=callback_query.message.chat.id, text='Вы выбрали подпункт ПодТретий')

# Функция для отображения справки
@dp.message_handler(commands=['help'])
async def menu(message: types.Message):
    await message.answer("Привет! Это тестовый чат-бот с главным меню из трех пунктов. Выбери один из них и подпункты.")

# Основная функция бота
if __name__ == "__main__":
    executor.start_polling(dp, skip_updates=True)

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

Итог

Рассмотрев код выше можно сделать следующий вывод:
разработать chat-bot с одинаковыми и самыми простыми функциями, код в Python-telegram-bot получается более компактным и простым, соответственно код с помощью Aiogram, получается более сложным. Поэтому выбирайте прежде всего, ту библиотеку, которая больше всего подходит под ваши задачи.