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).