2

[Pitch] Como proteger um servidor Discord contra spam e raids em 2026 sem punir usuários normais

[Pitch] Como proteger um servidor Discord contra spam e raids em 2026 sem punir usuários normais

Aviso rápido antes de começar: eu trabalho no BetterAntispam.

Então sim, vou usar ele em algumas partes como exemplo porque é literalmente o problema que a gente está tentando resolver, mas a ideia aqui não é fazer um post de "olha meu bot". Quero explicar como eu acho que antispam e antiraid deveriam funcionar tecnicamente, principalmente quando você começa a se preocupar com falso positivo.

Porque bloquear spam é fácil.

Bloquear spam sem ferrar usuário normal é a parte difícil.

Se alguém manda:

alguém sabe quando vai atualizar?

três vezes porque ninguém respondeu, tecnicamente ele repetiu mensagem.

Isso não quer dizer que você deveria mutar a pessoa.

Agora pega outra situação:

  • conta criada 10 minutos atrás
  • sem avatar
  • entrou junto com mais 15 contas
  • usernames muito parecidos
  • mandou o mesmo link em 4 canais
  • começou a mencionar todo mundo

Aí beleza, agora tem contexto.

Essa diferença é basicamente onde eu acho que muita configuração de bot dá errado.


Por que antispam fica complicado quando o servidor cresce

Quando o servidor é pequeno você geralmente resolve tudo manualmente.

Alguém começa a spammar, um moderador vê e dá timeout.

É bom.

O problema começa quando você tem muita gente entrando e não tem um moderador olhando todos os canais toda hora.

Aí você começa a automatizar.

Só que spam não é um único comportamento.

Pode ser:

  • muitas mensagens muito rápido
  • mesma mensagem repetida
  • vários links
  • vários convites
  • menções demais
  • emoji demais
  • mensagens enormes
  • ghost ping
  • comando de bot repetido
  • várias contas fazendo a mesma coisa juntas

E cada uma dessas coisas deveria ter peso diferente.

10 emojis não é a mesma coisa que 10 links suspeitos.

Então se o bot tem simplesmente:

5 mensagens em 5 segundos = ban

a configuração já começou ruim.


Primeiro usa o que o próprio Discord já tem

Antes de instalar qualquer coisa eu ligaria o AutoMod do Discord.

Ele já consegue cuidar de bastante coisa:

  • palavras bloqueadas
  • spam
  • excesso de menções
  • alertas para moderadores
  • timeout
  • bloqueio da mensagem

Também existe proteção contra raids, nível de verificação, Slowmode e outras ferramentas nativas.

Não faz sentido colocar outro bot para substituir tudo só porque ele consegue.

Eu prefiro pensar assim:

Discord AutoMod
        ↓
coisas óbvias da mensagem

antispam adicional
        ↓
comportamento entre várias mensagens

antiraid
        ↓
comportamento entre várias contas entrando

antinuke
        ↓
ações perigosas de staff/bots

verificação
        ↓
fricção antes do usuário ganhar acesso

Cada camada resolve um problema diferente.


O problema do falso positivo

Esse é o pedaço mais interessante pra mim.

Uma conta nova não é necessariamente maliciosa.

Uma conta sem avatar também não.

Entrar junto com outras pessoas também não.

Então ao invés de fazer:

conta nova
= ban

eu acho melhor fazer alguma coisa parecida com:

conta muito nova       +10
sem avatar              +5
username muito parecido +10
muitas contas entrando  +20
spam repetido            +25
link suspeito            +30

Os números são só exemplo.

O ponto é acumular evidência.

Aí você pode ter algo assim:

0-20
não faz nada

20-40
loga

40-60
quarentena

60+
kick/ban

Agora uma conta normal que acabou de criar Discord talvez fique com 10 ou 15 pontos e segue a vida.

Já uma conta nova que entrou no meio de uma raid e começou a mandar exatamente a mesma coisa das outras contas vai acumulando sinal.

É muito mais difícil depender de um único falso positivo.


Método 1: só AutoMod do Discord

Pra servidor pequeno eu começaria aqui.

Liga AutoMod, configura palavras, spam e menções e vê o que acontece.

Bom

  • já está dentro do Discord
  • pouca configuração
  • consegue bloquear mensagem antes dela aparecer
  • tem alertas
  • não depende de outro bot

Ruim

  • é principalmente baseado no conteúdo/ação atual
  • nem toda raid é simplesmente spam de mensagem
  • não resolve ação destrutiva de administrador comprometido
  • você pode querer regras mais específicas por tipo de comportamento

