Первый коммит
This commit is contained in:
111
bot/filters/spam.py
Normal file
111
bot/filters/spam.py
Normal file
@@ -0,0 +1,111 @@
|
||||
"""
|
||||
Фильтры для проверки сообщений на спам и банворды
|
||||
"""
|
||||
from typing import Optional, Callable
|
||||
|
||||
from aiogram.filters import BaseFilter
|
||||
from aiogram.types import Message
|
||||
|
||||
from middleware.loggers import logger
|
||||
|
||||
__all__ = ('HasSpam', 'IsWhitelisted')
|
||||
|
||||
|
||||
class HasSpam(BaseFilter):
|
||||
"""
|
||||
Проверяет, содержит ли сообщение запрещенные слова (спам).
|
||||
|
||||
Attributes:
|
||||
check_spam_func: Функция проверки спама (передается при инициализации)
|
||||
|
||||
Example:
|
||||
```python
|
||||
from utils.spam_checker import check_spam
|
||||
|
||||
@router.message(HasSpam(check_spam))
|
||||
async def spam_detected(message: Message):
|
||||
await message.delete()
|
||||
await message.answer("⚠️ Сообщение содержит запрещенные слова")
|
||||
```
|
||||
"""
|
||||
|
||||
def __init__(self, check_spam_func: Callable[[str], bool]):
|
||||
"""
|
||||
Args:
|
||||
check_spam_func: Функция для проверки спама
|
||||
"""
|
||||
self.check_spam = check_spam_func
|
||||
|
||||
async def __call__(self, message: Message) -> Optional[dict]:
|
||||
"""
|
||||
Проверка сообщения на спам.
|
||||
|
||||
Returns:
|
||||
dict или None: Информация о найденном спаме или None
|
||||
"""
|
||||
if not message.text:
|
||||
return None
|
||||
|
||||
text_lower = message.text.lower()
|
||||
has_spam = self.check_spam(text_lower)
|
||||
|
||||
if has_spam:
|
||||
logger.warning(
|
||||
f"Обнаружен спам в сообщении",
|
||||
log_type='SPAM',
|
||||
message=message
|
||||
)
|
||||
return {'has_spam': True, 'text': text_lower}
|
||||
|
||||
return None
|
||||
|
||||
|
||||
class IsWhitelisted(BaseFilter):
|
||||
"""
|
||||
Проверяет, содержит ли сообщение слова из белого списка (исключения).
|
||||
|
||||
Используется для защиты от ложных срабатываний спам-фильтра.
|
||||
|
||||
Attributes:
|
||||
check_whitelist_func: Функция проверки белого списка
|
||||
|
||||
Example:
|
||||
```python
|
||||
from utils.spam_checker import check_whitelist
|
||||
|
||||
@router.message(IsWhitelisted(check_whitelist))
|
||||
async def whitelisted_message(message: Message):
|
||||
# Сообщение содержит исключение, пропускаем проверку спама
|
||||
pass
|
||||
```
|
||||
"""
|
||||
|
||||
def __init__(self, check_whitelist_func: Callable[[str], bool]):
|
||||
"""
|
||||
Args:
|
||||
check_whitelist_func: Функция для проверки белого списка
|
||||
"""
|
||||
self.check_whitelist = check_whitelist_func
|
||||
|
||||
async def __call__(self, message: Message) -> Optional[bool]:
|
||||
"""
|
||||
Проверка на наличие в белом списке.
|
||||
|
||||
Returns:
|
||||
bool или None: True если в белом списке, None если нет
|
||||
"""
|
||||
if not message.text:
|
||||
return None
|
||||
|
||||
text_lower = message.text.lower()
|
||||
is_whitelisted = self.check_whitelist(text_lower)
|
||||
|
||||
if is_whitelisted:
|
||||
logger.debug(
|
||||
f"Сообщение содержит исключение из белого списка",
|
||||
log_type='WHITELIST',
|
||||
message=message
|
||||
)
|
||||
return True
|
||||
|
||||
return None
|
||||
Reference in New Issue
Block a user