Друзья, приветствую! В предыдущих статьях я подробно рассказал о разработке телеграм-ботов на aiogram версии 3.7. Мы уже рассмотрели следующие темы:
Работа с текстовыми и медиа сообщениями
Использование клавиатур
Командное меню и команды, и как с ними работать
Основы использования FSM
Интеграция в телеграм-бота PostgreSQL
Магические фильтры, имитация действий бота и многое другое.
Если нет, то переходите в мои публикации. Там я максимально подробно раскрыл каждую из тем, которых будем сегодня касаться.
Теперь, опираясь на этот фундамент, я предлагаю сделать мои статьи о телеграм-ботах на aiogram 3 более практическими и насыщенными примерами, с минимальным количеством теории. Это, как мне кажется, будет более увлекательно и полезно, давая вам больше практического опыта.
К концу этой статьи вы будете четко понимать, как разработать личный профиль и админ-панель для телеграм-ботов. Также мы разработаем простую реферальную систему. Давайте начнем!
Сегодняшний бот будет включать следующие функции:
Возможность регистрации пользователей (создание таблицы в PostgreSQL, написание функции для добавления пользователей).
Функция для получения информации о пользователях (информации о себе для личного профиля и всех пользователей для админ-панели).
Простой профиль пользователя с информацией о количестве приглашенных людей и возможностью скопировать реферальную ссылку.
Простая админ-панель с проверкой на права администратора и отображением информации о всех пользователях с базы данных.
Простая реферальная система, фиксирующая, кто пригласил пользователя и сколько пользователей было приглашено с подгрузкой этих данных в личный профиль.
Операции, такие как запись пользователей в базу данных, изменение данных о пользователях, отображение данных, реферальная система, профиль, и админ-панель, необходимы в большинстве проектов, так что берите эту статью на заметку.
Для вашего удобства я подготовил готовый проект, о котором пойдет речь, на своем 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: Файл с утилитами.После клонирования репозитория необходимо выполнить простые настройки:
Установите библиотеки при помощи команды
pip install -r requirements.txtНастройте файл .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'Я запущен 