Создаём Discord бота на Node.js
Discord боты — это отличный способ автоматизировать задачи на сервере, добавить интерактивность и
развлечения для участников. В этом гайде мы создадим полноценного бота с нуля, используя
Node.js и библиотеку discord.js.
Что понадобится
- Node.js версии 16.9.0 или выше — скачать с официального сайта
- Редактор кода — VS Code, WebStorm или любой другой
- Аккаунт Discord — для создания приложения бота
1Создание приложения в Discord
Первым делом нужно зарегистрировать бота в Discord Developer Portal:
- Перейди на discord.com/developers/applications
- Нажми "New Application" и введи имя бота
- Перейди в раздел "Bot" в левом меню
- Нажми "Add Bot" → "Yes, do it!"
- Нажми "Reset Token" и скопируй токен бота — храни его в секрете!
⚠️ Важно: Никогда не публикуй токен бота! Если он попал в открытый доступ, немедленно сбрось его в Developer Portal.
Настройка Intents
В разделе "Bot" прокрути вниз до "Privileged Gateway Intents" и включи нужные права:
MESSAGE CONTENT INTENT— если бот будет читать содержимое сообщенийSERVER MEMBERS INTENT— для работы с участниками сервера
2Приглашение бота на сервер
Чтобы пригласить бота на свой сервер:
- В Developer Portal перейди в "OAuth2" → "URL Generator"
- В Scopes выбери
botиapplications.commands - В Bot Permissions выбери нужные права (для начала хватит
Send Messages,Read Message History) - Скопируй сгенерированную ссылку и открой её в браузере
- Выбери сервер и нажми "Authorize"
3Инициализация проекта
Создаём папку проекта и инициализируем npm:
mkdir my-discord-bot
cd my-discord-bot
npm init -y
Устанавливаем необходимые пакеты:
npm install discord.js dotenv
Структура проекта
4Настройка переменных окружения
Создай файл .env в корне проекта:
DISCORD_TOKEN=твой_токен_бота_сюда
CLIENT_ID=id_приложения
И не забудь добавить .gitignore:
node_modules/
.env
5Базовый код бота
Создай файл index.js:
const { Client, GatewayIntentBits, Collection } = require('discord.js');
require('dotenv').config();
// Создаём клиент с нужными intents
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent
]
});
// Коллекция для команд
client.commands = new Collection();
// Событие готовности бота
client.once('ready', () => {
console.log(`✅ Бот ${client.user.tag} запущен!`);
console.log(`📊 Серверов: ${client.guilds.cache.size}`);
});
// Обработка сообщений (префиксные команды)
client.on('messageCreate', async (message) => {
// Игнорируем ботов
if (message.author.bot) return;
const prefix = '!';
// Проверяем префикс
if (!message.content.startsWith(prefix)) return;
// Парсим команду и аргументы
const args = message.content.slice(prefix.length).trim().split(/ +/);
const command = args.shift().toLowerCase();
// Простые команды
if (command === 'ping') {
const latency = Date.now() - message.createdTimestamp;
await message.reply(`🏓 Понг! Задержка: ${latency}ms`);
}
if (command === 'привет') {
await message.reply(`Привет, ${message.author.username}! 👋`);
}
if (command === 'инфо') {
await message.reply({
embeds: [{
color: 0x5865F2,
title: '📊 Информация о боте',
fields: [
{ name: 'Серверов', value: `${client.guilds.cache.size}`, inline: true },
{ name: 'Пользователей', value: `${client.users.cache.size}`, inline: true },
{ name: 'Пинг', value: `${client.ws.ping}ms`, inline: true }
],
footer: { text: 'Создан с ❤️ на discord.js' }
}]
});
}
});
// Логин бота
client.login(process.env.DISCORD_TOKEN);
6Запуск бота
Запускаем бота командой:
node index.js
Если всё настроено правильно, увидишь в консоли:
✅ Бот MyBot#1234 запущен!
📊 Серверов: 1
7Slash-команды (современный способ)
Discord рекомендует использовать slash-команды вместо префиксных. Создадим файл для регистрации команд:
deploy-commands.js
const { REST, Routes, SlashCommandBuilder } = require('discord.js');
require('dotenv').config();
// Определяем команды
const commands = [
new SlashCommandBuilder()
.setName('ping')
.setDescription('Проверить задержку бота'),
new SlashCommandBuilder()
.setName('user')
.setDescription('Показать информацию о пользователе')
.addUserOption(option =>
option.setName('target')
.setDescription('Выбери пользователя')
),
new SlashCommandBuilder()
.setName('server')
.setDescription('Информация о сервере')
].map(command => command.toJSON());
// Регистрируем команды
const rest = new REST({ version: '10' }).setToken(process.env.DISCORD_TOKEN);
(async () => {
try {
console.log('🔄 Регистрация slash-команд...');
await rest.put(
Routes.applicationCommands(process.env.CLIENT_ID),
{ body: commands }
);
console.log('✅ Команды успешно зарегистрированы!');
} catch (error) {
console.error('❌ Ошибка:', error);
}
})();
Запусти регистрацию один раз:
node deploy-commands.js
Обработка slash-команд в index.js
Добавь обработчик в основной файл:
// Обработка slash-команд
client.on('interactionCreate', async (interaction) => {
if (!interaction.isChatInputCommand()) return;
const { commandName } = interaction;
if (commandName === 'ping') {
await interaction.reply(`🏓 Понг! Задержка: ${client.ws.ping}ms`);
}
if (commandName === 'user') {
const user = interaction.options.getUser('target') || interaction.user;
await interaction.reply({
embeds: [{
color: 0x5865F2,
title: `👤 ${user.username}`,
thumbnail: { url: user.displayAvatarURL({ dynamic: true, size: 256 }) },
fields: [
{ name: 'ID', value: user.id, inline: true },
{ name: 'Создан', value: user.createdAt.toLocaleDateString(), inline: true },
{ name: 'Бот?', value: user.bot ? 'Да' : 'Нет', inline: true }
]
}]
});
}
if (commandName === 'server') {
await interaction.reply({
embeds: [{
color: 0x5865F2,
title: `📊 ${interaction.guild.name}`,
thumbnail: { url: interaction.guild.iconURL({ dynamic: true, size: 256 }) },
fields: [
{ name: 'Участников', value: `${interaction.guild.memberCount}`, inline: true },
{ name: 'Создан', value: interaction.guild.createdAt.toLocaleDateString(), inline: true },
{ name: 'Владелец', value: `<@${interaction.guild.ownerId}>`, inline: true }
]
}]
});
}
});
8Держим бота онлайн
Для продакшена используй один из вариантов:
- PM2 — для запуска на VPS:
npm install -g pm2 pm2 start index.js --name "discord-bot" pm2 startup pm2 save - Railway.app — бесплатный хостинг для Node.js проектов
- Heroku — нужен добавить
Procfile:worker: node index.js
Полезные ресурсы
💡 Совет: Структурируй код! Выноси команды в отдельные файлы, используй обработчики событий и храни конфигурацию отдельно от логики.
Заключение
Теперь у тебя есть рабочий Discord бот! Это только начало — можно добавить музыку, модерацию, мини-игры, интеграцию с API и многое другое. Экспериментируй и создавай что-то уникальное! 🚀
← Назад к блогу