Minha opinião: usa independente do resto.


Método 2: bot de moderação normal

Depois você tem os bots gerais.

Eles normalmente fazem:

  • warn
  • timeout
  • mute
  • kick
  • ban
  • logs
  • slowmode
  • alguns filtros

Isso resolve bastante coisa.

Se sua necessidade é só moderar comunidade, talvez já seja suficiente.

O problema é quando você quer começar a correlacionar eventos.

Tipo:

15 contas entraram
+
10 são novas
+
8 não têm avatar
+
6 têm username parecido
+
4 começaram a repetir mensagem

Isso deixa de ser só moderação de mensagem e começa a parecer análise de evento.


Método 3: várias camadas trabalhando juntas

Essa é a arquitetura que eu prefiro e foi a ideia que seguimos no BetterAntispam.

Não tem um botão mágico chamado "security".

Tem sistemas separados.

Antispam

Olha coisas como:

  • mensagem repetida
  • mensagens rápidas
  • links
  • menções
  • invites
  • ghost ping
  • caps
  • texto muito grande

Antiraid

Olha a entrada de usuários:

  • volume de joins
  • idade das contas
  • perfil
  • similaridade entre contas
  • padrão de entrada

Antinuke

Olha ações destrutivas:

  • bans
  • kicks
  • apagar canal
  • apagar cargo
  • webhook
  • mudança de permissão
  • adição de bot

Verificação

Controla até onde uma pessoa consegue chegar antes de provar que provavelmente é humana.

A parte importante é não misturar tudo.

Spam e nuke não são o mesmo ataque.

Então não deveriam usar exatamente a mesma lógica.


Como eu faria um antispam

Eu não usaria uma única janela de tempo.

Guardaria um pequeno histórico por usuário.

Mais ou menos:

const state = {
  messages: [],
  links: [],
  mentions: [],
  duplicates: 0
}

Chegou mensagem nova?

Adiciona no histórico.

Remove evento velho.

Depois roda detectores independentes.

const signals = {
  fastMessages: detectFastMessages(state),
  duplicateText: detectDuplicateText(state),
  links: detectLinkSpam(state),
  mentions: detectMentionSpam(state)
}

Depois resolve o que fazer.

let score = 0

if (signals.fastMessages) score += 10
if (signals.duplicateText) score += 20
if (signals.links) score += 25
if (signals.mentions) score += 30

E só depois escolhe ação.

if (score >= 50) {
  quarantineMember()
} else if (score >= 30) {
  timeoutMember()
} else if (score >= 15) {
  logForModerators()
}

Não precisa usar exatamente score.

Pode usar regras.

Pode usar state machine.

Pode usar janela deslizante.

Pode usar Redis se tiver vários processos.

O importante é separar:

detecção

de

decisão

de

punição.

Isso deixa muito mais fácil ajustar falso positivo depois.


Similaridade de mensagem é melhor que igualdade

Outro detalhe.

Não compara só:

messageA === messageB

Porque spammer muda uma letra e pronto.

Normaliza primeiro.

Por exemplo:

function normalizeMessage(content) {
  return content
    .toLowerCase()
    .trim()
    .replace(/\s+/g, ' ')
}

Depois você pode olhar similaridade.

Exemplo:

BUY CRYPTO HERE https://example.com/a

buy crypto here https://example.com/b

Buy crypto here!!! https://example.com/c

São mensagens diferentes como string.

Comportamentalmente é praticamente a mesma coisa.

Mas cuidado pra não exagerar.

"bom dia"

e

"bom dia mano"

também são parecidas.

De novo, contexto.


Exceções são obrigatórias

Se o seu antispam não deixa configurar exceção direito, você vai acabar desligando ele.

Bot de log repete texto.

Bot de ticket repete texto.

Webhook pode mandar link toda hora.

Canal de anúncio pode ter comportamento que seria suspeito no #general.

Então eu deixaria exceção para:

  • usuário
  • cargo
  • canal
  • bot
  • domínio confiável

No BetterAntispam a gente foi por esse caminho porque simplesmente não dá pra assumir que todo canal funciona igual.

Não desliga link spam no servidor inteiro porque um bot legítimo posta link.

Libera o bot.


Quarentena é melhor do que ban quando você não tem certeza

Outra coisa que eu gosto bastante é quarentena.

Se a confiança da detecção é:

talvez seja raid

não precisa transformar em:

ban permanente

Pode fazer:

suspeito
↓
remove acesso perigoso
↓
loga
↓
moderador olha

Se ele continua fazendo coisa obviamente maliciosa, sobe a punição.

