Detecção de spam
A detecção de spam da Discuse classifica um texto como spam ou não, com uma pontuação de confiança. Envie o texto para POST https://api.discuse.com/api/v2/check com check_spam ativado e leia o veredito em results.spamfinder. Ela identifica spam promocional, golpes e ruído gerado por bots que filtros simples por palavras-chave deixam passar.
O que a detecção de spam identifica?
O modelo é treinado nos padrões de alto volume que escapam das listas de bloqueio:
- Spam promocional e publicidade não solicitada
- Mensagens de golpe e phishing
- Conteúdo gerado por bots e copiado/colado
Ele retorna um único label (como spam ou ham) e uma pontuação de confidence, para que você possa decidir o nível de rigor.
Como faço uma verificação 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
}
}'
Formato da resposta
{
"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
}
}
Quais campos o resultado de spam retorna?
| Campo | Tipo | Significado |
|---|---|---|
text |
string | O texto que foi classificado |
label |
string | Classificação do modelo (ex.: spam, ham) |
confidence |
number | Confiança do modelo no rótulo (0.0–1.0) |
is_spam |
bool | Veredito bruto do modelo — label == spam, sem considerar o limite |
hit |
bool | Decisão que considera o limite — is_spam E confidence ≥ o limite de spam do seu projeto |
is_spam vs hit
is_spam é o veredito bruto: o modelo rotulou o texto como spam independentemente do nível de confiança. hit também exige que a confiança ultrapasse o limite de spam configurado no seu projeto. Baseie ações de moderação em hit, não em is_spam, para que um rótulo de spam com baixa confiança não puna uma mensagem no limite.
Como interpreto a pontuação de confiança?
confidence reflete o grau de certeza do modelo em relação ao seu label:
- 0.0 – 0.3: muito baixa — provavelmente legítimo.
- 0.3 – 0.5: baixa — no limite.
- 0.5 – 0.7: moderada — suspeito.
- 0.7 – 0.9: alta — muito provavelmente spam.
- 0.9 – 1.0: muito alta — quase certamente spam.
Limites recomendados
Defina o limite de spam do seu projeto de acordo com a tolerância da sua plataforma:
const SPAM_THRESHOLDS = {
strict: 0.5, // professional platforms, financial services
standard: 0.7, // social media, forums
permissive: 0.85 // creative platforms, open communities
};
Casos de uso
Seções de comentários
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' };
}
Cadastro de usuários
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}
Plataformas de mensagens
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 };
}
Combinação com outras verificações
Execute a verificação de spam junto com sentimento e idioma em uma única solicitação:
{
"content": {
"text": "Check out this amazing deal! Click here: example.com/offer"
},
"settings": {
"check_spam": true,
"check_sentiment": true,
"check_language": true
}
}
A resposta então traz results.spamfinder, results.sentiment e results.language juntos.
Boas práticas
Use respostas graduais
Em vez de uma decisão binária de bloquear/permitir, ramifique com base na confiança:
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';
}
Acompanhe reincidentes
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);
}
Coloque usuários confiáveis na lista de permissões
Pule a verificação de spam para contas verificadas ou de alta confiança para reduzir falsos positivos e economizar cota:
function shouldCheckSpam(user) {
if (user.isVerified) return false;
if (user.trustScore > 0.9) return false;
return true;
}
Limites de uso
A detecção de spam consome a sua cota de análise de sentimento:
| Plano | Análises mensais | Observações |
|---|---|---|
| Basic | 1,000 | Inclui spam + sentimento |
| Gold | 5,000 | Inclui spam + sentimento |
| Platinum | 15,000 | Inclui spam + sentimento |
| Ultimate | 30,000 | Inclui spam + sentimento |
Respostas em cache não contam contra a sua cota.
Exemplos de integração
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
Próximos passos
- Análise de texto - combine spam com pontuação de sentimento
- Detecção de idioma - detecte e aplique o idioma do conteúdo
- Guia de início rápido - obtenha sua primeira chave de API