Данная статья не является учебником или разбором документации библиотеки, статья является уроком для более новых пользователей с разбором функциональности бота.
Нужные библиотеки:
Нужные библиотеки:
aiogram версия 3.0.0rc2
Установка библиотеки:
Заходим в командную строку и прописываем:Установится последняя версия aiogram. Если прописать:pip install aiogram -U --pre
То установится aiogram 2.xpip install aiogram
Подготовка для разработки:
Нужен любой редактор кода, подойдет как Sublime Text, VS code, PyCharm и т.п.Я использую PyCharm. Создаем проект и погнали.
Архитектура проекта:
Создание папок:Handlers - В этой директории будет все основные функции бота.
Middlewares - Директория нужна для мидлвари, так скажем прослойка в коде.
Keyboards - Клавиатура для бота.
DataBase - Создание базы данных.
Создание файлов:
bot.py - Запускает бот.
config.py - Файл для конфигурации бота, точнее хранение его данных, таких как Токен бота, данные подключения к базе данных. Хранение данных в Python файле не безопасно, вдруг вы можете загрузить их в общий доступ) Тогда можно использовать виртуальное окружение.
Дальше файлы будем создавать по факту.
Приступаем к работе:
Заходим в BotFather нажимаем 'Старт', пишем /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} Это твой новый бот!')
Пример с answer
Python:
await message.reply(f'Привет {message.from_user.full_name} Это твой новый бот!')
Пример с 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
дописываем 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
Переходим в файл start.pyС resize_keyboard=True
Импортируем кнопки:
Python:
from keyboards.reply.menu_kb_reply import 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="https://t.me/AITDteam")
)
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.Переходим в нашего бота, нажимаем Старт.
Проверка работоспособности бота
На этой у меня все, в следующей части, я бы хотел бы разобрать базу данных PostgresSQL с SQLAlchemy, рассылка в боте c использованием Inline клавиатуры.
Это моя первая статья на этом форуме. Хотел бы услышать ваше мнение по поводу статьи.