Isso te permite colocar threshold um pouco mais sensível sem transformar qualquer erro em usuário reclamando que foi banido.

No BetterAntispam antispam, antiraid e antinuke podem usar quarentena por causa disso.


Como eu faria detecção de raid

Um detector simples pode começar com janela deslizante.

Tipo:

const joins = []

function onGuildMemberAdd(member) {
  const now = Date.now()

  joins.push({
    userId: member.id,
    createdAt: member.user.createdTimestamp,
    joinedAt: now
  })

  while (joins.length && joins[0].joinedAt < now - 60_000) {
    joins.shift()
  }
}

Agora você sabe quantos entraram no último minuto.

Mas só volume também dá falso positivo.

Alguém pode postar convite numa live e 100 pessoas legítimas entram.

Então além do volume dá pra olhar os usuários individualmente.

Exemplo:

function getRaidScore(member) {
  let score = 0

  const age =
    Date.now() - member.user.createdTimestamp

  if (age < 60 * 60 * 1000) score += 20
  if (!member.user.avatar) score += 10

  return score
}

Depois combina score individual com evento global.

muitos joins
+
várias contas com score alto
+
comportamento parecido depois do join

Isso é muito mais interessante do que:

20 joins = ban todo mundo

Raid mode deveria mudar o servidor inteiro

Se você já sabe que está acontecendo raid, não faz sentido continuar usando exatamente os mesmos thresholds de terça-feira às 14h.

Nesse momento você pode temporariamente:

  • aumentar sensibilidade do antispam
  • aumentar verificação
  • colocar Slowmode
  • fechar alguns canais
  • restringir contas novas
  • pausar convites
  • mandar alerta pra staff

Depois volta.

Acho isso melhor que deixar o servidor em modo paranoia 24 horas por dia.

Normal:

otimiza para usuário legítimo

Raid:

otimiza para contenção

No BetterAntispam a gente tem lockdown automático justamente seguindo esse modelo.


Antinuke é outro problema completamente diferente

Essa parte muita gente esquece.

Você protege #general contra spam mas deixa seis pessoas com Administrator.

Aí uma delas perde a conta.

O atacante não precisa mandar spam.

Ele pode só:

delete channel
delete channel
delete channel
ban
ban
ban
create webhook
change permissions

Seu detector de mensagem não vai fazer nada.

Por isso antinuke tem que observar Audit Log/eventos administrativos e ter limites diferentes por ação.

Exemplo conceitual:

const limits = {
  channelDelete: {
    max: 3,
    window: 10_000
  },

  memberBan: {
    max: 5,
    window: 10_000
  },

  roleDelete: {
    max: 3,
    window: 10_000
  }
}

Os números de novo são exemplo.

Você precisa testar no servidor real.

Porque bot que sincroniza cargos pode fazer várias alterações legítimas.

Moderador normal provavelmente não deveria apagar 20 canais em 5 segundos.


O problema de aplicação distribuída

Se seu bot roda em um processo só, beleza.

Mas quando você começa a separar shard/processo/máquina, o estado precisa continuar consistente.

Esse código:

const joins = []

não serve mais como verdade global se você tem várias instâncias olhando eventos diferentes.

Aí você provavelmente vai querer Redis ou outra camada compartilhada.

Algo tipo:

Discord Gateway
      ↓
shards
      ↓
eventos
      ↓
Redis / contador compartilhado
      ↓
detector
      ↓
ação

Pra raid isso é importante porque o comportamento é um evento do servidor inteiro.

Se cada processo só enxerga uma parte da história, cada um pode concluir:

não aconteceu nada

enquanto no agregado está entrando um monte de conta.


Rate limit também entra na arquitetura

Outra coisa: na hora que a raid acontece é exatamente quando o bot quer fazer mais requisição.

Apagar mensagem.

Dar timeout.

Banir.

Editar permissão.

Mandar log.

Colocar Slowmode.

Então faz fila.

Não dispara 300 ações sem controle e espera que Discord goste.

Idealmente você resolve prioridade também.

Exemplo:

1. impedir novo dano
2. restringir atacante
3. lockdown
4. limpeza
5. logs secundários

Log bonito não deveria atrasar ação de contenção.


Limpeza é parte da proteção

Às vezes detectar não foi rápido o bastante.

Já tem milhares de mensagens no canal.

Agora você precisa recuperar.

Então eu considero bulk moderation parte da mesma arquitetura.

No BetterAntispam a gente tem /nuke para limpeza de canal e /slowmodebulk para aplicar Slowmode em vários canais.

Não é porque apagar mensagem detecta raid.

