AI-виявлення спаму в мобільних додатках
Спам у мобільних додатках — це не лише коментарі "купи крипту". Це масові реєстрації ботів, накрутка лайків через емулятор, дублювання оголошень з різних аккаунтів, флуд у чатах. Кожний з цих сценаріїв потребує окремого підходу — єдиної кнопки "включити антиспам" не існує.
Типові помилки при наївній реалізації
Найпоширеніший антипаттерн — фільтрація по блеклисту слів на клієнті. По-перше, список легко обійти: "купи" → "к-у-п-и", "кup и", Unicode-гомоглифи. По-друге, логіка на клієнті видна через декомпіляцію. По-третє, це взагалі не ML — це regex.
Другий антипаттерн — відправляти кожне повідомлення на сервер для синхронної класифікації. При 50 повідомленнях на секунду в активному чаті це або деградує UX (затримка відправки), або руйнує бекенд.
Як це працює на практиці
Поведінкові сигнали + текстова класифікація
Ефективне виявлення спаму будується на двох рівнях. Перший — поведінкові паттерни: частота дій, інтервали між подіями, device fingerprint, IP/ASN аномалії. Ці сигнали збираються на клієнті та відправляються батчами.
Другий рівень — NLP-класифікація тексту. Для мобільних додатків добре працюють дистильовані версії BERT: distilbert-base-multilingual-cased в ONNX (~265 MB) на сервері або MobileBERT (~95 MB) у TFLite для on-device інференцу. Серверний варіант краще: модель оновлюється без релізу додатка.
// iOS: відправка повідомлення з поведінковими метаданими
struct MessagePayload: Encodable {
let text: String
let userId: String
let sessionDuration: TimeInterval
let messageIndexInSession: Int
let typingDurationMs: Int // <300ms — підозріло
let pasteDetected: Bool
}
func sendMessage(_ text: String) {
let payload = MessagePayload(
text: text,
userId: currentUser.id,
sessionDuration: sessionTimer.elapsed,
messageIndexInSession: messageCount,
typingDurationMs: typingTracker.duration,
pasteDetected: typingTracker.wasPasted
)
api.postMessage(payload) { result in
switch result {
case .success(let msg): self.appendMessage(msg)
case .failure(let error) where error == .spamDetected:
self.showSpamWarning()
}
}
}
Швидкість набору typingDurationMs < 300 для довжини повідомлення > 50 символів — майже напевно paste-спам або бот. Цей сигнал працює навіть без ML.
On-Device передфільтр для зменшення навантаження
Для текстових полів у форумах та маркетплейсах встановіть легкий on-device фільтр на базі TFLite Text Classification моделі (~1,5 MB). Вона відсікає 70–80% очевидного спаму без мережевого запиту:
// Android: TFLite інференц перед відправкою
class SpamPrefilter(context: Context) {
private val interpreter: Interpreter
private val tokenizer: BertTokenizer
init {
val model = FileUtil.loadMappedFile(context, "spam_lite.tflite")
interpreter = Interpreter(model)
tokenizer = BertTokenizer.createFromAsset(context, "vocab.txt")
}
fun isLikelySpam(text: String): Boolean {
val inputIds = tokenizer.tokenize(text).toIntArray()
val output = Array(1) { FloatArray(2) }
interpreter.run(arrayOf(inputIds), output)
return output[0][1] > 0.85f // поріг confidence спаму
}
}
Пограничні випадки (confidence 0,6–0,85) відправляють на серверну модель. Очевидний спам блокується негайно. Це скорочує кількість API-запитів приблизно втричі.
Захист від ботів при реєстрації
Для флоу створення аккаунту інтегруйте Google Play Integrity API (Android) та DeviceCheck (iOS). Обидва дають токен, верифікуємий на сервері — він підтверджує, що запит пришв з реального пристрою, а не з емулятора або Appium-скрипту. Це не панацея, але піднімає вартість спам-реєстрації для атакуючого.
Процес
Аудит типів спаму в додатку: текстовий флуд, фіктивні аккаунти, накрутка, дублі контенту.
Проектування сигналів: поведінкові метаданні, які клієнт повинен збирати та передавати.
Розробка on-device передфільтра та серверної класифікації.
Налаштування порогових значень: автоматична блокування vs очередь human review.
Моніторинг false positive rate через Grafana/Datadog — перший тиждень у "тіньовому" режимі (логуємо, не блокуємо).
Ориентири за часовими рамками
Базова серверна класифікація з поведінковими сигналами — 5–7 днів. On-device передфільтр на TFLite + Play Integrity / DeviceCheck — ще 3–4 дні. Повна система з дашбордом модерації та feedback loop для переобучення моделі — 3–5 тижнів.







