Telegram Боты на Aiogram 3.x: Профиль, админ-панель и реферальная система

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Друзья, приветствую! В предыдущих статьях я подробно рассказал о разработке телеграм-ботов на aiogram версии 3.7. Мы уже рассмотрели следующие темы:

  • Работа с текстовыми и медиа сообщениями

  • Использование клавиатур

  • Командное меню и команды, и как с ними работать

  • Основы использования FSM

  • Интеграция в телеграм-бота PostgreSQL

  • Магические фильтры, имитация действий бота и многое другое.

Если нет, то переходите в мои публикации. Там я максимально подробно раскрыл каждую из тем, которых будем сегодня касаться.

Теперь, опираясь на этот фундамент, я предлагаю сделать мои статьи о телеграм-ботах на aiogram 3 более практическими и насыщенными примерами, с минимальным количеством теории. Это, как мне кажется, будет более увлекательно и полезно, давая вам больше практического опыта.

К концу этой статьи вы будете четко понимать, как разработать личный профиль и админ-панель для телеграм-ботов. Также мы разработаем простую реферальную систему. Давайте начнем!

Сегодняшний бот будет включать следующие функции:

  1. Возможность регистрации пользователей (создание таблицы в PostgreSQL, написание функции для добавления пользователей).

  2. Функция для получения информации о пользователях (информации о себе для личного профиля и всех пользователей для админ-панели).

  3. Простой профиль пользователя с информацией о количестве приглашенных людей и возможностью скопировать реферальную ссылку.

  4. Простая админ-панель с проверкой на права администратора и отображением информации о всех пользователях с базы данных.

  5. Простая реферальная система, фиксирующая, кто пригласил пользователя и сколько пользователей было приглашено с подгрузкой этих данных в личный профиль.

Операции, такие как запись пользователей в базу данных, изменение данных о пользователях, отображение данных, реферальная система, профиль, и админ-панель, необходимы в большинстве проектов, так что берите эту статью на заметку.

Для вашего удобства я подготовил готовый проект, о котором пойдет речь, на своем GitHub. Устанавливайте Git, если он у вас еще не установлен, и выполняйте команду в дирректории, в которой хотит:

git clone https://github.com/Yakvenalex/easy_refer_bot

Структура проекта:

- db_handler
    - __init__.py: Инициализация модуля.
    - db_funk.py: Функции для взаимодействия с PostgreSQL.

- handlers
    - __init__.py: Инициализация модуля.
    - admin_panel.py: Роутер для админ-панели.
    - user_router.py: Роутер для пользовательской части.

- keyboards
    - __init__.py: Инициализация модуля.
    - kbs.py: Файл со всеми клавиатурами.

- utils
    - __init__.py: Инициализация модуля.
    - utils.py: Файл с утилитами.

После клонирования репозитория необходимо выполнить простые настройки:

  1. Установите библиотеки при помощи команды pip install -r requirements.txt

  2. Настройте файл .env следующим образом:

TOKEN=your_bot_token
ADMINS=admin1,admin2
ROOT_PASS=dasfg531KKK331xklaS
PG_LINK=postgresql://username:password@host:port/dbname

Предварительно сгенерируйте «чистый» токен, который на данный момент нигде активно не используется (подробнее ТУТ).

Так же необходимо настроить подключение к базе данных постгрес. Этому посвящал отдельно ни одну статью и активно касался в контексте ботов, так что точно разберетесь, если ещё не работали с PostgreSQL (подробнее ТУТ).

Обязательно передайте список telegram_id – это список администраторов, которые будут иметь доступ к админ-панели.

ROOT_PASS это дополнительный пароль для базы данных (не для подключения, а для дополнительной проверки при дефолтных операциях – подробнее про библиотеку asyncpg-lite ТУТ).

Рассмотрим файл с настройками (create_bot.py):

import logging
from aiogram import Bot, Dispatcher
from aiogram.client.default import DefaultBotProperties
from aiogram.enums import ParseMode
from asyncpg_lite import DatabaseManager
from decouple import config

# получаем список администраторов из .env
admins = [int(admin_id) for admin_id in config('ADMINS').split(',')]

# настраиваем логирование и выводим в переменную для отдельного использования в нужных местах
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

# инициируем объект, который будет отвечать за взаимодействие с базой данных
db_manager = DatabaseManager(dsn=config('PG_LINK'), deletion_password=config('ROOT_PASS'))

# инициируем объект бота, передавая ему parse_mode=ParseMode.HTML по умолчанию
bot = Bot(token=config('TOKEN'), default=DefaultBotProperties(parse_mode=ParseMode.HTML))

# инициируем объект бота
dp = Dispatcher()

Тут, как видите, оставил комментарии. Единственное на что обратите внимание:

bot = Bot(token=config('TOKEN'), default=DefaultBotProperties(parse_mode=ParseMode.HTML))

Благодаря такой инициации наш бот по умолчанию будет считывать HTML теги с сообщений (подробнее ТУТ).

Инициируем объект, который будет отвечать за взаимодействие с базой данных:

db_manager = DatabaseManager(dsn=config('PG_LINK'), deletion_password=config('ROOT_PASS'))

Тут как раз и пригодится наш ROOT_PASS. Его необходимо будет отдельно передавать в дефолтных операциях, таких как удаление всех данных из таблицы или удаление самой таблицы (безопасность).

Рассмотрим главный файл бота (aiogram_run.py):

import asyncio
from create_bot import bot, dp, admins
from db_handler.db_funk import get_all_users
from handlers.admin_panel import admin_router
from handlers.user_router import user_router
from aiogram.types import BotCommand, BotCommandScopeDefault


# Функция, которая настроит командное меню (дефолтное для всех пользователей)
async def set_commands():
    commands = [BotCommand(command='start', description='Старт'),
                BotCommand(command='profile', description='Мой профиль')]
    await bot.set_my_commands(commands, BotCommandScopeDefault())


# Функция, которая выполнится когда бот запустится
async def start_bot():
    await set_commands()
    count_users = await get_all_users(count=True)
    try:
        for admin_id in admins:
            await bot.send_message(admin_id, f'Я запущен						
Источник: https://habr.com/ru/articles/822809/


Интересные статьи

Интересные статьи

В МойОфис мы не только выпускаем ПО для бизнеса и частных пользователей, но и активно сотрудничаем с образовательными организациями. Продукт «МойОфис Образование», включающий в себя приложения для раб...
Вышла новая версия платформы для контроля уровня кибербезопасности и зрелости процессов в группах компаний BI.ZONE Cyber Maturity Platform (BI.ZONE CMP). В новой версии появились возмож...
В предыдущей статье я рассказывал об Авакари - системе обратного поиска в потоке сообщений. С тех пор прошло некоторое время на обкатку системы и добавление новых функций. Наконец,...
Привет! Я Владимир Колосков, ведущий разработчик в Softpoint. Сегодня я хочу поделиться своими соображениями по поводу миграции больших и огромных БД с MSSQL Server на PostgreSQL: зачем это делать, ст...
Пару лет назад в сети появилась информация о проекте Serenity — Unix-подобной операционной системе для архитектуры x86 с собственным ядром и винтажным интерфейсом. При этом возможности операционной ...