Как создать фильтр для Telegram-бота с использованием библиотеки aiogram?

У вас есть файл "sensore.txt", и вы хотите, чтобы бот сканировал сообщения в группе. В случае обнаружения любого ключевого слова из этого файла, бот должен удалить сообщение и предупредить пользователя о наличии запрещенного слова. В данный момент у вас есть следующая функция для сканирования сообщений: 

<pre><code class="python">@router.message()
async def message_censore(msg: Message):
    user_id = msg.from_user.id 
    user_name = msg.from_user.first_name 
    with open('sensore.txt', 'r') as f:
        censored_letters = [line.strip() for line in f]
    for cen in censored_letters:
        if cen in msg.text:
            await msg.delete()
            await msg.answer("Вы используете запрещенные слова! \n\nЕсли вы считаете что это ошибка - обратитесь к Администратору группы. \nС уважением, Бот-Модератор канала")
            return</code></pre>
  • 13 сентября 2024 г. 22:03
Ответы на вопрос 1
Для создания фильтра для Telegram-бота с использованием библиотеки `aiogram`, вы уже на правильном пути с вашей функцией `message_censore`. Давайте разберем и улучшим код, чтобы убедиться, что он работает корректно и эффективно.

Вот пример доработанной функции для проверки сообщений на наличие запрещенных слов из файла `sensore.txt`:

```python
from aiogram import Router
from aiogram.types import Message
from aiogram.utils.exceptions import MessageToDeleteNotFound

router = Router()

@router.message()
async def message_censore(msg: Message):
    user_id = msg.from_user.id 
    user_name = msg.from_user.first_name 

    # Чтение запрещенных слов из файла
    with open('sensore.txt', 'r', encoding='utf-8') as f:
        censored_words = {line.strip() for line in f if line.strip()}  # Используем множество для быстрого поиска

    # Проверка на наличие запрещенных слов
    if any(cen_word in msg.text for cen_word in censored_words):
        try:
            await msg.delete()  # Удаляем сообщение
        except MessageToDeleteNotFound:
            pass  # Сообщение уже удалено, ничего не делаем

        await msg.answer(
            "Вы используете запрещенные слова! \n\n"
            "Если вы считаете, что это ошибка, - обратитесь к Администратору группы. \n"
            "С уважением, Бот-Модератор канала"
        )
```

### Объяснение изменений:

1. **Использование множества**: Вместо списка для хранения запрещенных слов лучше использовать множество (`set`), так как это позволяет производить поиск быстрее, особенно если список слов большой.

2. **Фильтрация пустых строк**: Мы добавили условие `if line.strip()` при чтении слов, чтобы избежать добавления пустых строк в множество.

3. **Обработка исключений**: Бот может попытаться удалить сообщение, которое уже было удалено, что приведет к возникновению исключения `MessageToDeleteNotFound`. Мы обрабатываем это исключение, чтобы бот не завершался с ошибкой.

4. **Кодировка при открытии файла**: Добавили параметр `encoding='utf-8'`, чтобы избежать проблем с кодировкой, особенно если в файле могут быть символы, отличные от ASCII.

Теперь ваш бот будет работать более надежно и эффективно с фильтрацией сообщений в Telegram. Не забудьте добавить обработчик маршрутизации в вашем главном файле для работы с ботом!
Похожие вопросы