Як зробити бота-модератора для 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Цей гайд був корисним?