Перейти до основного вмісту

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