</> Python - Создание Telegram бота на aiogram 3 | ФОРУМ СОЦИАЛЬНОЙ ИНЖЕНЕРИИ ⭐️MeHack⭐️ - Читы, базы, раздачи аккаунтов, сливы скриптов, способы заработка

</> Python Создание Telegram бота на aiogram 3

Тема в разделе "Python", создана пользователем lolzteam, 28.08.23.Просмотров: 296

  1. lolzteam МультиМагнат

    lolzteam

    356 сообщения
    5 симпатий
    0
    розыгрышей
    2 года с нами
    10 месяцев с нами
    21 день с нами
    Создание 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 файле не безопасно, вдруг вы можете загрузить их в общий доступ) Тогда можно использовать виртуальное окружение.

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

    [​IMG]



    Приступаем к работе:
    Заходим в Скрытый контент. Для просмотра Вы должны быть зарегистрированным участником нажимаем 'Старт', пишем /newbot.

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

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

    Заходим в config.py и прописываем:
    Python:
    BOT_TOKEN = 'Тут ваш Token'

    [​IMG]


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

    [​IMG]



    Импорты:

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

    [​IMG]



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

    "> [​IMG]
    Пример с answer
    Python:
    await message.reply(f'Привет {message.from_user.full_name} Это твой новый бот!')


    71d9cfa1fdb36337c9997.png
    dltLerk · 27 Авг 2023 в 21:49

    "> [​IMG]
    Пример с 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.

    [​IMG]

    Reply кнопки
    [​IMG]

    Inline кнопка


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

    1.Reply

    2.Inline


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

    [​IMG]

    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)

    [​IMG]

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

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

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

    [​IMG]

    Без resize_keyboard=True

    [​IMG]

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

    Импортируем кнопки:
    Python:
    from keyboards.reply.menu_kb_reply import menu_kb

    Приписываем после нашего сообщения, клавиатуру reply_markup=menu_kb()

    [​IMG]

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

    [​IMG]

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

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

    [​IMG]


    Из 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())

    [​IMG]


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

    [​IMG]


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

    [​IMG]

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

    5a20da43d7ba9c1cb6732.png
    dltLerk · 27 Авг 2023 в 21:49

    "> [​IMG]
    e51db76b0d93e49837885.png
    dltLerk · 27 Авг 2023 в 21:49

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