Недавно мы столкнулись в группе комьюнити нашего сервиса с волной спама. И написали антиспам бота, который удаляет спам сообщения и помогает блокировать нарушителей.
Я решил выложить этот небольшой проект в открытый доступ, чтобы вы, даже не обладая навыками программирования, смогли защитить свою группу от спамеров. Цель, статьи, чтобы любой мог защитить свою группу, перетянув несколько файлов в интерфейсе и задав несколько элементарных настроек за три минуты..
В статье вы найдете
ссылку на файлы проекта;
инструкцию, как его запустить без навыков программирования.
Бот умеет удалять спам сообщения, отправлять их на модерацию и дообучаться в случае ошибок.
Файлы бота модератора
Перейдите по ссылке и скачайте файлы проекта к себе на компьютер. Разархивируйте ZIP-файл, нам потребуется загружать файлы в разные вкладки.
По ссылке вы найдете как файлы проекта, так и конфигурацию, необходимую для развертывания на удаленном сервере для работы 24/7
Запускаем антиспам бота для работы 24/7
Шаг 0 - регистрация бота в BotFather
Переходим в специальный, официальный бот телеграма для управления ботами - @BotFather и в нем выбираем команду /newbot. Задаем имя бота, и главное, получаем его токен. Он нам пригодиться на следующих шагах.
Выдаем боту права на модерацию в группах. Для этого в @BotFather вводим команду /newbot, выбираем созданного бота и переходим в раздел Bot Settings.
Нас интересуют Allow Groups, Groups Privacy и Channal Admin Rights настройки.
Шаг 1 - добавление бота в группы
Добавьте антиспам бота в группу, где он будет модерировать сообщения, и в закрытую группу, куда он будет пересылать результат своей работы.
Важно сразу сделать его администратором. Это изменит ID-группы, которое нам понадобится для развертывания бота.
1) Добавить бота в чат, где он будет выполнять свои основные функции по защите чата от спамеров нужно со следующими правами:
— Удаление сообщений
— Блокировка пользователей
— Анонимность (опционально), чтобы бот писал от имени группы
2) Добавить бота в чат журнала (другая группа с ботом, где вы следите за его работой). Строго говоря прав администратора в ней не требуется, но лучше сразу их выдать, чтобы ID-группы изменилось и на следующем шаге вы смогли указать корректное.
Важно: права для управления сообщениями в чате журнала не регулируются, прожимать кнопки могут все, кто видит сообщение. Поэтому необходимо сделать чат журнала закрытым, а сообщения бота не распространять.
Шаг 2 - регистрация на удаленном сервере
Проект можно запустить и у себя на компьютере, но для беспрерывной работы лучше использовать удаленный сервер. Антиспам бота можно развернуть на любом хостинге, но я воспользуюсь тем, что пишу в корпоративном блоге, и приведу инструкцию на примере облака Amvera.
Ссылка на сайт Amvera.
Шаг 3 - создадим проект с типом Приложение
Перейдем в личный кабинет Amvera и создадим проект с типом Приложение. Для данного бота лучше выбрать тариф “Начальный Плюс”. Мы своего бота развернули именно на нем. Но для первого запуска выберем “Стандартный”, когда проект запустится, мы перейдем в раздел Управление и понизим тариф на нужный нам. Это позволит исключить фактор недостатки ресурса во время сборки.
Шаг 4 - загрузка файлов и запуск бота модератора
Просто перетягиваем все файлы, которые вы скачали в разделе “Через интерфейс” во флоу создания или “Репозиторий в папку code” созданного проекта, нажимаем далее. Если вы загрузили все файлы, Конфигурация заполнится автоматически.
Нажмите завершить. Проект начнет собираться, но пока уйдет в ошибку (мы еще не закончили настройку).
После первого запуска, перейдем в проект, в раздел Репозиторий, в папку Data (это важно) и загрузим в нее файл data.txt из тех файлов, что вы скачали. Папка Data это постоянное хранилие, где мы будем хранить датасет для обучения бота, который сможем потом дополнять.
Загрузка в папку Data в разделе репозиторий доступна только после первой попытки сборки (даже c не успешной). Загрузить наш файл data.txt c обучающим датасетом надо обязательно сюда, так мы не потеряем данные для дообучения при пересборке проекта.
Шаг 6 - добавление переменных
Добавить переменные (ID групп, токен бота и т.д.). Это необходимо, чтобы бот понимал, какие группы мониторить и куда отсылать сообщения на модерацию.
Это делается в разделе “Переменные”.
Для функционирования бота необходимо добавить следующие переменные окружения:
CHAT_IDS - айди основного чата, где будут классифицироваться сообщения.
Подсказка - ID канала можно получить, используя специализированных ботов, к примеру @username_to_id_bot
В него надо отправить ваши группы и он пришлет их ID.
ID имеет следующий формат -1002284505443 (не забудьте про минус в начале, он нужен!)
JOURNAL_CHAT_ID - айди чата-журнала (Создайте закрытый чат, где вы будете модерировать сообщения), куда бот будет отправлять свои действия (там вы сможете управлять ими: блокировать автора сообщения или отмечать срабатывание как ложное).
Получить ID можно аналогично предыдущему пункту.
DATASET_PATH - абсолютный или относительный путь до файла data.txt (название лучше не менять). Указываем значение /data/data.txt
Это если вы ничего не меняли и файл загружен в корень Data (постоянного хранилища): /data/data.txt, при условии, что значение параметра persistanceMount = /data
Но можно задать и свой путь.
TOKEN - токен бота телеграм (берется у @BotFather)
CHANNEL_ID - айди основного канала, чьи сообщения не нужно удалять. Это связано с тем, что если не указать этот параметр, сообщения привязанного канала, которые дублируются в привязанный чат при создании поста в основном канале, будут удаляться как пересланные от канала или бота. Это важно учесть.
TF_ENABLE_ONEDNN_OPTS - задаем значение 0
Важно: переменные нужно записывать, не оборачивая их в кавычки!
Переменные задаются внутри проекта в разделе “Переменные”. И выглядит это примерно вот так. Разумеется, ID у вас будут свои.
Когда вы добавили все значения, перезагрузите проект кнопкой в интерфейсе, чтобы они применились.
Подождите одну минуту. При запуске статус становится "Приложение запускается или работает с ошибкой", это нормально. Если все хорошо, статус проекта изменится на “Приложение запущено”.
Готово, бот запущен и работает!
Но спамеры хитрые ребята, может понадобиться отредактировать датасет (обучающие примеры), на котором обучалась модель бота модератора, чтобы лучше отсеивать именно тот спам, который идет в вашу группу.
Датасет хранится в нашем файле data.txt и имеет следующий формат:
<тип сообщения> <сообщение>
Естественно, без <>
Т.е. первое слово обязательно должно быть типом сообщения с маленькой буквы. Их всего два - ham и spam. Ham - обычное, не спамерское сообщение. Spam - спамерское сообщение. Далее все слова, идущие после типа сообщения будут объединены в одно сообщение, имеющее тип, указанный первым словом. Рекомендуется использовать встроенные в бота возможности по добавлению строк. Cамостоятельно редактировать data.txt нужно только следуя инструкциям и формату содержания датасета.
Пример:
ham обычное не спамерское обращение
spam текст вашего спама
Важно: каждое сообщение - одна строка, то есть переносить строки нельзя! При добавлении через /add, перенос строк будет удаляться. Если строка будет начинаться со слов, отличных от ham или spam, будет ошибка.
Дообучение антиспам бота
Для этого заходим в нашу группу, где вы осуществляете модерацию и выполняете команду
/add текст сообщения который вы хотите добавить для переобучения бота
Так, за несколько итераций вы обучите бота качественно чистить спам и не удалять сообщения обычных пользователей.
Возможные ошибки
Если ваш проект в статусе “Приложение запущено”, но на команды бот пишет “Нет доступа”, вы неверно задали Переменные (ID-групп и т.д.), либо забыли их применить, перезапустив проект.
Сборка или запись “залипли” и кнопки не активны. Перейдите в раздел Конфигурация и нажмите “Применить” и “Собрать”. Если не поможет, можно пересоздать проект. Но лучше предварительно ознакомиться с логами.
Не хватает ресурса. При сборке лучше поставить тариф Стандартный и потом понизить до того, который вам нравится. Моя рекомендация для стабильной работы выбрать "Начальный Плюс”.
Протестировать что бот работает, вы можете в группе модерации, выполнив команду /add и добавив текст.
Отследить ошибки можно в Логе Сборки (для этапа сборки) и Логе Приложения, для этапа приложения.
Если что-то не получается, пишите в поддержку Amvera, вам помогут.
Итог
Наш бот удаляет спам сообщения из группы, и высылает их на дополнительную проверку вам. Вы можете отметить срабатывание как ложное, и бот переучится. Или одной кнопкой удалите спамера. А если бот пропустит спам обращение, просто добавьте его в обучающий датасет.
Надеюсь, этот код антиспам бота и инструкция помогут защитить вашу группу от спама.