Создание Telegram бота на aiogram 3 Данная статья не является учебником или разбором документации библиотеки, статья является уроком для более новых пользователей с разбором функциональности бота. Нужные библиотеки: aiogram версия 3.0.0rc2 Установка библиотеки: Заходим в командную строку и прописываем: pip install aiogram -U --pre Установится последняя версия aiogram. Если прописать: pip install aiogram То установится aiogram 2.x Подготовка для разработки: Нужен любой редактор кода, подойдет как Sublime Text, VS code, PyCharm и т.п. Я использую PyCharm. Создаем проект и погнали. Архитектура проекта: Создание папок: Handlers - В этой директории будет все основные функции бота. Middlewares - Директория нужна для мидлвари, так скажем прослойка в коде. Keyboards - Клавиатура для бота. DataBase - Создание базы данных. Создание файлов: bot.py - Запускает бот. config.py - Файл для конфигурации бота, точнее хранение его данных, таких как Токен бота, данные подключения к базе данных. Хранение данных в Python файле не безопасно, вдруг вы можете загрузить их в общий доступ) Тогда можно использовать виртуальное окружение. Дальше файлы будем создавать по факту. Приступаем к работе: Заходим в Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником нажимаем 'Старт', пишем /newbot. Даем имя нашему боту и дальше даем ему username, Random_bot либо RandomBot, Назвать бота можно как угодно так же как и username. Когда получили Token бота, переходим в редактор кода. Заходим в config.py и прописываем: Python: BOT_TOKEN = 'Тут ваш Token' Заходим в bot.py и начинаем писать код. Python: import asyncio import logging from aiogram import Bot, Dispatcher from config import BOT_TOKEN async def main(): bot = Bot(BOT_TOKEN, parse_mode='HTML') dp = Dispatcher() dp.include_routers(router) await bot.delete_webhook(drop_pending_updates=True) await dp.start_polling(bot) if __name__ == '__main__': logging.basicConfig(level=logging.INFO) asyncio.run(main()) Импорты: import asyncio - Асинхронный модуль для написания кода входа и выхода. import logging - Модуль который уведомляет о состоянии событий нашего бота. from aiogram import Bot, Dispatcher - Aiogram основная библиотека для написания бота, из нее импортируем объект бота и диспетчер, он принимает все события и обрабатывает их. from config import BOT_TOKEN - Из файла config импортируем переменную BOT_TOKEN. Функция main(): async def main(): - Асинхронное создание функции называем ее main(), в основном стандартное имя функции, функцию можно назвать как угодно. bot = Bot(BOT_TOKEN, parse_mode='HTML') - Создаем объект бота и помечаем разметку сообщений 'parse_mode' как HTML, для меня разметка простая да и во все она не сложная. dp = Dispatcher() - Диспетчер, ну тут все и так понятно. dp.include_routers(router) - Подключает к диспетчеру все наши роутеры(Обработчики). Пример с Роутерами увидите в следующих файлов. Роутеры можно регистрировать двумя способами: dp.include_routers(start.router, menu.router) или dp.include_routers(start.router) dp.include_routers(menu.router) await bot.delete_webhook(drop_pending_updates=True) - Удаляет все сообщения, которые произошли после последнего завершения работы бота. await dp.start_polling(bot) - Периодически отправляет запрос на Telegram сервер, что бы узнать появилось ли новое событие. logging.basicConfig(level=logging.INFO) - информирует о новых событиях в боте. Команда /start: Переходим в папку handlers, создаем Python файл: start.py. В нем пишем: Python: from aiogram import Router, F from aiogram.filters import Command from aiogram.types import Message router = Router() @router.message(Command('start')) async def command_start(message: Message): await message.answer(f'Привет {message.from_user.full_name}!' 'Это твой новый бот!') Все необходимое импортируем из библиотеки aiogram. F - Новый магический фильтр который может обрабатывать любой тип сообщения. Command - Фильтр для работы с командами. Message - Тип для работы с сообщениями Затем создаем Router, для следящей привязки его к обработчиком. @router.message(Command('start')) - Создаем декоратор обработчика событий с фильтром команды start Создаем асинхронную функцию с типом Message и в ней отвечаем пользователю. Отвечать текстом на сообщение можно двумя способами при помощи answer и reply. Python: await message.answer(f'Привет {message.from_user.full_name} Это твой новый бот!') 69d1b6265818842b94789.png dltLerk · 27 Авг 2023 в 21:49 "> Пример с answer Python: await message.reply(f'Привет {message.from_user.full_name} Это твой новый бот!') 71d9cfa1fdb36337c9997.png dltLerk · 27 Авг 2023 в 21:49 "> Пример с reply {message.from_user.full_name} - Выводит полное имя и фамилию пользователя(full_name), так же есть и другие типы такие как id, username, last_name, first_name и т.п. Теперь разберем {message.from_user.options}: message - объект функции, from_user - Обращение к пользователю options - тут параметры которые нам нужны, о них я говорил выше. Обратно переходим в main.py в импортах пишем Python: from handlers import start В функции main, изменяем строку dp.include_routers(router) в ней дописываем dp.include_routers(start.router) Кнопки: Существуют два вида кнопок это Inline и Reply. Reply кнопки Inline кнопка Переходим в директорию keyboards в ней создаем две директории: 1.Reply 2.Inline В директории Reply создадим файл menu_kb_reply.py Python: from aiogram.types import ReplyKeyboardMarkup from aiogram.utils.keyboard import ReplyKeyboardBuilder def menu_kb() -> ReplyKeyboardMarkup: kb_main = ReplyKeyboardBuilder() kb_main.button(text='Профиль') kb_main.button(text='О проекте') kb_main.adjust(2) return kb_main.as_markup(resize_keyboard=True) Из aiogram импортируем все нужное для клавиатуры. Создаем функцию menu_kb в ней создаем клавиатуру. adjust(2) - Сделает клавиатуру в два столбца. as_markup(resize_keyboard=True) - преобразовывает с ReplyKeyboardBuilder() в ReplyKeyboardMarkupб, resize_keyboard=True - делает кнопки по меньше внизу будет два примера. Без resize_keyboard=True С resize_keyboard=True Переходим в файл start.py Импортируем кнопки: Python: from keyboards.reply.menu_kb_reply import menu_kb Приписываем после нашего сообщения, клавиатуру reply_markup=menu_kb() Теперь в директории handlers создаем директорию menu, в ней создаем Python файл profile.py. Для чего это нужно? Будет удобно в дальнейшем когда будет большой проект, не искать где же тот файл, а все файлы будут разбиты по директориям. Переходим в файл profile.py, прописываем: Python: from aiogram import Router, F from aiogram.types import Message router = Router() @router.message(F.text == 'Профиль') async def command_start(message: Message): await message.reply(f'Пользователь {message.from_user.full_name}!\n' f'Ваш id: {message.from_user.id}') Из aiogram импортируем все то что надо, создаем Router, создаем декоратор с фильтром F.text, бот будет принимать слово Профиль от пользователя и затем выполняет код внутри функции. Создаем Python файл в этой же директории about_project.py и в нем пишем: Python: from aiogram import Router, F, types from aiogram.types import Message from aiogram.utils.keyboard import InlineKeyboardBuilder router = Router() @router.message(F.text == 'О проекте') async def command_start(message: Message): kb_project_url = InlineKeyboardBuilder() kb_project_url.row(types.InlineKeyboardButton( text="Наш канал", url="Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником") ) await message.reply(f'Проект будет в скором времени обновляться!', reply_markup=kb_project_url.as_markup()) Все тоже самое что и в profile.py, лишь только добавляется Inline клавиатура. В коде URL кнопка, т.е при помощи ее можно переходить на какой либо URL-адрес. Переходим в bot.py. В импортах пишем: Python: from handlers.menu import profile, about_project В строке dp.include_routers() в скобках дописываем profile.router, about_project.router, получилось Python: dp.include_routers(start.router, profile.router, about_project.router) Запуск бота: Запускаем бота, в консоль появилась информация от библиотеки logging. Переходим в нашего бота, нажимаем Старт. 5a20da43d7ba9c1cb6732.png dltLerk · 27 Авг 2023 в 21:49 "> e51db76b0d93e49837885.png dltLerk · 27 Авг 2023 в 21:49 "> Проверка работоспособности бота На этой у меня все, в следующей части, я бы хотел бы разобрать базу данных PostgresSQL с SQLAlchemy, рассылка в боте c использованием Inline клавиатуры.