Знакомство с aiogram
Скорее всего, вы сюда пришли, поскольку хотите почитать мои книги по aiogram 2.x и aiogram 3.x.
В связи с необходимостью разнести разные версии книг по репозиториям, пришлось изменить адреса, и теперь правильные ссылки такие:
- aiogram 3.x: https://mastergroosha.github.io/aiogram-3-guide/quickstart
- aiogram 2.x: https://mastergroosha.github.io/aiogram-2-guide/quickstart
© 2023 Груша Powered by Hugo & PaperMod
#7 – Библиотека Aiogram для разработки ботов
Уметь работать с несколькими библиотеками является важным навыком. В уроке вы научитесь с нуля работать с aiogram – библиотекой для работы с Telegram API и созданием ботов.
Видеоурок
Можно подумать: зачем изучать еще одну библиотеку, если при помощи Telebot можно создавать ботов? Умение работать с несколькими библиотеками позволит вам лучше понять принцип построения ботов. Кроме того, некоторые заказчики могут требовать написание бота с использованием какой-то конкретной библиотеки. Поэтому лучше изучить еще одну мега популярную библиотеку – Aiogram .
Принцип работы Aiogram очень схож с предыдущей библиотекой. Здесь вы также можете создавать декораторы, отслеживать действия пользователя, отправлять сообщения или файлы, а также можете создавать кнопки и обработчики действий к ним.
Детально ознакомиться с возможностями библиотеки можно на официальной странице с ее документацией .
Весь код будет доступен после подписки на проект!
Урок 1. Быстрый старт. Эхо-бот
Перед началом убедитесь, что у вас установлен интерпретатор языка Python версии не ниже 3.6 (актуальные версии посмотреть и скачать можно здесь). Первый и второй уроки будут проведены на версии 3.6.4, версия библиотеки aiogram 1.0.4 , проверено на версии 1.1.
Этот пункт можно пропустить, если вы не новичок, и уже всё проверили.
Проверить версию интерпретатора можно следующим образом (справедливо для большинства систем): python —version . Будет возвращено Python 3.6.4 . Если у вас установлено несколько версий интерпретатора, будет необходимо указать версию: python3 —version .
Далее устанавливаем библиотеку командой pip install -U aiogram . Если у вас установлено несколько интерпретаторов (например 2 и 3), то необходимо явно указать версию pip: pip3 install -U aiogram . Если у вас установлено несколько версий 3 (например 3.4, 3.5, 3.6), то обращаемся к необходимому интерпретатору командой -m pip . , то есть в данном случае python3.6 -m pip install -U aiogram . Проверить версию библиотеки можно командой pip freeze | grep aiogram (тут так же не забудьте правильно указать версию pip), вернется aiogram==1.0.4 . Возможно, у вас в Windows не будет работать команда grep , тогда используйте просто команду pip freeze и убедитесь в присутствии aiogram в результате выполнения команды.
Начинаем писать код
Давайте для знакомства с библиотекой создадим бота, который будет приветствовать пользователя и высылать в ответ присланный ему текст. Для этого создадим каталог для нашего бота и сохраним там два файла: bot.py и config.py .
Открываем последний любимым текстовым редактором и записываем туда токен, полученный от @BotFather:
TOKEN = '123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11'
Теперь возьмемся за основной файл — приступаем к редактированию файла bot.py . Для этого импортируем необходимые модули библиотеки aiogram и токен бота, а так же инициализируем объекты бота и диспетчера:
from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor from config import TOKEN bot = Bot(token=TOKEN) dp = Dispatcher(bot)
Команда, с которой начинается общение пользователя с ботом — /start . Поэтому давайте научим нашего бота реагировать на эту команду. Создаем message_handler и объявляем там функцию ответа:
@dp.message_handler(commands=['start']) async def process_start_command(message: types.Message): await message.reply("Привет!\nНапиши мне что-нибудь!")
Ещё в ботах принято создавать обработчик команды /help — вдруг пользователь заинтересуется возможностями бота.
Вообще, мы могли бы добавить просто help в массив, передаваемый параметру commands , чтобы получилось:
@dp.message_handler(commands=['start', 'help'])
Но зачем приветствовать пользователя снова? Поэтому создадим отдельный message_handler для этой команды:
@dp.message_handler(commands=['help']) async def process_help_command(message: types.Message): await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!")
Обращу внимание новичка на то, что называть функции можно как угодно — хоть abc , хоть qwerty , однако называя функции понятным языком — process_start_command , process_help_command сразу понятно, какая за что отвечает. Главное, чтобы имена не повторялись. Называть как угодно можно также и имя параметра, покажу дальше.
Итак! Осталось сделать обработку текстового сообщения. Для этого пишем следующее:
@dp.message_handler() async def echo_message(msg: types.Message): await bot.send_message(msg.from_user.id, msg.text)
Объясняю, что мы только что написали:
Если не указывать тип обрабатываемого сообщения, то библиотека по умолчанию делает обработку только текстовых сообщений — то, что нам и нужно. Поэтому скобки на первой строчке остаются пустыми.
Параметр msg это всё то же сообщение, как и в предыдущих пунктах.
В данном случае на последней строчке мы отправляем пользователю сообщение не ответом, а простым сообщением. Для этого мы воспользовались методом send_message и передали в него два обязательных параметра — айди чата, куда отправляем, и сам текст сообщения. Их мы взяли из объекта msg, который является представителем класса Message. Параметр from_user ссылается на ещё один объект — данный параметр имеет класс User. У него есть параметр id — уникальный идентификатор для чатов и каналов в телеграме. Ну и текст полученного сообщения мы получили из поля text.
Финальный штрих
Чтобы получать сообщения от серверов Telegram воспользуемся поллингом (polling. to poll — опрашивать) — постоянным опросом сервера на наличие новых обновлений. Для этого дописываем в bot.py следующее:
if __name__ == '__main__': executor.start_polling(dp)
from aiogram import Bot, types from aiogram.dispatcher import Dispatcher from aiogram.utils import executor from config import TOKEN bot = Bot(token=TOKEN) dp = Dispatcher(bot) @dp.message_handler(commands=['start']) async def process_start_command(message: types.Message): await message.reply("Привет!\nНапиши мне что-нибудь!") @dp.message_handler(commands=['help']) async def process_help_command(message: types.Message): await message.reply("Напиши мне что-нибудь, и я отпрпавлю этот текст тебе в ответ!") @dp.message_handler() async def echo_message(msg: types.Message): await bot.send_message(msg.from_user.id, msg.text) if __name__ == '__main__': executor.start_polling(dp)
Осталось запустить программу. Для этого в командной строке переходим в директорию проекта и пишем
python bot.py

