Monday, July 30, 2018

GDG Цензура Bot, Антиспам (часть 5)

 

Проблема

В наш чат GDG Kaliningrad часто добавляются спамеры. Есть необходимость спам-фильтра.

Анализ и алгоритм

Обычно в группу вступает пользователь John Doe и молчит. Спустя некоторое время он постит ссылку, содержащую спам. Выглядит это так:


Дальше, кто-то добавляет его в ЧС и удаляется сообщение. Так повторяется много раз с разными пользователями.

Поэтому GDG Цензура Бот будет действовать по самому простому алгоритму: каждый вступивший в группу пользователь будет занесен в таблицу новичков. Каждый новичек должен написать 3 сообщения, не содержащих ссылок. После того, как новенький пользователь выполнил условия (они обязательно будут меняться, но пока просто 3 сообщения 1 сообщение), бот "верифицирует" пользователя и удаляет его из таблицы новеньких.

Если новенький пользователь спамит в группу, бот выполняет несколько действий:
  1. Удаляет сообщение со спамом
  2. Удаляет пользователя из группы
  3. Заносит пользователя в ЧС
  4. Формирует отчет и отправляет его в 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.

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