Защита Telegram-чатов от спама и подозрительных сообщений

Травыч

МируМир☮️
Регистрация
01.06.2025
Сообщения
9 149
Реакции
20 444
Баллы
113

Защита Telegram-чатов от спама и подозрительных сообщений​

Защита Telegram-чатов от подозрительных сообщений
Защита Telegram-чатов от подозрительных сообщений
В Telegram-чатах и группах проблема спама и подозрительных сообщений стоит особенно остро. Боты-рассыльщики, мошенники и пользователи, пытающиеся обойти модерацию, используют различные уловки: скрытые ссылки, текст с заменёнными символами (например, "пр4ивет"), флуд повторяющимися символами и другие методы.

SuspiciousMessagesMiddleware — это middleware для Telegram-бота, который автоматически анализирует сообщения в группах и супергруппах, выявляет подозрительный контент и принимает меры: удаляет спам, уведомляет участников чата и сохраняет контекст переписки.

В этой статье разберём:

🛠 Как это работает?​

1. Проверка входящих сообщений​

message = event.message or event.edited_message if not message: return await handler(event, data) # Пропускаем служебные сообщения от Telegram if self._is_service_message(message): return await handler(event, data) if message.chat.type not in [ChatType.GROUP, ChatType.SUPERGROUP]: return await handler(event, data)
Middleware анализирует только:

def _is_service_message(self, message: Message) -> bool: """Проверяет, является ли сообщение служебным от Telegram""" # Сообщения без отправителя (системные) if not message.from_user: return True # Пользователь Telegram имеет ID 777000 (служебные уведомления) if message.from_user.id == 777000: return True # Сообщения о входе в чат, закреплении и т.д. if message.new_chat_members or message.left_chat_member or message.pinned_message: return True return False

2. Детекция подозрительного контента​

Метод _is_suspicious проверяет текст на:

  • Спецсимволы внутри слов ("пр@ивет", "tele#gram")
def _is_suspicious(self, text: str) -> bool: """Определяет подозрительные сообщения""" # Цифры среди букв в слове (например "пр4вет") if re.search(r'\b\w+\d+\w+\b', text): return True # Повторяющиеся символы (более 3 подряд) if any(len(list(g)) > 3 for _, g in groupby(text.lower())): return True # Слова с разделёнными пробелом буквами (п р и в е т) if re.search(r'(?:^|\s)([а-яa-z]\s){2,}[а-яa-z](?:$|\s)', text.lower()): return True # Предложения без пробелов (длиннее 3 символов) if len(text) > 3 and ' ' not in text: return True # Спецсимволы внутри слов if re.search(r'\b\w+[^\w\s]\w+\b', text): return True return False

3. Действия при обнаружении спама​

# Сохраняем reply_to_message reply_to_message_id = message.reply_to_message.message_id if message.reply_to_message else None try: await message.delete() logger.info(f"Deleted suspicious message in chat {message.chat.id}") except Exception as e: logger.error(f"Failed to delete suspicious message: {e}") return await handler(event, data) user_mention = message.from_user.mention_html() if message.from_user else "Аноним" await self.bot.send_message( chat_id=message.chat.id, text=f"⚠️ {user_mention} отправил подозрительное сообщение (возможен спам):\n{text}", parse_mode="HTML", reply_to_message_id=reply_to_message_id )

💡 Практическое применение​

Такой middleware полезен для:

  • Поддержания порядка в чатах без постоянного вмешательства админов.
 
Назад
Верх