Теперь можно написать нашему боту:
На чём писать чатботов?
Фрймворков для написания чатботов очень много. Из популярных – есть aiogram , telethon , python-telegram-bot . Есть и no code решения по созданию чатботов.
Здесь мы разберём какие библиотеки/решения существуют, их плюсы и минусы и границы применимости.
aiogram
Самый популярный вариант, который фигурирует в каждом первом видео на ютубе. Самое распространённое заблуждение насчёт него – что “асинхронность ускорит вашего чатбота”.
На самом деле не совсем. Она сделает это, но для этого недостаточно просто писать async и await в начале объявления/вызова функций. Для асинхронной работы бота все операции внутри него не должны быть блокирующими (или хотя бы какая-то ощутимая их часть). Это значит, что больше нельзя пользоваться бибилотекой requests , ведь она синхронная, а вам нужен её асинхронный аналог, например, httpx или asks . Нельзя пользоватья redis , нужен aioredis . И так далее.
Библиотека хороша для написания асинхронного кода, но если вы не умеете его писать, то трогать не стоит, получите кучу проблем асинхронного кода, не получив его преимуществ.
python-telegram-bot
Библиотека поддерживает сразу 2 версии: синхронную и асинхронную. Синхронная – это версии 13.X, вот их документация. Асинхронная – в том же репозитории, просто для неё нужно установить версию библиотеки 20.X и старше, документация.
За счёт этого библиотека дружелюбнее для начинающих, пусть это и создаёт некоторую путаницу для новичков, но если вы разобрались один раз “где синхронная, а где нет” – дальше в целом всё понятно. Зато асинхронщину можно совсем не трогать, пока вы к ней не готовы.
Библиотека обладает куда более подробной документацей в сравнении с aiogram, есть статьи о архитектуре, персистентности или обходе спам-лимита Telegram. Функционал, кажется, тоже богаче.
Из минусов – библиотека не обладает таким же активным коммьюнити, как aiogram , в репозитории которого есть ссылки на сообщества по странам.
Мы пользуемся ей в своих пет-проектах и используем как основную в курсе Чат-боты на Python.
telethon
Эта библиотека нужна уже если вы хотите сделать не обычного бота в Telegram, а хотите подключить Python уже к аккаунту в Telegram и “роботизировать” его. Получится, что Python-скрипт как бы управляет вашим аккаунтом, в то время как библиотеки выше управляют ботами, которые в рамках Telegram являются отдельными сущностями, так же, как и каналы или группы.
Это подходит далеко не под все проекты и нужно не во всех ситуациях. Пригодится, например, если вы хотите писать пользователям первым, т.к. боты так делать не умеют. Но и попасть под бан из-за спама так тоже куда легче, чем если работать с ботом.
Документация библиотеки тоже весьма подробная и иногда даже раскрывает “дополнительные” темы, вроде философии библиотеки или чёрной магией, не предусмотренной библиотекой.
No code
Программисты обычно не любят обсуждать этот вариант, некоторые даже начинают шипеть и кусаться. Но это тоже вполне себе валидный вариант написать чатбота в Telegram.
No code – это когда вы создаёте чатбота/сайт/etc без написания кода, просто накликивая их в веб-интерфейсах. Например, Tilda позволяет собрать сайт вообще без знаний программирования, по тому же принципу, как делаются слайды в PowerPoint.
Если бот делает какие-то очень типовые действия, вроде “если пользователь сказал X, ответь Y”, то питон может и не пригодиться, куда проще нарисовать небольшую схему прямо в веб-интерфейсе любого nocode решения. Более того, для этого не обязательно быть программистом, с таким чатботом может справиться и менеджер/маркетолог. Выглядит примерно так:

Минусов у такого подхода, конечно, тоже хватает. Иначе зачем бы разработчикам платили такие зарплаты?
Первый минус – это ограниченность функциональности. В no code-решениях можно пользоваться только тем, что предлагает платформа. Если хочется чего-то своего – извините, придётся писать код.
Второй минус – с ростом проекта он очень быстро превращается в нечитаемый треш. Вот до чего разогнался небольшой чатбот-викторина, буквально на 2-3 окна экрана в одном из наших проектов (см. ниже). Очевидно, ни о каком “быстром росте функционала” тут не может быть и речи, в то время как в коде на Python этот же чатбот уместился бы в сотню строк чистого, читаемого кода.

Попробуйте бесплатные уроки по Python
Получите крутое код-ревью от практикующих программистов с разбором ошибок и рекомендациями, на что обратить внимание — бесплатно.
Переходите на страницу учебных модулей «Девмана» и выбирайте тему.
