Недавно мы столкнулись в группе комьюнити нашего сервиса с волной спама. И написали антиспам бота, который удаляет спам сообщения и помогает блокировать нарушителей.
Я решил выложить этот небольшой проект в открытый доступ, чтобы вы, даже не обладая навыками программирования, смогли защитить свою группу от спамеров. Цель, статьи, чтобы любой мог защитить свою группу, перетянув несколько файлов в интерфейсе и задав несколько элементарных настроек за три минуты..
В статье вы найдете
ссылку на файлы проекта;
инструкцию, как его запустить без навыков программирования.
Бот умеет удалять спам сообщения, отправлять их на модерацию и дообучаться в случае ошибок.
Файлы бота модератора
Перейдите по ссылке и скачайте файлы проекта к себе на компьютер. Разархивируйте ZIP-файл, нам потребуется загружать файлы в разные вкладки.
По ссылке вы найдете как файлы проекта, так и конфигурацию, необходимую для развертывания на удаленном сервере для работы 24/7
Запускаем антиспам бота для работы 24/7
Шаг 0 - регистрация бота в BotFather
Переходим в специальный, официальный бот телеграма для управления ботами - @BotFather и в нем выбираем команду /newbot. Задаем имя бота, и главное, получаем его токен. Он нам пригодиться на следующих шагах.
Выдаем боту права на модерацию в группах. Для этого в @BotFather вводим команду /mybot, выбираем созданного бота и переходим в раздел Bot Settings.

Нас интересуют Allow Groups, Groups Privacy и Channel Admin Rights настройки.




Шаг 1 - добавление бота в группы
Добавьте антиспам бота в группу, где он будет модерировать сообщения, и в закрытую группу, куда он будет пересылать результат своей работы.
Важно сразу сделать его администратором. Это изменит ID-группы, которое нам понадобится для развертывания бота.
1) Добавить бота в чат, где он будет выполнять свои основные функции по защите чата от спамеров нужно со следующими правами:
Удаление сообщений
Блокировка пользователей
Анонимность (опционально), чтобы бот писал от имени группы
2) Добавить бота в чат журнала (другая группа с ботом, где вы следите за его работой). Строго говоря прав администратора в ней не требуется, но лучше сразу их выдать, чтобы ID-группы изменилось и на следующем шаге вы смогли указать корректное.
Важно: права для управления сообщениями в чате журнала не регулируются, прожимать кнопки могут все, кто видит сообщение. Поэтому необходимо сделать чат журнала закрытым, а сообщения бота не распространять.
Шаг 2 - регистрация на удаленном сервере Amvera
Проект можно запустить и у себя на компьютере, но для беспрерывной работы лучше использовать удаленный сервер. Антиспам бота можно развернуть на любом хостинге, но я воспользуюсь тем, что пишу в корпоративном блоге, и приведу инструкцию на примере облака Amvera.
Это даст нам
Возможность развернуть проект, просто перетянув файлы в интерфейсе;
Если вы владеете Git, обновлять проект можно тремя командами в IDE;
Бэкапы наших данных (в данном случае обучающей выборки).
Ссылка на сайт 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, вам помогут.
Итог
Наш бот удаляет спам сообщения из группы, и высылает их на дополнительную проверку вам. Вы можете отметить срабатывание как ложное, и бот переучится. Или одной кнопкой удалите спамера. А если бот пропустит спам обращение, просто добавьте его в обучающий датасет.
Надеюсь, этот код антиспам бота и инструкция помогут защитить вашу группу от спама.
positroid
Если предоставляете сообществу, почему бы не оформить открытый репозиторий?
Также не хватило деталей по непосредственно реализации и работе, термин "обучение" относится обычно к machine learning, подозреваю что в реализации нет подобных алгоритмов, можно чуть больше подробностей?
kirillkosolapov Автор
Я старался написать статью так, чтобы ей могли воспользоваться люди не владеющие разработкой. А для них ссылка на папку с файлами понятнее, чем на репозиторий GitHub. По второму вопросу - как раз там есть ML-модель, которая переобучается при запуске и добавлении новых фраз.
По деталям реализации со ссылкой именно на GitHub, думаю, напишем отдельную статью, где распишем какая там модель, как "смайлики" из которых спам делают удаляет и т.д.
gfiopl8
Для таких людей есть готовые боты, гораздо более проработанные и давно зарекомендовавшие себя, их не надо нигде поднимать, достаточно просто пригласить в группу.
GREQUE273
Ну они либо не бесплатны, либо бесплатны до определенного количества подписчиков, либо без платного плана - используют чат как доску для рекламы
gfiopl8
Ну да, можно сэкономить пару долларов при условии что у тебя дохрена юзеров и есть уже оплаченный для чего то другого хостинг. Правда получится такой себе заменитель но главное ведь процесс.