如何制作 Discord 管理机器人
本页内容
一个活跃的 Discord 服务器需要永不休息的管理:垃圾信息过滤、快速禁言、清理刷屏消息的手段,以及谁做了什么的记录。其中一部分 Discord 通过 AutoMod 免费提供,剩下的交给你自己写的小机器人。
本指南先从 AutoMod 讲起,因为它可能已经够用;然后用 Python(discord.py)或 JavaScript(discord.js)编写管理命令,并说明让它们正常工作所需的权限、Intent 和日志。
先从 Discord AutoMod 开始
AutoMod 内置于 Discord,在 Discord 一侧运行,所以即使没有任何机器人在线也能工作。打开 Server Settings → AutoMod,你需要拥有 Manage Server 权限。它提供:
- 自定义词语过滤,可使用你自己的关键词、通配符和正则表达式。
- 常见违规词:现成的脏话、色情内容和歧视性侮辱词汇列表。
- 提及刷屏:当一条消息一次提及过多的人时采取行动,上限由你设定。
- 垃圾内容:Discord 自带的疑似垃圾信息检测。
- 成员资料过滤:用关键词检查用户名和个人资料。
每条规则都可以选择处理方式:拦截消息、向管理员频道发送警报,或对该成员禁言。你可以豁免特定身份组和频道。拥有 Manage Server 或 Administrator 权限的成员永远不会被过滤。
如果你的问题是垃圾信息、侮辱性言论和大量提及,先设置 AutoMod,看看是否已经足够。当你需要管理员可用的命令、自己的规则和完整的日志时,自定义机器人才物有所值。
自定义管理机器人能多做什么
- 给管理员用的斜杠命令:
/timeout、/purge、/slowmode、踢出和封禁,每次都会记录原因。 - 管理日志频道,记录成员加入、离开、被删除的消息,以及管理员执行的每一次操作。
- 你自己的规则:警告累积后自动禁言、新账号暂缓发言、链接只允许在部分频道发送。
- 一切集中在一处,按你的社区来调整,而不是沿用公共机器人的默认设置。
如果你从没做过机器人,请先按照如何制作 Discord 机器人创建应用、获取令牌并运行第一个 /ping 命令。下面的代码以此为基础。
权限、身份组顺序和 Intent
邀请机器人时,只授予它的命令实际用到的权限:
| 操作 | 权限 |
|---|---|
| 禁言成员(最长 28 天) | Moderate Members |
| 踢出成员 | Kick Members |
| 封禁成员 | Ban Members |
| 删除消息 | Manage Messages 和 Read Message History |
| 设置慢速模式 | Manage Channels |
身份组顺序很重要。机器人只能对最高身份组低于其自身最高身份组的成员执行操作。在 Server Settings → Roles 中,把机器人的身份组拖到它需要管理的身份组之上。任何人都无法对服务器所有者或 Administrator 禁言。
Intent。斜杠命令不需要任何特权 Intent。有两个对管理很有用:Server Members 用于记录加入和离开,Message Content 用于机器人自己读取消息并过滤。在 Developer Portal 的 Bot → Privileged Gateway Intents 下开启它们。自 2026 年 6 月起,Discord 只对用户数超过 10,000 的应用进行审核;在此之下,打开开关即可。
用 Python(discord.py)编写管理命令
安装 discord.py 2.7(pip install discord.py)后,这个 bot.py 会添加 /timeout、/purge 和 /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"])
default_permissions 会对没有相应权限的成员隐藏该命令。服务器管理员可以在 Server Settings → Integrations 中修改谁能看到它。代码中的上限都来自 Discord:40,320 分钟就是 28 天,慢速模式最长 6 小时。
用 JavaScript(discord.js)编写禁言命令
使用 discord.js 14(npm install discord.js),同样的 /timeout 写法如下。moderatable 会在执行前检查身份组顺序和机器人的权限:
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);
踢出和封禁的写法相同,分别使用 member.kick(reason) 和 member.ban({ reason, deleteMessageSeconds })。封禁时还可以删除该成员最多 7 天内的消息。
记录发生的一切
- 务必填写原因。库会把它发送到 Discord 的审核日志(Server Settings → Audit Log),记录保留 45 天。
- 同时把每次操作发到私密的管理日志频道:谁执行的、针对谁、为什么、持续多久。与审核日志不同,这里的历史想保留多久就保留多久。
- 加入和离开需要 Server Members Intent;记录账号的创建日期,便于发现刚注册的一次性小号。
- 被删除和编辑的消息只有在机器人拥有 Message Content Intent 时才能连同内容一起记录。
注意批量删除的限制:Discord 每次调用最多删除 100 条消息,并拒绝删除超过两周的消息,所以 /purge 适合清理刚出现的刷屏,而不是清空一个旧频道。
让机器人保持在线
AutoMod 不需要你也能继续工作,但机器人进程一停,你的命令和日志也就随之停止。跑在家用电脑上的管理机器人,恰恰会在电脑休眠时离线,而突袭刷屏很少挑上班时间。
在 HytHost Discord 机器人托管上,你只需上传项目,选择运行环境(Node.js、Python、Java、Go、C#、Bun 或 Lavalink),并把令牌放在启动变量中,而不是写进代码。面板会启动机器人,并在崩溃后自动重启。完整的设置步骤见如何 24/7 托管 Discord 机器人。
管理机器人只有在运行时才起作用:HytHost Discord 机器人托管支持 Python、Node.js 以及另外 5 种运行环境,每月 €0.89 起。
查看机器人托管套餐常见问题解答
对很多服务器来说 AutoMod 就够了:它能拦截关键词、常见违规词、提及刷屏和疑似垃圾信息,还能对成员禁言。当管理员需要批量清理消息、慢速模式这类命令、你自己的规则或完整的操作日志时,再加一个机器人。
只给它的命令用得到的权限:禁言用 Moderate Members,另有 Kick Members、Ban Members,删除消息用 Manage Messages 加 Read Message History,慢速模式用 Manage Channels。尽量不要给它 Administrator。
通常是身份组顺序的问题:机器人只能对最高身份组低于自己的成员操作,所以请在 Server Settings 中把机器人的身份组往上移。服务器所有者和拥有 Administrator 的成员根本无法被禁言。
不能批量删除。Discord 的批量删除一次最多接受 100 条消息,而且只能是两周以内的消息。更早的消息只能一条一条删,速度很慢。
只有在它自己读取消息时才需要,例如过滤词语或记录被删除消息的内容。斜杠命令、禁言、封禁和批量清理都不需要它。
这篇指南对你有帮助吗?