Spam Blocker
Spam Blocker — централизованный сервис обнаружения спама: он разбирает входящие публикации и присваивает им числовую оценку риска. Сервис состоит из двух пакетов:
@bitsocial/spam-blocker-server— HTTP-сервер, на котором работают API оценки и проверок.@bitsocial/spam-blocker-challenge— лёгкий клиентский пакет: сообщества подключают его, чтобы отправлять публикации на оценку.
Исходный код: github.com/bitsocialnet/spam-blocker
Как считается оценка риска
Каждая публикация, отправленная на эндпоинт /evaluate, получает числовую оценку риска. Она складывается из нескольких сигналов с разными весами:
| Сигнал | Описание |
|---|---|
| Возраст аккаунта | Чем новее аккаунт, тем выше оценка риска. |
| Карма | Накопленная карма в сообществе снижает риск. |
| Репутация автора | Данные о репутации, собранные фоновым индексатором сети. |
| Анализ содержимого | Текстовые эвристики (плотность ссылок, известные шаблоны спама и тому подобное). |
| Частота публикаций | Быстрые публикации подряд от одного автора повышают риск. |
| Данные об IP | Геолокация до уровня страны и проверка по фидам угроз. Хранятся только коды стран — сами IP-адреса сообществам не передаются. |
Пороги уровней
Оценка риска попадает в один из четырёх настраиваемых уровней, и от него зависит, что произойдёт дальше:
- Автоприём — оценка достаточно низкая, публикация проходит вообще без проверок.
- Достаточно OAuth — автор должен подтвердить себя через OAuth.
- OAuth и что-то ещё — одного OAuth мало, нужна дополнительная проверка (например, CAPTCHA).
- Автоотклонение — оценка слишком высокая, публикация отклоняется сразу.
Все пороговые значения настраиваются отдельно для каждого сообщества.
Как проходит проверка
Когда публикация попадает в уровень, требующий подтверждения, запускается такой сценарий:
- Сначала автору предлагают аутентифицироваться через OAuth (GitHub, Google, Twitter и другие поддерживаемые провайдеры).
- Если одного OAuth недостаточно (уровень 3), показывается запасная проверка CAPTCHA на базе Cloudflare Turnstile.
- Личность из OAuth нужна исключительно для подтверждения — она никогда не передаётся ни сообществу, ни другим пользователям.
Эндпоинты API
POST /evaluate
Отправить публикацию на оценку риска. Возвращает вычисленную оценку и уровень проверки, который для неё требуется.
POST /challenge/verify
Отправить на верификацию результат пройденной проверки (токен OAuth, решение CAPTCHA или и то и другое).
GET /iframe/:sessionId
Возвращает встраиваемую HTML-страницу, которая отрисовывает подходящий интерфейс проверки для указанной сессии.
Ограничение частоты
Лимиты подбираются динамически, по возрасту аккаунта автора и его репутации. Для новых авторов и авторов с низкой репутацией ограничения строже, для давно известных — заметно свободнее. Так удаётся сдерживать волны спама, не мешая при этом добросовестным участникам.
Фоновый индексатор сети
На сервере работает фоновый индексатор: он непрерывно обходит сеть и накапливает данные о репутации авторов. Эти данные напрямую попадают в конвейер оценки риска, благодаря чему система узнаёт добросовестных участников в разных сообществах.
Приватность
Spam Blocker спроектирован с оглядкой на приватность:
- Личности из OAuth используются только для прохождения проверки и никогда не раскрываются сообществам.
- IP-адреса приводятся только к кодам стран; сами IP не хранятся и не передаются.
База данных
Для локального хранения данных о репутации, состояния сессий и конфигурации сервер использует SQLite (через better-sqlite3).