Discord боты — это отличный способ автоматизировать задачи на сервере, добавить интерактивность и развлечения для участников. В этом гайде мы создадим полноценного бота с нуля, используя Node.js и библиотеку discord.js.

Что понадобится

1Создание приложения в Discord

Первым делом нужно зарегистрировать бота в Discord Developer Portal:

  1. Перейди на discord.com/developers/applications
  2. Нажми "New Application" и введи имя бота
  3. Перейди в раздел "Bot" в левом меню
  4. Нажми "Add Bot""Yes, do it!"
  5. Нажми "Reset Token" и скопируй токен бота — храни его в секрете!
⚠️ Важно: Никогда не публикуй токен бота! Если он попал в открытый доступ, немедленно сбрось его в Developer Portal.

Настройка Intents

В разделе "Bot" прокрути вниз до "Privileged Gateway Intents" и включи нужные права:

  • MESSAGE CONTENT INTENT — если бот будет читать содержимое сообщений
  • SERVER MEMBERS INTENT — для работы с участниками сервера

2Приглашение бота на сервер

Чтобы пригласить бота на свой сервер:

  1. В Developer Portal перейди в "OAuth2""URL Generator"
  2. В Scopes выбери bot и applications.commands
  3. В Bot Permissions выбери нужные права (для начала хватит Send Messages, Read Message History)
  4. Скопируй сгенерированную ссылку и открой её в браузере
  5. Выбери сервер и нажми "Authorize"

3Инициализация проекта

Создаём папку проекта и инициализируем npm:

mkdir my-discord-bot
cd my-discord-bot
npm init -y

Устанавливаем необходимые пакеты:

npm install discord.js dotenv

Структура проекта

📁 my-discord-bot/
├── 📄 .env
├── 📄 .gitignore
├── 📄 index.js
├── 📄 package.json
└── 📁 commands/
└── 📄 ping.js

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 и многое другое. Экспериментируй и создавай что-то уникальное! 🚀

Назад к блогу