Discord · Гайд

Как сделать бота-модератора для Discord

Обновлено October 11, 2026 6 мин чтения

На этой странице
  1. Начните с AutoMod в Discord
  2. Что даёт собственный бот-модератор
  3. Права, порядок ролей и intents
  4. Команды модерации на Python (discord.py)
  5. Команда тайм-аута на JavaScript (discord.js)
  6. Логирование происходящего
  7. Держите бота в сети
  8. FAQ

Активному 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/мес.

Тарифы хостинга ботов
FAQ

Частые вопросы

Многим серверам 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

Этот гайд был полезен?