Aiogram | Блокировка Пользователей Через Middleware
Приветствую всех форумчан!
В данном гайде я покажу как использовать Middleware в Aiogram 2
Сегодня вы научитесь делать блокировку пользователя через админку
Архитектура проекта
Специально для вас я подготовил начальную структуру проекта
с уже созданной схемой таблицы через SQLAlchemy и командой /start:
https://vipadmin.net/bot-redirect?https://endway.org/attachments/1506/?hash=dabfe785dba85fb5a282d5925c5b017b
Вот как она выглядит:
https://vipadmin.net/bot-redirect?https://endway.org/attachments/1673593337084-png.1507/
Разберем созданный мною класс
Users в db_api/tables/users_table.py from sqlalchemy import Column, Integer, BigInteger, Boolean
from db_api.database import Base
class Users(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
user_id = Column(BigInteger, unique=True)
is_blocked = Column(Boolean, default=False)id - обычная нумерация записи в бдuser_id - id пользователя Telegram, по нему мы будем определять заблокирован ли юзер или нетis_blocked - boolean значение (True, False) при регистрации по умолчанию пользователь не заблокированТеперь создайте папку
middlewares, в которойвам следует создать файл
ban_middleware.pyРассмотрим следующий код:
1. Импорты
from aiogram import Dispatcher
from aiogram.dispatcher.handler import CancelHandler # отменяет вызов хэндлера
from aiogram.dispatcher.middlewares import BaseMiddleware # класс Middleware от Aiogram
from aiogram.types import Message, CallbackQuery, InlineQuery
from db_api.commands.users_commands import select_user # берем пользователя из бд 2. Сам Middlewareclass UserBannedMiddleware(BaseMiddleware):
async def on_process_message(self, message: Message, dаta: dict):
user = await select_user(message.from_user.id)
if user and user.is_blocked:
await message.answer(
'<b>? Ваш аккаунт заблокирован!</b>'
)
raise CancelHandler
async def on_process_callback_query(self, call: CallbackQuery, dаta: dict):
user = await select_user(call.from_user.id)
if user and user.is_blocked:
await call.answer(
'? Ваш аккаунт заблокирован!',
show_alert=True
)
raise CancelHandler
async def on_process_inline_query(self, query: InlineQuery, dаta: dict):
user = await select_user(query.from_user.id)
if user and user.is_blocked:
raise CancelHandler
# вместо **** написано dаtа на латыне, хз че он скрываетИтак. Мы назвали класс
UserBannedMiddlewareПредставим, что пользователь уже написал сообщение боту.
И перед тем, как его обработать (у нас это хэндлер команды /start),
мы будем проверять забанен юзер или нет, чекните функцию
on_process_messageПроще говоря, сперва мы берем юзера из бд. Если он есть и он забанен, то отменяем хэндлер
То же самые делается и в функциях
on_process_callback_query и on_process_inline_query 3. Устанавливаем Middleware
def setup_ban_middleware(dp: Dispatcher):
dp.middleware.setup(UserBannedMiddleware()) Эту функцию мы должны импортировать в app.py.from middlewares.ban_middleware import setup_ban_middlewareТам же создайте ф-цию
setup_middlewares,в которую вам необходимо поместить setup_ban_middleware, с параметром dp (Dispatcher)
def setup_middlewares(dp: Dispatcher):
setup_ban_middleware(dp) А также вот, как должна выглядить ф-ция on_startupasync def on_startup(dp: Dispatcher):
setup_middlewares(dp)
register_handlers(dp)
await create_base()Теперь давайте создадим ф-цию блокировки юзера через админку
1. Блокировка юзера в БД
Создайте ф-цию update_user_ban_status в
db_api/commands/users_commands.py 1. Блокировка юзера в БД
async def update_user_ban_status(user_id: int, ban_status: bool):
async with get_session() as session:
sql = update(Users).where(
Users.user_id == user_id
).values(is_blocked=ban_status)
await session.execute(sql)
await session.commit() 2. Хэндлер блокировки (для админов)from aiogram.types import Message
from data.config import ADMINS_ID # тут dаtа на латыне
from db_api.commands.users_commands import update_user_ban_status, select_user
from db_api.tables.users_table import Users
[/CENTER]
async def ban_user_command(message: Message):
args = message.get_args()
if not args:
return await message.reply(
'<b>⚠️ Отсутствуют аргументы к команде!</b>'
)
try:
user: Users = await select_user(int(args))
if not user:
return await message.answer(
'<b>⚠️ Такого пользователя не существует!</b>'
)
if user.user_id in ADMINS_ID:
return await message.answer(
'<b>⚠️ Нельзя заблокировать администратора!</b>'
)
need_ban = message.text.startswith('/ban')
if need_ban and user.is_blocked:
return await message.reply(
'<b>⚠️ Пользователь итак заблокирован!</b>'
)
elif not need_ban and not user.is_blocked:
return await message.reply(
'<b>❌ Пользователь итак разблокирован!</b>'
)
await update_user_ban_status(user.user_id, True if not user.is_blocked else False)
await message.bot.send_message(
user.user_id,
'<b>? Ваш аккаунт заблокирован!</b>' if not user.is_blocked
else '<b>✅ Ваш аккаунт разблокирован!</b>'
)
await message.reply(
f'<b>? @{message.from_user.username} заблокирован!</b>'
if not user.is_blocked
else f'<b>✅ @{message.from_user.username} разблокирован!</b>'
)
except ValueError:
await message.reply(
'<b>⚠️ Значение должно быть числом!</b>'
)
[CENTER] def register_ban_command(dp: Dispatcher):
dp.register_message_handler(
ban_user_command,
Text(startswith=['/ban', '/unban']),
user_id=ADMINS_ID,
state='*'
) Его мы импортируем в app.pyfrom middlewares.ban_middleware import setup_ban_middlewareи добавляем в ф-цию
register_handlersdef register_handlers(dp: Dispatcher):
resister_command_start(dp)
register_ban_command(dp)Заключение
Не забудьте указать токен от бота в
.env,а также свой user_id Telegram в
dаtа/config.py в переменнной ADMINS_IDА также установите все модули, которые указаны в
requirements.txt? На этом все! Всем спасибо за внимание!
? Буду рад, если оцените статью
https://vipadmin.net/bot-redirect?https://endway.org/attachments/1604/?hash=e8924fa134e7ee7463ad24aa33b9036b
345
Рейтинг:
Aiogram | Блокировка Пользователей Через Middleware
Похожие публикации
Партнёрские программы
Смотреть все1WIN ПАРТНЕРКА
1 404
Партнерские программы / Гемблинг партнерки
BroPush - партнёрская программа для монетизации и заработке на сайтах
1 310
Партнерские программы / PUSH партнерки
Партнерская программа Семяныча - Лучшая партнерка по CPA и CPC моделям
931
Партнерские программы / Способы заработка
Обзор Partners House для монетизации сайтов и лендингов + отзывы вебмастеров
795
Арбитраж трафика / Партнерские программы / PUSH партнерки
Магазин
Смотреть всеКупить
Бот для продажи VPN 3X-UI для Telegram
Telegram-бот для продажи VPN! Автоматизированный бот для продажи вашего...
Купить
Мониторинг хайп проектов на движке DLE
В данном скрипте есть возможность включить функцию чтобы пользователи сами...
Купить
Скрипт казино с 5 классическими играми.
Разработчики онлайн-казино, хотим поделиться отличной новостью: в январе мы...
Купить
Customer WishList / Избранные товары покупателей
Данный модуль позволяет просматривать избранные товары пользователей. Есть...
Купить
Меняем заголовок и favicon
Меняет favicon и title, при переходе пользователя на другую вкладку в браузере....






