15 июля 2024

🤖🔞 Пишем Telegram-бота для фильтрации нецензурной лексики в чате

🔥 Алексей. Занимаюсь frontend-разработкой и пишу SQL скрипты в одной it компании. Веду личный блог о моем опыте в IT и около IT на YouTube - https://www.youtube.com/@tehno.maniak
Представляю бесплатного Telegram-бота для фильтрации мата в чате Telegram. Telegram-бот разработан на JavaScript с использованием фреймворка grammY. В основе работы бота лежит база данных нецензурных выражений, состоящая из 5668 слов. Полный код проекта можно посмотреть в моем Github-репозитории.
🤖🔞 Пишем Telegram-бота для фильтрации нецензурной лексики в чате

Суть работы Telegram-бота очень проста: бот сверяет все поступающие сообщения от пользователей в чате с базой нецензурных выражений и в случае обнаружения совпадений удаляет сообщение пользователя и направляет уведомление пользователю об удалении.

Структура проекта

Структура фильтра нецензурных выражений
        anti-spam-telegram-bot/
├── .env
├── index.js
├── package.json
├── package-lock.json
├── README.md
└── banword.txt
    
  1. index.js: Основной файл проекта, содержащий весь код логики бота.
  2. banword.txt: Файл с базой нецензурных выражений.

Пример файла .env:

Пример файла .env
        TELEGRAM_BOT_TOKEN=your-telegram-bot-api-key
    
👨‍💻🎨 Библиотека фронтендера
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека фронтендера»

Создание Telegram-бота

Создадим экземпляр бота и инициализируем его с API-ключом Telegram:

index.js
        const bot = new Bot(process.env.TELEGRAM_BOT_TOKEN);
    

Далее нам необходимо:

  1. Считать содержимое файла banword.txt с использованием функции readFileSync из модуля fs (файловая система) в кодировке 'utf-8'.
  2. Разделить прочитанное содержимое на строки по символу новой строки (`\n`), создав массив строк.
  3. Преобразовать каждую строку в массиве: удалить начальные и конечные пробелы с помощью функции trim() и преобразовать все символы строки в нижний регистр с помощью функции toLowerCase().
  4. Отфильтровать массив, удаляя пустые строки (длиной 0).
index.js
        const forbiddenWords = fs.readFileSync('./banword.txt', 'utf-8')
  .split('\n')
  .map(word => word.trim().toLowerCase())
  .filter(word => word.length > 0);
    

Далее напишем обработчик событий для входящих текстовых сообщений:

index.js
        bot.on('message:text', async (ctx) => {
  const messageText = ctx.message.text.toLowerCase();

  const containsForbiddenWord = forbiddenWords.some((word) => messageText.includes(word));

  if (containsForbiddenWord) {
    try {
      await ctx.api.deleteMessage(ctx.chat.id, ctx.message.message_id);

      const warningMessage = 'В чате запрещен мат!';
      await ctx.reply(warningMessage);
    } catch (error) {
      console.error('Ошибка при удалении сообщения или отправке предупреждения:', error);
    }
  }
});
    

Данный код блокирует сообщения, содержащие запрещённые слова, и предупреждает пользователя о нарушении правил чата.

Запуск Telegram-бота

Чтобы данный Telegram бот работал, необходимо добавить его в чат, который мы хотим администрировать и наделить бота правами администратора на просмотр чата и удаление сообщений. О том, как разместить Telegram-бота на своем сервере, используя менеджер процессов pm2, я рассказал в своем видео на YouTube.

Заключение

В этой статье я рассмотрел основные составляющие моего Telegram-бота, необходимые для его работы. Полный код проекта можно посмотреть в моем GitHub репозитории. У себя на YouTube я сделал подробный обзор на своего Telegram бота и его функциональности. В планах доработать бота, чтобы он мог выдавать предупреждения пользователям и вести статистику запрещенных слов.

***

Статьи по теме

Комментарии

 
25 июля 2024

И снова здравствуйте) В текущих реалиях данная реализация спасет только в крайне ограниченном количестве случаев. Как минимум стоит предусмотреть следующие моменты:

  1. Поскольку сейчас идет поиск точного вхождения, то добавление любого символа препинания в состав слова автоматически сделает его разрешенным. Перечислить все возможные комбинации в списке запрещенных слов нереально. Итого, перед поиском вхождения стоит убрать все знаки препинания из исходного текста и проверять вхождение уже в "чистом" тексте.
  2. Но п.1 не спасет от использования всех возможностей unicode и замены букв на их аналоги из других языков или на похожие символы. Например, букву О заменить на цифру 0. То есть опять же перед проверкой вхождения стоит производить обратную замену.
  3. Но и это еще не все. Из-за неграмотности или специально при написании сообщения могут просто заменить одну букву на другу. Например, "а" на "о". То есть проверка точного вхождения уже работать не будет и надо использовать иной подход.

В общем, бороться надо не с помощью огромного словаря, а с помощью продуманных подходов к поиску запрещенных слов.

Итого: хорошее начинание, но до полноценного решения еще далеко) PS nodemon все же стоит перенести в dev-зависимости, зачем он на проде?

25 июля 2024

Спасибо за ваши советы!

Как оказалось, не так давно в Steam были найдены файлы для фильтрации мата в чатах. Они расположены в папке resource, наименование документов начинается с filter_profanity. На русском языке в базе находится порядка 2000 слов.

Таким образом, обьеденив базы, в распоряжении моего Telegram бота оказалось порядка 7500 русских слов)

 

Теперь ваш Telegram-бот эксперт по русскому мату :)

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

LIVE >

Подпишись

на push-уведомления