Статья является уроком для новых пользователей с разбором функциональности бота.
Нужные библиотеки:
Установка библиотеки:
Заходим в командную строку и прописываем:
pip install aiogram -U --pre
Установится последняя версия 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 и прописываем:
BOT_TOKEN = 'Тут ваш Token'
Заходим в
bot.py и начинаем писать код.
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.
В нем пишем:
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.
await message.answer(f'Привет {message.from_user.full_name} Это твой новый бот!')
Пример с answer
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 в импортах пишем
from handlers import start
В функции main, изменяем строку
dp.include_routers(router) в ней
дописываем
dp.include_routers(start.router)
Кнопки:
Существуют два вида кнопок это Inline и Reply.
Переходим в директорию
keyboards в ней создаем две директории:
1.Reply
2.Inline
В директории
Reply создадим файл
menu_kb_reply.py
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 - делает кнопки по меньше внизу будет два примера.
Переходим в файл
start.py
Импортируем кнопки:
from keyboards.reply.menu_kb_reply import menu_kb
Приписываем после нашего сообщения, клавиатуру
reply_markup=menu_kb()
Теперь в директории
handlers создаем директорию
menu, в ней создаем Python файл
profile.py.
Для чего это нужно? Будет удобно в дальнейшем когда будет большой проект, не искать где же тот файл, а все файлы будут разбиты по директориям.
Переходим в файл
profile.py, прописываем:
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 и в нем пишем:
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.
В импортах пишем:
from handlers.menu import profile, about_project
В строке
dp.include_routers() в скобках дописываем
profile.router,
about_project.router, получилось
dp.include_routers(start.router, profile.router, about_project.router)
Запуск бота:
Запускаем бота, в консоль появилась информация от библиотеки
logging.
Переходим в нашего бота, нажимаем Старт.
Проверка работоспособности бота: