Перейти к основному содержанию

Spam Blocker

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

  • @bitsocial/spam-blocker-server — HTTP-сервер, на котором работают API оценки и проверок.
  • @bitsocial/spam-blocker-challenge — лёгкий клиентский пакет: сообщества подключают его, чтобы отправлять публикации на оценку.

Исходный код: github.com/bitsocialnet/spam-blocker

Как считается оценка риска

Каждая публикация, отправленная на эндпоинт /evaluate, получает числовую оценку риска. Она складывается из нескольких сигналов с разными весами:

СигналОписание
Возраст аккаунтаЧем новее аккаунт, тем выше оценка риска.
КармаНакопленная карма в сообществе снижает риск.
Репутация автораДанные о репутации, собранные фоновым индексатором сети.
Анализ содержимогоТекстовые эвристики (плотность ссылок, известные шаблоны спама и тому подобное).
Частота публикацийБыстрые публикации подряд от одного автора повышают риск.
Данные об IPГеолокация до уровня страны и проверка по фидам угроз. Хранятся только коды стран — сами IP-адреса сообществам не передаются.

Пороги уровней

Оценка риска попадает в один из четырёх настраиваемых уровней, и от него зависит, что произойдёт дальше:

  1. Автоприём — оценка достаточно низкая, публикация проходит вообще без проверок.
  2. Достаточно OAuth — автор должен подтвердить себя через OAuth.
  3. OAuth и что-то ещё — одного OAuth мало, нужна дополнительная проверка (например, CAPTCHA).
  4. Автоотклонение — оценка слишком высокая, публикация отклоняется сразу.

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

Как проходит проверка

Когда публикация попадает в уровень, требующий подтверждения, запускается такой сценарий:

  1. Сначала автору предлагают аутентифицироваться через OAuth (GitHub, Google, Twitter и другие поддерживаемые провайдеры).
  2. Если одного OAuth недостаточно (уровень 3), показывается запасная проверка CAPTCHA на базе Cloudflare Turnstile.
  3. Личность из OAuth нужна исключительно для подтверждения — она никогда не передаётся ни сообществу, ни другим пользователям.

Эндпоинты API

POST /evaluate

Отправить публикацию на оценку риска. Возвращает вычисленную оценку и уровень проверки, который для неё требуется.

POST /challenge/verify

Отправить на верификацию результат пройденной проверки (токен OAuth, решение CAPTCHA или и то и другое).

GET /iframe/:sessionId

Возвращает встраиваемую HTML-страницу, которая отрисовывает подходящий интерфейс проверки для указанной сессии.

Ограничение частоты

Лимиты подбираются динамически, по возрасту аккаунта автора и его репутации. Для новых авторов и авторов с низкой репутацией ограничения строже, для давно известных — заметно свободнее. Так удаётся сдерживать волны спама, не мешая при этом добросовестным участникам.

Фоновый индексатор сети

На сервере работает фоновый индексатор: он непрерывно обходит сеть и накапливает данные о репутации авторов. Эти данные напрямую попадают в конвейер оценки риска, благодаря чему система узнаёт добросовестных участников в разных сообществах.

Приватность

Spam Blocker спроектирован с оглядкой на приватность:

  • Личности из OAuth используются только для прохождения проверки и никогда не раскрываются сообществам.
  • IP-адреса приводятся только к кодам стран; сами IP не хранятся и не передаются.

База данных

Для локального хранения данных о репутации, состояния сессий и конфигурации сервер использует SQLite (через better-sqlite3).