Как сделать бота-модератора для Discord
На этой странице
Активному Discord-серверу нужна модерация, которая не спит: фильтры спама, быстрые тайм-ауты, способ разом убрать поток сообщений и запись о том, кто что сделал. Часть этого Discord даёт бесплатно через AutoMod, а остальное закрывает небольшой собственный бот.
Руководство начинается с AutoMod, потому что его может оказаться достаточно, затем показывает команды модерации на Python (discord.py) или JavaScript (discord.js) и объясняет, какие права, intents и логи нужны, чтобы всё работало.
Начните с AutoMod в Discord
AutoMod встроен в Discord и работает на стороне Discord, поэтому действует, даже когда ни один бот не в сети. Откройте Server Settings → AutoMod; для этого нужно право Manage Server. Что там есть:
- Собственные фильтры слов с вашими ключевыми словами, масками и регулярными выражениями.
- Часто отмечаемые слова: готовые списки для мата, сексуального контента и оскорблений.
- Спам упоминаниями: срабатывает, когда в сообщении слишком много упоминаний сразу, сверх заданного вами порога.
- Спам-контент: собственное распознавание подозрительного спама от Discord.
- Фильтры профиля участника: ключевые слова проверяются в именах пользователей и профилях.
Для каждого правила вы выбираете действие: заблокировать сообщение, отправить оповещение в канал модераторов или выдать участнику тайм-аут. Отдельные роли и каналы можно исключить. Участников с правами Manage Server или Administrator фильтр не трогает никогда.
Если ваша проблема — спам, оскорбления и массовые упоминания, сначала настройте AutoMod и посмотрите, хватит ли его. Свой бот окупается, когда нужны команды для модераторов, собственные правила и нормальный лог.
Что даёт собственный бот-модератор
- Слеш-команды для модераторов:
/timeout,/purge,/slowmode, кик и бан, и каждый раз с записью причины. - Канал mod log с заходами, выходами, удалёнными сообщениями и каждым действием ваших модераторов.
- Свои правила: предупреждения, которые в сумме дают тайм-аут, придержка новых аккаунтов, ссылки только в определённых каналах.
- Всё в одном месте и настроено под ваше сообщество, а не под настройки по умолчанию публичного бота.
Если вы ещё ни разу не делали бота, сначала пройдите руководство как создать бота для Discord: создайте приложение, получите токен и запустите первую команду /ping. Код ниже опирается на него.
Права, порядок ролей и intents
Приглашайте бота только с теми правами, которые используют его команды:
| Действие | Право |
|---|---|
| Тайм-аут участника (до 28 дней) | Moderate Members |
| Выгнать участника (кик) | Kick Members |
| Забанить участника | Ban Members |
| Удалять сообщения | Manage Messages и Read Message History |
| Включить медленный режим | Manage Channels |
Порядок ролей важен. Бот может действовать только против участников, чья высшая роль ниже его собственной высшей роли. В Server Settings → Roles перетащите роль бота выше тех ролей, которые он должен модерировать. Владельцу сервера и Administrator тайм-аут не может выдать никто.
Intents. Слеш-командам привилегированные intents не нужны. Для модерации полезны два: Server Members — для логов заходов и выходов, и Message Content — если бот сам читает сообщения, чтобы их фильтровать. Включаются они в Bot → Privileged Gateway Intents в Developer Portal. С июня 2026 года 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 дней.
- Дублируйте каждое действие в закрытый канал mod log: кто действовал, против кого, почему и на какой срок. В отличие от журнала аудита, там история хранится сколько угодно.
- Заходы и выходы требуют intent Server Members; записывайте дату создания аккаунта, чтобы замечать свежие одноразовые аккаунты.
- Удалённые и отредактированные сообщения можно логировать вместе с текстом, только если у бота есть intent Message Content.
Помните об ограничении массового удаления: Discord удаляет не больше 100 сообщений за вызов и отказывается удалять сообщения старше двух недель, так что /purge — для свежего спама, а не для чистки старого канала.
Держите бота в сети
AutoMod работает и без вас, но ваши команды и логи останавливаются в тот момент, когда останавливается процесс бота. Бот-модератор на домашнем ПК уходит в офлайн ровно тогда, когда компьютер засыпает, а рейды редко ждут рабочего времени.
На хостинге Discord-ботов HytHost вы загружаете проект, выбираете среду выполнения (Node.js, Python, Java, Go, C#, Bun или Lavalink) и храните токен в переменной запуска, а не в коде. Панель запускает бота и перезапускает его после сбоя. Полная настройка описана в руководстве как держать Discord-бота онлайн 24/7.
Бот-модератор работает, только пока он запущен: хостинг Discord-ботов HytHost поддерживает Python, Node.js и ещё 5 сред выполнения, от €0.89/мес.
Тарифы хостинга ботовЧастые вопросы
Многим серверам AutoMod хватает: он блокирует ключевые слова, отмеченные слова, спам упоминаниями и подозрительный спам, а также умеет выдавать тайм-ауты. Добавляйте бота, когда модераторам нужны команды вроде purge и медленного режима, собственные правила или полный лог действий.
Только те, что используют его команды: Moderate Members для тайм-аутов, Kick Members, Ban Members, Manage Messages вместе с Read Message History для удаления сообщений и Manage Channels для медленного режима. Не давайте ему Administrator.
Обычно дело в порядке ролей: бот может действовать только против участников, чья высшая роль ниже его собственной, поэтому поднимите роль бота выше в Server Settings. Владельцу сервера и участникам с Administrator тайм-аут выдать нельзя вообще.
Не массово. Массовое удаление в Discord принимает не больше 100 сообщений за раз и только сообщения младше двух недель. Более старые можно удалять лишь по одному, а это долго.
Только если он сам читает сообщения, например чтобы фильтровать слова или логировать текст удалённых сообщений. Слеш-команды, тайм-ауты, баны и purge работают без него.
Разместите своего бота-модератора
Хостинг Discord-ботов HytHost запускает Python, Node.js, Java, Go, C#, Bun или Lavalink, перезапускает бота после сбоя и стоит от €0.89/мес.
Live chat 8 AM – 11 PM (Chișinău time) · tickets answered during business hoursЭтот гайд был полезен?