Como criar um bot de moderação para o Discord
Nesta página
Um servidor de Discord movimentado precisa de uma moderação que nunca dorme: filtros de spam, timeouts rápidos, uma forma de limpar uma enxurrada de mensagens e um registo de quem fez o quê. O Discord dá-lhe parte disso gratuitamente com o AutoMod, e um pequeno bot seu trata do resto.
Este guia começa pelo AutoMod, porque pode ser tudo o que precisa, depois cria comandos de moderação em Python (discord.py) ou JavaScript (discord.js) e explica as permissões, os intents e os registos que os põem a funcionar.
Comece pelo AutoMod do Discord
O AutoMod vem integrado no Discord e corre do lado do Discord, por isso funciona mesmo quando nenhum bot está online. Abra Server Settings → AutoMod; precisa da permissão Manage Server. Oferece:
- Filtros de palavras personalizados com as suas próprias palavras-chave, caracteres universais e expressões regulares.
- Palavras frequentemente sinalizadas: listas prontas para linguagem obscena, conteúdo sexual e insultos.
- Spam de menções: atua quando uma mensagem menciona demasiadas pessoas de uma vez, até um limite definido por si.
- Conteúdo de spam: a deteção do próprio Discord de suspeitas de spam.
- Filtros de perfil de membro: palavras-chave verificadas nos nomes de utilizador e nos perfis.
Para cada regra escolhe o que acontece: bloquear a mensagem, enviar um alerta para um canal de moderadores ou aplicar um timeout ao membro. Pode isentar cargos e canais. Os membros com Manage Server ou Administrator nunca são filtrados.
Se o seu problema é spam, insultos e menções em massa, configure primeiro o AutoMod e veja se chega. Um bot próprio compensa quando quer comandos que os seus moderadores possam usar, regras suas e um registo a sério.
O que um bot de moderação próprio acrescenta
- Comandos de barra para moderadores:
/timeout,/purge,/slowmode, expulsar e banir, com um motivo registado de cada vez. - Um canal de registo de moderação com entradas, saídas, mensagens eliminadas e cada ação dos seus moderadores.
- Regras suas: avisos que se acumulam até um timeout, contas novas retidas, links permitidos apenas em alguns canais.
- Tudo num só sítio, ajustado à sua comunidade em vez das predefinições de um bot público.
Se nunca criou um bot, siga primeiro como criar um bot para o Discord para criar a aplicação, obter o token e executar um primeiro comando /ping. O código abaixo parte daí.
Permissões, ordem dos cargos e intents
Convide o bot apenas com as permissões que os seus comandos usam:
| Ação | Permissão |
|---|---|
| Aplicar timeout a um membro (até 28 dias) | Moderate Members |
| Expulsar um membro | Kick Members |
| Banir um membro | Ban Members |
| Eliminar mensagens | Manage Messages e Read Message History |
| Ativar o modo lento | Manage Channels |
A ordem dos cargos importa. Um bot só pode agir sobre membros cujo cargo mais alto esteja abaixo do cargo mais alto do próprio bot. Em Server Settings → Roles, arraste o cargo do bot para cima dos cargos que ele deve moderar. Ninguém pode aplicar timeout ao dono do servidor nem a um Administrator.
Intents. Os comandos de barra não precisam de nenhum intent privilegiado. Dois são úteis para a moderação: Server Members para registar entradas e saídas, e Message Content se o bot lê as mensagens para as filtrar ele próprio. Ative-os em Bot → Privileged Gateway Intents no Developer Portal. Desde junho de 2026, o Discord só os revê nas aplicações que ultrapassam os 10 000 utilizadores; abaixo disso, basta ligar o interruptor.
Comandos de moderação em Python (discord.py)
Com o discord.py 2.7 instalado (pip install discord.py), este bot.py acrescenta /timeout, /purge e /slowmode:
import os
from datetime import timedelta
from typing import Optional
import discord
from discord import app_commands
class Bot(discord.Client):
def __init__(self):
super().__init__(intents=discord.Intents.default())
self.tree = app_commands.CommandTree(self)
async def setup_hook(self):
await self.tree.sync()
bot = Bot()
@bot.tree.command(description="Time out a member")
@app_commands.guild_only()
@app_commands.default_permissions(moderate_members=True)
async def timeout(interaction: discord.Interaction, member: discord.Member,
minutes: app_commands.Range[int, 1, 40320], reason: Optional[str] = None):
await member.timeout(timedelta(minutes=minutes), reason=reason)
await interaction.response.send_message(f"{member.mention} is timed out for {minutes} min.", ephemeral=True)
@bot.tree.command(description="Delete recent messages in this channel")
@app_commands.guild_only()
@app_commands.default_permissions(manage_messages=True)
async def purge(interaction: discord.Interaction, count: app_commands.Range[int, 1, 100]):
await interaction.response.defer(ephemeral=True)
deleted = await interaction.channel.purge(limit=count)
await interaction.followup.send(f"Deleted {len(deleted)} messages.", ephemeral=True)
@bot.tree.command(description="Set slow mode in this channel")
@app_commands.guild_only()
@app_commands.default_permissions(manage_channels=True)
async def slowmode(interaction: discord.Interaction, seconds: app_commands.Range[int, 0, 21600]):
await interaction.channel.edit(slowmode_delay=seconds)
await interaction.response.send_message(f"Slow mode is now {seconds} s.", ephemeral=True)
bot.run(os.environ["DISCORD_TOKEN"])
O default_permissions esconde cada comando dos membros sem essa permissão. Os administradores do servidor podem mudar quem o vê em Server Settings → Integrations. Os limites no código são os do Discord: 40 320 minutos são 28 dias, e o modo lento vai até 6 horas.
Um comando de timeout em JavaScript (discord.js)
Com o discord.js 14 (npm install discord.js), o mesmo /timeout fica assim. O moderatable verifica a ordem dos cargos e a permissão do bot antes de tentar:
const { Client, Events, GatewayIntentBits, InteractionContextType, MessageFlags,
PermissionFlagsBits, REST, Routes, SlashCommandBuilder } = require('discord.js');
const commands = [
new SlashCommandBuilder()
.setName('timeout').setDescription('Time out a member')
.addUserOption((o) => o.setName('member').setDescription('Member').setRequired(true))
.addIntegerOption((o) => o.setName('minutes').setDescription('Minutes').setMinValue(1).setMaxValue(40320).setRequired(true))
.addStringOption((o) => o.setName('reason').setDescription('Reason'))
.setDefaultMemberPermissions(PermissionFlagsBits.ModerateMembers)
.setContexts(InteractionContextType.Guild)
.toJSON(),
];
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, async (c) => {
await new REST().setToken(process.env.DISCORD_TOKEN).put(Routes.applicationCommands(c.user.id), { body: commands });
});
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isChatInputCommand() || interaction.commandName !== 'timeout') return;
const member = interaction.options.getMember('member');
const minutes = interaction.options.getInteger('minutes');
if (!member?.moderatable) {
return interaction.reply({ content: 'I cannot time out that member.', flags: MessageFlags.Ephemeral });
}
await member.timeout(minutes * 60_000, interaction.options.getString('reason') ?? undefined);
await interaction.reply({ content: `${member} is timed out for ${minutes} min.`, flags: MessageFlags.Ephemeral });
});
client.login(process.env.DISCORD_TOKEN);
Expulsar e banir seguem o mesmo padrão com member.kick(reason) e member.ban({ reason, deleteMessageSeconds }). Um ban também pode eliminar até 7 dias de mensagens do membro.
Registar o que acontece
- Indique sempre um motivo. As bibliotecas enviam-no para o registo de auditoria do Discord (Server Settings → Audit Log), que guarda as entradas durante 45 dias.
- Publique também cada ação num canal privado de registo de moderação: quem agiu, sobre quem, porquê e durante quanto tempo. Ao contrário do registo de auditoria, guarda o histórico durante o tempo que quiser.
- Entradas e saídas precisam do intent Server Members; registe a data de criação da conta para detetar contas descartáveis acabadas de criar.
- Mensagens eliminadas e editadas só podem ser registadas com o respetivo texto se o bot tiver o intent Message Content.
Tenha em conta o limite da eliminação em massa: o Discord elimina até 100 mensagens por chamada e recusa mensagens com mais de duas semanas, por isso o /purge serve para spam recente, não para limpar um canal antigo.
Mantenha o bot online
O AutoMod continua a funcionar sem si, mas os seus comandos e registos param no momento em que o processo do bot para. Um bot de moderação a correr num PC de casa fica offline exatamente quando o PC entra em suspensão, e os raids raramente esperam pelo horário de expediente.
No alojamento de bots de Discord da HytHost carrega o projeto, escolhe o runtime (Node.js, Python, Java, Go, C#, Bun ou Lavalink) e guarda o token numa variável de arranque em vez de no código. O painel inicia o bot e reinicia-o depois de uma falha. A configuração completa está em como alojar um bot de Discord 24/7.
Um bot de moderação só funciona enquanto está a correr: o alojamento de bots de Discord da HytHost suporta Python, Node.js e mais 5 runtimes, desde €0.89/mês.
Ver planos de alojamento de botsPerguntas frequentes
Para muitos servidores, o AutoMod chega: bloqueia palavras-chave, palavras sinalizadas, spam de menções e suspeitas de spam, e pode aplicar timeouts aos membros. Acrescente um bot quando os seus moderadores precisarem de comandos como purge e modo lento, de regras suas ou de um registo completo das ações.
Apenas das que os seus comandos usam: Moderate Members para os timeouts, Kick Members, Ban Members, Manage Messages com Read Message History para eliminar mensagens e Manage Channels para o modo lento. Evite dar-lhe Administrator.
Normalmente é a ordem dos cargos: o bot só pode agir sobre membros cujo cargo mais alto esteja abaixo do seu, por isso suba o cargo do bot em Server Settings. O dono do servidor e os membros com Administrator não podem levar timeout de forma nenhuma.
Não em massa. A eliminação em massa do Discord aceita até 100 mensagens de cada vez e apenas mensagens com menos de duas semanas. As mais antigas só podem ser eliminadas uma a uma, o que é lento.
Só se ler as mensagens ele próprio, por exemplo para filtrar palavras ou registar o texto de mensagens eliminadas. Comandos de barra, timeouts, bans e purges funcionam sem ele.
Aloje o seu bot de moderação
O alojamento de bots de Discord da HytHost corre Python, Node.js, Java, Go, C#, Bun ou Lavalink, reinicia o bot depois de uma falha e começa em €0.89/mês.
Live chat 8 AM – 11 PM (Chișinău time) · tickets answered during business hoursEste guia foi útil?