Deteksi Spam
Deteksi spam Discuse mengklasifikasikan teks sebagai spam atau bukan, disertai skor keyakinan. Kirim teks ke POST https://api.discuse.com/api/v2/check dengan check_spam diaktifkan, lalu baca hasilnya dari results.spamfinder. Fitur ini menangkap spam promosi, penipuan, dan gangguan buatan bot yang sering terlewat oleh filter kata kunci sederhana.
Apa saja yang dideteksi oleh deteksi spam?
Model ini dilatih pada pola bervolume tinggi yang mampu lolos dari daftar blokir:
- Spam promosi dan iklan tanpa izin
- Pesan penipuan dan phishing
- Konten buatan bot serta konten salin-tempel
Fitur ini mengembalikan satu label (seperti spam atau ham) beserta skor confidence, sehingga Anda bisa menentukan seberapa ketat aturan yang ingin diterapkan.
Bagaimana cara menjalankan pemeriksaan spam?
curl -X POST https://api.discuse.com/api/v2/check \
-H "Content-Type: application/json" \
-H "X-API-Key: YOUR_API_KEY" \
-d '{
"content": {
"text": "CONGRATULATIONS! You won $10,000! Click here to claim: bit.ly/fake"
},
"settings": {
"check_spam": true
}
}'
Format respons
{
"has_violations": true,
"cached": false,
"message": "Spam content detected",
"results": {
"hits": true,
"spamfinder": {
"text": "CONGRATULATIONS! You won $10,000! Click here to claim: bit.ly/fake",
"label": "spam",
"confidence": 0.97,
"is_spam": true,
"hit": true
}
},
"usage": {
"api_requests_used": 8,
"api_requests_limit": 5000,
"api_requests_remaining": 4992
}
}
Field apa saja yang dikembalikan oleh hasil spam?
| Field | Type | Meaning |
|---|---|---|
text |
string | Teks yang diklasifikasikan |
label |
string | Klasifikasi model (mis. spam, ham) |
confidence |
number | Tingkat keyakinan model terhadap label (0.0–1.0) |
is_spam |
bool | Keputusan mentah model — label == spam, tanpa memperhitungkan ambang batas |
hit |
bool | Keputusan yang memperhitungkan ambang batas — is_spam DAN confidence ≥ ambang batas spam proyek Anda |
is_spam vs hit
is_spam adalah keputusan mentah: model memberi label spam pada teks, terlepas dari seberapa yakin model tersebut. hit juga mensyaratkan confidence melewati ambang batas spam yang dikonfigurasi untuk proyek Anda. Gunakan hit sebagai dasar tindakan moderasi, bukan is_spam, agar label spam dengan confidence rendah tidak menghukum pesan yang masih berada di area abu-abu.
Bagaimana cara menafsirkan skor confidence?
confidence menunjukkan seberapa yakin model terhadap label yang diberikan:
- 0.0 – 0.3: sangat rendah — kemungkinan besar sah.
- 0.3 – 0.5: rendah — berada di batas abu-abu.
- 0.5 – 0.7: sedang — mencurigakan.
- 0.7 – 0.9: tinggi — sangat mungkin spam.
- 0.9 – 1.0: sangat tinggi — hampir pasti spam.
Ambang batas yang direkomendasikan
Tetapkan ambang batas spam proyek Anda sesuai tingkat toleransi platform:
const SPAM_THRESHOLDS = {
strict: 0.5, // professional platforms, financial services
standard: 0.7, // social media, forums
permissive: 0.85 // creative platforms, open communities
};
Kasus penggunaan
Kolom komentar
async function moderateComment(comment) {
const result = await checkSpam(comment.text);
const spam = result.results.spamfinder;
if (spam.hit) {
if (spam.confidence > 0.9) {
return { action: 'reject', reason: 'spam_detected' };
}
return { action: 'review', reason: 'possible_spam' };
}
return { action: 'approve' };
}
Pendaftaran pengguna
def validate_registration(user_data):
bio = user_data.get('bio')
if bio:
result = check_spam(bio)
if result['results']['spamfinder']['hit']:
return {'approved': False, 'reason': 'Spam content detected in profile'}
return {'approved': True}
Platform perpesanan
async function filterMessage(message, sender) {
const result = await checkSpam(message.text);
const spam = result.results.spamfinder;
if (spam.hit) {
await incrementSpamCount(sender.id);
const spamCount = await getSpamCount(sender.id);
if (spamCount > 3) {
await banUser(sender.id, 'repeated_spam');
}
return { delivered: false, reason: 'Message filtered as spam' };
}
return { delivered: true };
}
Menggabungkan dengan pemeriksaan lain
Jalankan pemeriksaan spam bersama sentimen dan bahasa dalam satu permintaan:
{
"content": {
"text": "Check out this amazing deal! Click here: example.com/offer"
},
"settings": {
"check_spam": true,
"check_sentiment": true,
"check_language": true
}
}
Responsnya kemudian memuat results.spamfinder, results.sentiment, dan results.language secara bersamaan.
Praktik terbaik
Gunakan respons bertingkat
Alih-alih hanya memblokir/mengizinkan secara biner, buat cabang berdasarkan confidence:
function handleSpamResult(spam) {
if (!spam.hit) return 'allow';
if (spam.confidence > 0.95) return 'silent_delete';
if (spam.confidence > 0.8) return 'block_notify';
if (spam.confidence > 0.6) return 'flag_for_review';
return 'apply_friction';
}
Lacak pelanggar berulang
async function assessUser(userId, spam) {
if (spam.hit) {
await incrementUserSpamScore(userId, spam.confidence);
}
const userScore = await getUserSpamScore(userId);
if (userScore > 10.0) await autoSuspendUser(userId);
else if (userScore > 5.0) await flagForManualReview(userId);
}
Masukkan pengguna tepercaya ke whitelist
Lewati pemeriksaan spam untuk akun terverifikasi atau akun dengan tingkat kepercayaan tinggi guna mengurangi positif palsu dan menghemat kuota:
function shouldCheckSpam(user) {
if (user.isVerified) return false;
if (user.trustScore > 0.9) return false;
return true;
}
Batas penggunaan
Deteksi spam menggunakan kuota analisis sentimen Anda:
| Plan | Monthly Analyses | Notes |
|---|---|---|
| Basic | 1,000 | Mencakup spam + sentimen |
| Gold | 5,000 | Mencakup spam + sentimen |
| Platinum | 15,000 | Mencakup spam + sentimen |
| Ultimate | 30,000 | Mencakup spam + sentimen |
Respons yang di-cache tidak dihitung terhadap kuota Anda.
Contoh integrasi
Middleware Express.js
const spamFilter = async (req, res, next) => {
if (req.body.text) {
const result = await checkSpam(req.body.text);
if (result.results.spamfinder.hit) {
return res.status(400).json({
error: 'spam_detected',
message: 'Your message was flagged as spam'
});
}
}
next();
};
app.post('/api/comments', spamFilter, createComment);
Python Flask
from functools import wraps
from flask import request, jsonify
def spam_filter(f):
@wraps(f)
def decorated(*args, **kwargs):
text = request.json.get('text')
if text:
result = check_spam(text)
if result['results']['spamfinder']['hit']:
return jsonify({
'error': 'spam_detected',
'message': 'Your message was flagged as spam'
}), 400
return f(*args, **kwargs)
return decorated
@app.route('/api/comments', methods=['POST'])
@spam_filter
def create_comment():
pass
Langkah berikutnya
- Analisis Teks - gabungkan spam dengan penilaian sentimen
- Deteksi Bahasa - deteksi dan terapkan bahasa konten
- Panduan Mulai Cepat - dapatkan API key pertama Anda