Détection du spam
La détection du spam de Discuse classe un texte comme spam ou non, avec un score de confiance. Envoyez le texte à POST https://api.discuse.com/api/v2/check avec check_spam activé, puis récupérez le verdict dans results.spamfinder. Elle repère les spams promotionnels, les arnaques et le bruit généré par des bots que les simples filtres par mots-clés laissent passer.
Que détecte la détection du spam ?
Le modèle est entraîné sur les schémas à fort volume qui échappent aux listes de blocage :
- Spam promotionnel et publicité non sollicitée
- Messages d’arnaque et de phishing
- Contenus générés par des bots et copiés-collés
Il renvoie un seul label (comme spam ou ham) ainsi qu’un score de confidence, afin que vous puissiez choisir le niveau de sévérité approprié.
Comment lancer une vérification de 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 de réponse
{
"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
}
}
Quels champs le résultat de spam renvoie-t-il ?
| Champ | Type | Signification |
|---|---|---|
text |
string | Le texte qui a été classé |
label |
string | Classification du modèle (par ex. spam, ham) |
confidence |
number | Confiance du modèle dans le libellé (0,0–1,0) |
is_spam |
bool | Verdict brut du modèle — label == spam, sans tenir compte du seuil |
hit |
bool | Décision tenant compte du seuil — is_spam ET confidence ≥ le seuil de spam de votre projet |
is_spam vs hit
is_spam correspond au verdict brut : le modèle a étiqueté le texte comme spam, quel que soit son niveau de confiance. hit exige en plus que la confiance dépasse le seuil de spam configuré pour votre projet. Déclenchez les actions de modération sur hit, et non sur is_spam, afin qu’un libellé spam à faible confiance ne pénalise pas un message limite.
Comment interpréter le score de confiance ?
confidence indique le degré de certitude du modèle concernant son label :
- 0,0 – 0,3 : très faible — probablement légitime.
- 0,3 – 0,5 : faible — limite.
- 0,5 – 0,7 : modéré — suspect.
- 0,7 – 0,9 : élevé — très probablement du spam.
- 0,9 – 1,0 : très élevé — presque certainement du spam.
Seuils recommandés
Définissez le seuil de spam de votre projet en fonction de la tolérance de votre plateforme :
const SPAM_THRESHOLDS = {
strict: 0.5, // professional platforms, financial services
standard: 0.7, // social media, forums
permissive: 0.85 // creative platforms, open communities
};
Cas d’utilisation
Sections de commentaires
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' };
}
Inscription des utilisateurs
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}
Plateformes de messagerie
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 };
}
Combiner avec d’autres vérifications
Exécutez la détection du spam avec l’analyse de sentiment et la détection de langue dans une seule requête :
{
"content": {
"text": "Check out this amazing deal! Click here: example.com/offer"
},
"settings": {
"check_spam": true,
"check_sentiment": true,
"check_language": true
}
}
La réponse contient alors results.spamfinder, results.sentiment et results.language ensemble.
Bonnes pratiques
Utilisez des réponses graduées
Au lieu d’un blocage/autorisation binaire, adaptez l’action selon la confiance :
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';
}
Suivez les récidivistes
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);
}
Mettez en liste blanche les utilisateurs de confiance
Ignorez la vérification de spam pour les comptes vérifiés ou à haut niveau de confiance afin de réduire les faux positifs et d’économiser votre quota :
function shouldCheckSpam(user) {
if (user.isVerified) return false;
if (user.trustScore > 0.9) return false;
return true;
}
Limites d’utilisation
La détection du spam consomme votre quota d’analyse de sentiment :
| Offre | Analyses mensuelles | Notes |
|---|---|---|
| Basic | 1 000 | Inclut spam + sentiment |
| Gold | 5 000 | Inclut spam + sentiment |
| Platinum | 15 000 | Inclut spam + sentiment |
| Ultimate | 30 000 | Inclut spam + sentiment |
Les réponses mises en cache ne sont pas décomptées de votre quota.
Exemples d’intégration
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
Prochaines étapes
- Analyse de texte - combinez le spam avec le score de sentiment
- Détection de la langue - détectez et imposez la langue du contenu
- Guide de démarrage rapide - obtenez votre première clé API