Гайд - Бот - Создание Telegram бота на aiogram 3 | End Way - форум программирования и сливов различных скриптов
  • Присоединяйтесь к нам в телеграм канал! EndWay канал | EndSoft канал | EWStudio канал
  • Хочешь поставить скрипт, но не умеешь?
    А может ты хочешь свой скрипт на основе слитого?

    Тогда добро пожаловать в нашу студию разработки!

    Телеграм бот: EWStudioBot
    Телеграм канал: EWStudio

Гайд Бот Создание Telegram бота на aiogram 3

dltLerk

Джун
Автор темы
9 Янв 2023
14
8
0
Данная статья не является учебником или разбором документации библиотеки, статья является уроком для более новых пользователей с разбором функциональности бота.
Нужные библиотеки:
aiogram версия 3.0.0rc2
Установка библиотеки:
Заходим в командную строку и прописываем:

pip install aiogram -U --pre
Установится последняя версия aiogram. Если прописать:
То установится aiogram 2.x

Подготовка для разработки:
Нужен любой редактор кода, подойдет как Sublime Text, VS code, PyCharm и т.п.
Я использую PyCharm. Создаем проект и погнали.


Архитектура проекта:
Создание папок:

Handlers - В этой директории будет все основные функции бота.

Middlewares - Директория нужна для мидлвари, так скажем прослойка в коде.

Keyboards - Клавиатура для бота.

DataBase - Создание базы данных.


Создание файлов:

bot.py - Запускает бот.

config.py - Файл для конфигурации бота, точнее хранение его данных, таких как Токен бота, данные подключения к базе данных. Хранение данных в Python файле не безопасно, вдруг вы можете загрузить их в общий доступ) Тогда можно использовать виртуальное окружение.

Дальше файлы будем создавать по факту.

9383507b3d1097d34eca9.png



Приступаем к работе:
Заходим в BotFather нажимаем 'Старт', пишем /newbot.

Даем имя нашему боту и дальше даем ему username, Random_bot либо RandomBot, Назвать бота можно как угодно так же как и username.

Когда получили Token бота, переходим в редактор кода.

Заходим в config.py и прописываем:

Python:
BOT_TOKEN = 'Тут ваш Token'
66a4c8345299f84509d55.png


Заходим в 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())
652018df81158c1be430b.png



Импорты:

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}!'
                         'Это твой новый бот!')
80e43b391bb1781b5b7c3.png



Все необходимое импортируем из библиотеки 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

Python:
await message.reply(f'Привет {message.from_user.full_name} Это твой новый бот!')

71d9cfa1fdb36337c9997.png



{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.

4a7c918ac8b016c7d02f2.png

78e3ec8d9d036e1fa8c34.png



Переходим в директорию keyboards в ней создаем две директории:

1.Reply

2.Inline


В директории Reply создадим файл menu_kb_reply.py

a53e4f08525c2f9b9b241.png

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)
f820f470da31bc0dd9105.png

Из aiogram импортируем все нужное для клавиатуры.
Создаем функцию menu_kb в ней создаем клавиатуру.

adjust(2) - Сделает клавиатуру в два столбца.

as_markup(resize_keyboard=True) - преобразовывает с ReplyKeyboardBuilder() в ReplyKeyboardMarkupб, resize_keyboard=True - делает кнопки по меньше внизу будет два примера.

cc3e10c7761aeb8782493.png

Без resize_keyboard=True

fe5df7feb90c4e9aa0977.png

Переходим в файл start.py

Импортируем кнопки:

Python:
from keyboards.reply.menu_kb_reply import menu_kb
Приписываем после нашего сообщения, клавиатуру reply_markup=menu_kb()

5ef917e620b26ae3b8067.png

Теперь в директории handlers создаем директорию menu, в ней создаем Python файл profile.py.

67a8e29efd7316067608d.png

Для чего это нужно? Будет удобно в дальнейшем когда будет большой проект, не искать где же тот файл, а все файлы будут разбиты по директориям.

Переходим в файл 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}')
357efaf0c27d6cadb4f2b.png


Из 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())
113c5e79dc8755c0b1a5b.png


Все тоже самое что и в 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)
0fbdaa5447d6a248805bb.png


Запуск бота:
Запускаем бота, в консоль появилась информация от библиотеки logging.

760869b04f9e399924c44.png

Переходим в нашего бота, нажимаем Старт.

5a20da43d7ba9c1cb6732.png

e51db76b0d93e49837885.png

Проверка работоспособности бота
На этой у меня все, в следующей части, я бы хотел бы разобрать базу данных PostgresSQL с SQLAlchemy, рассылка в боте c использованием Inline клавиатуры.

Это моя первая статья на этом форуме. Хотел бы услышать ваше мнение по поводу статьи.
 
Like
  • 4
Реакции: 3 users

Харизма

Джун
3 Июл 2023
11
4
0
Для новичков очень хорошо разложено по полочкам, красава.
Но я думаю тебе стоит добавить про виртуальное окружение и хранение токена в .env, это приучит новокеков к хорошей архетиктуре и чистому коду.
+ удобно заливать на гитхаб.
 
Like
  • 2
Реакции: 1 users

DeCoded

Кибермаг
8 Янв 2023
731
1,698
93
Прочитал статью, познал для себя pre версию, попробую на ней покодить, касательно недочетов: у тебя в мейне не по PEP-08 идет написание кода ну и .env не используется для хранения токена (можно еще использовать .pkl, пикловскую запись)
 
Активность:
Пока что здесь никого нет