Проблема
В наш чат GDG Kaliningrad часто добавляются спамеры. Есть необходимость спам-фильтра.
Анализ и алгоритм
Обычно в группу вступает пользователь John Doe и молчит. Спустя некоторое время он постит ссылку, содержащую спам. Выглядит это так:
Дальше, кто-то добавляет его в ЧС и удаляется сообщение. Так повторяется много раз с разными пользователями.
Поэтому GDG Цензура Бот будет действовать по самому простому алгоритму: каждый вступивший в группу пользователь будет занесен в таблицу новичков. Каждый новичек должен написать 3 сообщения, не содержащих ссылок. После того, как новенький пользователь выполнил условия (они обязательно будут меняться, но пока просто 3 сообщения 1 сообщение), бот "верифицирует" пользователя и удаляет его из таблицы новеньких.
Если новенький пользователь спамит в группу, бот выполняет несколько действий:
- Удаляет сообщение со спамом
- Удаляет пользователя из группы
- Заносит пользователя в ЧС
- Формирует отчет и отправляет его в GDG Censor Chat
Важно отметить, что алгоритм работы бота соответствует правилам чата GDG Kaliningrad и согласован с руководителями.
Что видит спамер?
Что видит админ?
Дальше немного технических деталей, а затем выводы и открытые вопросы.
Техническая реализация
Установка и подключение к redis
Установить brew,Затем установите redis.
Использовать инструкцию по установке:
http://jasdeep.ca/2012/05/installing-redis-on-mac-os-x/
Выполнить в консоли тестовую команду:
$ redis-cli -v
redis-cli 4.0.10
Если отобразилась версия - установка прошла успешно.
Создать базу данных, и получить к ней точку входа Endpoint, который состоит из url и номера порта.
Запустить redis cli:
$ redis-cli
connect {url} {port}
Затем выполнить тестовую команду:
redis-url.com: 12345 > ping
PONG
PONG означает что подключение прошло успешно 🙂
Работа с hash в redis
Тут будет описание команд согласно тому как будет реализована фича антиспам.Добавляем новенького
Когда пользователь вступает в чат, бот добавляет новенького в хеш:
> hmset gdguser:{id} username {user name} messagecount 0
Это нужно для того чтобы можно было начать подсчет написанных сообщений.
Удаляем новенького
Тут есть три случая когда надо удалить новенького:
- новенький покинул группу;
- новенький прислал спам;
- новенький прошел верификацию.
Команда удаляет все данные о пользователе:
> hdel gdguser:{id} username messagecount
Теперь необходимо получить данные.
Получение информации
Чтобы определить, является ли пользователь новичком, выполняем запрос:
> hgetall gdguser:{id}
Пример ответа:
> hgetall gdguser:1
1) "name"
2) "Vlad"
3) "messagecount"
4) "0"
Еще пример ответа:
> hgetall gdguser:2
(empty list or set)
Если пользователь присутствует в таблице, он является новичком. Следовательно, необходимо проверить, сколько сообщений он уже отправил. Эта информация уже содержится в ответе.
Инкремент счетчика сообщений
Когда новенький отправил сообщение, необходимо увеличить счетчик на 1. Это можно сделать командой:
> hincrby gdguser:1 messagecount 1
(integer) 6
Проверка:
> hget gdguser:1 messagecount
"6"
Использование методов API
Используем API npm redis для реализации наших операций.
На js это выглядит так.
Добавляем новенького:
> redisClient.hmset(hashname, "username", name, "messagecount", 0, (e, r) => {console.log(e, r)});
Удаляем новенького:
> redisClient.hdel(hashname, "username", "messagecount", 0, (e, r) => {console.log(e, r)});Получаем все данные:
> redisClient.hgetall(hashname, (e, r) => {console.log(e, r)});
Инкремент счетчика сообщений:
> redisClient.hincrby("gdguser:1", "messagecount", 1, (e, r) => {console.log(e, r)});
Полезные ссылки
Быстрый старт: https://redis.io/topics/quickstartРабота схешем: https://redis.io/commands#hash
A node.js redis client: https://www.npmjs.com/package/redis
Итого
Антиспам реализован, внедрен и приносит первые плоды. В виде заблокированных спамеров.
Присоединяйтесь (тыц) и смотрите, как бот выполняет свою работу. 😎
Ссылочка: https://t.me/gdgcensorchat
Увы, эта ситуация должна быть исправлена на уровне мессенджера Telegram.
В будущем, фича антиспам будет развиваться и усложняться по мере того, как будут появляться новые виды спама.
Присоединяйтесь (тыц) и смотрите, как бот выполняет свою работу. 😎
Ссылочка: https://t.me/gdgcensorchat
Проблемы
Вот пример спама, который бот никак не фильтрует:Увы, эта ситуация должна быть исправлена на уровне мессенджера Telegram.
В будущем, фича антиспам будет развиваться и усложняться по мере того, как будут появляться новые виды спама.