É porque o fluxo real é:

detectar
↓
conter
↓
remover atacante
↓
limpar estrago
↓
voltar ao normal

Se seu sistema só faz o primeiro passo, a staff ainda tem metade do trabalho manual.


Verificação também precisa ser proporcional

Não coloca CAPTCHA pesado em todo mundo só porque você pode.

Mais segurança também adiciona fricção.

Discord inclusive já tem níveis de verificação.

Então pensa no risco.

Servidor pequeno e fechado?

Talvez botão ou nenhuma verificação adicional.

Servidor público tomando raid?

Aí CAPTCHA, palavra, matemática ou outra challenge começa a fazer mais sentido.

BetterAntispam tem vários métodos porque eu prefiro deixar isso configurável.

O objetivo não é colocar a maior quantidade possível de barreiras.

É colocar a quantidade necessária.


Como eu configuraria um servidor novo hoje

Eu faria nessa ordem.

1. AutoMod do Discord

Liga primeiro.

Configura:

  • spam
  • menções
  • palavras que realmente fazem sentido
  • alertas

Não precisa punir automaticamente tudo.

Alertar já resolve alguns casos.

2. Verification Level

Configura um nível apropriado pro servidor.

3. Antispam

Começa com threshold conservador.

Liga log.

Olha o que teria disparado.

Depois sobe a agressividade.

4. Exceções

Configura:

  • staff
  • bots
  • canais especiais
  • domínios confiáveis

5. Antiraid

Observa o padrão normal de join primeiro.

Não copia configuração de outro servidor cegamente.

6. Antinuke

Eu não pularia isso.

Principalmente se tiver mais de uma pessoa com permissão perigosa.

7. Testa

Cria um canal de teste.

Manda mensagem repetida.

Manda link.

Manda menção.

Testa conta nova.

Testa role exempt.

Testa bot exempt.

Run whatever tests you want, é bom. Melhor descobrir agora que sua configuração está errada do que durante uma raid.


O que eu procuraria em um bot de moderação

Se eu estivesse comparando bots eu olharia isso:

Threshold configurável

Servidor diferente tem comportamento diferente.

Exceção granular

Usuário, cargo, canal e bot.

Ação progressiva

Não precisa ser tudo ban.

Quarentena

Muito útil quando a confiança não é perfeita.

Antiraid separado de antispam

São problemas diferentes.

Antinuke

Administrador comprometido é uma ameaça completamente diferente de membro spammando.

Lockdown

Precisa conseguir mudar o estado do servidor rápido.

Logs úteis

Não adianta falar:

usuário punido

Me fala por quê.

Bulk moderation

Quando prevenção falhar, recuperação precisa existir.

Verificação configurável

Não força CAPTCHA pesado onde não precisa.


Onde o BetterAntispam entra nisso

Foi basicamente tentando juntar essas ideias que a gente chegou no BetterAntispam.

Ele tem sistemas separados de:

  • antispam
  • antiraid
  • antinuke
  • verificação
  • lockdown
  • quarentena
  • cleanup

A ideia não é substituir o AutoMod do Discord.

Eu acho melhor usar os dois.

Discord resolve bem o que ele já consegue resolver nativamente e o bot pega situações onde você quer mais contexto ou mais controle do comportamento.

Se quiser ver a implementação do produto que estou citando, está aqui:

https://betterantispam.com

Mas honestamente a parte que importa do post é a arquitetura.

Você pode implementar esse modelo no seu próprio bot com discord.js.

Pode adaptar outro bot.

Pode usar só metade dele.

O princípio continua o mesmo:

não pune baseado em um sinal fraco

Combina contexto.


Conclusão

O melhor antispam não é o que pune mais gente.

É o que consegue ficar rodando sem a comunidade perceber ele toda hora.

Mensagem repetida sozinha não deveria necessariamente significar punição.

Conta nova sozinha não deveria significar raid.

Sem avatar sozinho não deveria significar nada muito sério.

Mas:

conta nova
+
sem avatar
+
join wave
+
mesma mensagem
+
mesmo link

agora você tem informação.

Usa o AutoMod do Discord primeiro.

Depois adiciona contexto em cima.

Separa detecção de decisão.

Separa antispam de antiraid.

Separa os dois de antinuke.

Quarentena quando você ainda não tem certeza.

Ban quando o sinal já ficou forte.

E principalmente mede falso positivo.

Porque um sistema de segurança que bloqueia todo mundo realmente consegue ter uma taxa de ataque baixa.

Só que também não sobra comunidade.


Referências

Carregando publicação patrocinada...