Как написать собственного бота в discord

Как написать собственного бота в discord

Discord предоставляет мощный API и удобную среду для создания собственных ботов, способных автоматизировать задачи, управлять сообществом, интегрироваться с внешними сервисами. Чтобы начать, необходима регистрация приложения через Discord Developer Portal, где создаётся бот, настраиваются права и генерируется токен авторизации.

Для разработки используется язык JavaScript или Python. Один из самых популярных инструментов – библиотека discord.js (для Node.js), обеспечивающая удобную работу с событиями, сообщениями, ролями, каналами. Альтернатива на Python – discord.py, также активно используется в проектах с логикой серверной автоматизации и интеграцией ИИ-сервисов.

Перед написанием кода необходимо установить зависимости: например, npm install discord.js или pip install -U discord.py. После этого создаётся основной скрипт, где инициализируется клиент, подписываются события и прописываются команды. Важно обеспечить безопасность токена, исключая его из публичного репозитория и используя переменные окружения.

Разработка не ограничивается отправкой сообщений. Бот может реагировать на события сервера, взаимодействовать с API внешних сервисов, обрабатывать реакции, работать с базой данных, применять вебхуки. Для полноценной работы важно настроить intents – разрешения, определяющие, какие события доступны боту, и обеспечить хостинг, например через Render, Railway или VPS.

Создание собственного бота для Discord: пошаговое руководство

Создание собственного бота для Discord: пошаговое руководство

Установите Node.js актуальной версии с официального сайта. Проверьте установку командой node -v в терминале. Убедитесь, что установлен npm, выполнив npm -v.

Создайте новый проект, выполнив mkdir my-discord-bot && cd my-discord-bot, затем инициализируйте его командой npm init -y.

Установите библиотеку discord.js: npm install discord.js. Она обеспечивает интерфейс для взаимодействия с Discord API.

На сайте Discord (https://discord.com/developers/applications) создайте новое приложение. Перейдите в раздел «Bot», нажмите «Add Bot», затем сохраните токен, нажав «Reset Token» и скопировав его. Никому не передавайте токен.

Выдайте боту нужные права. Перейдите в раздел «OAuth2» → «URL Generator». Отметьте «bot» в «scopes» и укажите разрешения, например: «Send Messages», «Manage Messages», «Read Message History». Скопируйте сгенерированную ссылку и пригласите бота на нужный сервер.

Создайте файл index.js со следующим кодом:

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] });
client.once('ready', () => {
console.log(`Бот запущен как ${client.user.tag}`);
});
client.on('messageCreate', message => {
if (message.content === '!ping') {
message.channel.send('Pong!');
}
});
client.login('ВАШ_ТОКЕН');

Вставьте свой токен в client.login(). Никогда не публикуйте файл с токеном в открытом доступе. Для безопасности используйте переменные окружения и пакет dotenv.

Запустите бота командой node index.js. Убедитесь, что бот онлайн и реагирует на команды в чате.

Для постоянной работы используйте процесс-менеджер, например pm2, и настройте автоматический перезапуск при сбоях: pm2 start index.js --name discord-bot.

Регистрация приложения и получение токена в Discord Developer Portal

Регистрация приложения и получение токена в Discord Developer Portal

Для создания Discord-бота необходимо зарегистрировать приложение и получить токен авторизации. Это выполняется через Discord Developer Portal.

  1. Авторизуйтесь в Discord Developer Portal с помощью своей учетной записи Discord.
  2. Нажмите кнопку “New Application”.
  3. Введите уникальное имя приложения. Оно будет отображаться как имя вашего бота. Нажмите “Create”.
  4. Перейдите в раздел “Bot” в боковом меню.
  5. Нажмите “Add Bot”“Yes, do it!”, чтобы создать объект бота на основе вашего приложения.
  6. В этом же разделе нажмите кнопку “Reset Token” и подтвердите действие. Скопируйте сгенерированный токен. Он нужен для подключения бота к API Discord.

Важно: токен – это ключ доступа к вашему боту. Не публикуйте его в открытых источниках. При утечке немедленно выполните “Reset Token”.

Для обеспечения безопасности рекомендуется хранить токен в переменных окружения или использовать файл конфигурации, недоступный для загрузки в репозиторий.

Настройка прав доступа и добавление бота на сервер

Для добавления бота в Discord-сервер требуется OAuth2-ссылка с корректно заданными параметрами. Перейдите в Discord Developer Portal, выберите нужное приложение и откройте вкладку OAuth2 → URL Generator.

В разделе Scopes установите флажок bot. Ниже в разделе Bot Permissions выберите только необходимые права. Пример для музыкального бота: Connect, Speak, Use Voice Activity, Read Messages/View Channels, Send Messages. Избегайте установки лишних прав, особенно Administrator, если они не критичны для работы.

Скопируйте сгенерированную ссылку и откройте её в браузере. Выберите сервер, на который у вас есть право управлять приложениями, и подтвердите добавление. После этого бот появится в списке участников сервера, но по умолчанию его роль может не обладать нужными правами.

Откройте настройки сервера → Роли, найдите роль бота и вручную проверьте включение всех требуемых разрешений. Если бот выполняет команды только в отдельных каналах, используйте настройки прав на уровне каналов. Отключите доступ к каналам, где он не должен работать, сняв флажки для соответствующей роли.

Для точного контроля используйте комбинацию основной роли и прав каналов. Избегайте дублирования прав через несколько ролей, чтобы не усложнять отладку доступа. Изменения вступают в силу немедленно, перезагрузка бота не требуется.

Установка Node.js и создание проекта на JavaScript

Скачайте актуальную версию Node.js с официального сайта nodejs.org. Рекомендуется выбрать LTS-версию для стабильной работы. После установки проверьте корректность с помощью команд:

  • node -v – проверка версии Node.js
  • npm -v – проверка версии npm

Создайте отдельную директорию для проекта:

mkdir discord-bot
cd discord-bot

Инициализируйте новый проект:

npm init -y

Будет создан файл package.json с базовыми настройками. Убедитесь, что структура проекта не содержит лишних файлов. Создайте основной файл бота:

touch index.js

Добавьте в проект зависимости, необходимые для работы с Discord API:

npm install discord.js dotenv

Создайте файл .env в корне проекта для хранения токена бота:

BOT_TOKEN=ваш_токен

Добавьте в .gitignore строку .env, чтобы исключить файл из системы контроля версий:

echo .env >> .gitignore

Проект готов к написанию кода бота. Структура на этом этапе:

  • index.js
  • .env
  • .gitignore
  • package.json
  • node_modules/

Подключение библиотеки discord.js и инициализация клиента

Подключение библиотеки discord.js и инициализация клиента

Убедитесь, что установлен Node.js версии не ниже 16.9.0. Проверить текущую версию можно командой:

node -v

Инициализируйте проект:

npm init -y

Установите discord.js:

npm install discord.js

Создайте файл index.js в корне проекта. Подключите библиотеку и создайте экземпляр клиента:

const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent
]
});

Для авторизации клиента вставьте токен бота из Discord Developer Portal:

client.login('ВАШ_ТОКЕН_БОТА');

Добавьте обработчик события готовности, чтобы убедиться в успешном запуске:

client.once('ready', () => {
console.log(`Бот запущен как ${client.user.tag}`);
});

Файл должен запускаться командой:

node index.js

Если клиент успешно авторизован, консоль выведет имя и тег бота. В противном случае проверьте токен и список указанных интентов в настройках приложения.

Обработка команд с префиксом и взаимодействие с пользователем

Обработка команд с префиксом и взаимодействие с пользователем

Пример базовой структуры для обработки команд:

client.on('messageCreate', message => {
if (message.author.bot || !message.content.startsWith('!')) return;
const args = message.content.slice(1).trim().split(/\s+/);
const command = args.shift().toLowerCase();
if (command === 'ping') {
message.reply('Pong!');
}
if (command === 'say') {
const text = args.join(' ');
if (!text) {
return message.reply('Укажите текст для отправки.');
}
message.channel.send(text);
}
});

Рекомендации по организации команд:

Создайте отдельную папку commands, где каждая команда будет модулем. Это обеспечит масштабируемость.

// commands/ping.js
module.exports = {
name: 'ping',
execute(message) {
message.reply('Pong!');
}
};

Загрузка команд автоматически:

const fs = require('fs');
const commands = new Map();
fs.readdirSync('./commands').forEach(file => {
const command = require(`./commands/${file}`);
commands.set(command.name, command);
});
client.on('messageCreate', message => {
if (message.author.bot || !message.content.startsWith('!')) return;
const args = message.content.slice(1).trim().split(/\s+/);
const commandName = args.shift().toLowerCase();
const command = commands.get(commandName);
if (!command) return;
command.execute(message, args);
});

Взаимодействие с пользователем:

Используйте message.reply() для прямых ответов. Для интерактивности – реакции, ожидание ответов (message.channel.awaitMessages), или компоненты (Buttons, SelectMenus) в версии discord.js v14 и выше.

Пример запроса и ожидания ответа:

message.reply('Введите ваше имя:');
const filter = m => m.author.id === message.author.id;
message.channel.awaitMessages({ filter, max: 1, time: 15000, errors: ['time'] })
.then(collected => {
const name = collected.first().content;
message.channel.send(`Приятно познакомиться, ${name}!`);
})
.catch(() => {
message.channel.send('Вы не ответили вовремя.');
});

Для безопасности проверяйте права пользователя перед выполнением чувствительных команд и логируйте действия, чтобы упростить отладку и управление ботом.

Хранение данных и работа с файлами или базами данных

Хранение данных и работа с файлами или базами данных

Для хранения пользовательских настроек, статистики или логов бота можно использовать файлы или базы данных. Выбор зависит от масштабов проекта и требований к производительности.

Файлы подойдут для небольших проектов. JSON – самый распространённый формат, так как легко читается и парсится:

const fs = require('fs');
let data = JSON.parse(fs.readFileSync('data.json', 'utf8'));
data[userId] = { score: 10 };
fs.writeFileSync('data.json', JSON.stringify(data, null, 2));

Недостатки: отсутствие конкурентного доступа, риск потери данных при одновременной записи, сложность масштабирования.

SQLite – простой вариант встраиваемой базы данных без сервера. Используется через npm-пакеты sqlite3 или better-sqlite3. Пример:

const Database = require('better-sqlite3');
const db = new Database('bot.db');
db.prepare('CREATE TABLE IF NOT EXISTS scores (user TEXT PRIMARY KEY, points INTEGER)').run();
db.prepare('INSERT OR REPLACE INTO scores (user, points) VALUES (?, ?)').run(userId, 10);

SQLite обеспечивает атомарность и работает быстрее, чем работа с файлами, особенно при большом числе запросов.

PostgreSQL или MongoDB – выбор для продвинутых ботов с большим количеством данных. PostgreSQL – надёжная реляционная СУБД с поддержкой транзакций и связей. MongoDB – документоориентированная NoSQL-база, хорошо подходит для гибких схем.

Для подключения к PostgreSQL используйте pg:

const { Client } = require('pg');
const client = new Client({ connectionString: process.env.DATABASE_URL });
await client.connect();
await client.query('INSERT INTO scores(user, points) VALUES($1, $2)', [userId, 10]);

Для MongoDB – mongoose:

const mongoose = require('mongoose');
mongoose.connect(process.env.MONGO_URI);
const UserSchema = new mongoose.Schema({ user: String, points: Number });
const User = mongoose.model('User', UserSchema);
await User.updateOne({ user: userId }, { points: 10 }, { upsert: true });

Рекомендации:

  • Используйте базу данных, если данные часто изменяются или доступны множеству пользователей одновременно.
  • Изолируйте работу с хранилищем в отдельный модуль.
  • Резервное копирование – обязательная часть инфраструктуры при использовании СУБД.
  • Храните чувствительные данные (токены, пароли) в переменных окружения, не в файлах проекта.

Развёртывание бота на хостинге для постоянной работы

Для круглосуточной работы Discord-бота необходим внешний сервер. Оптимальный вариант – VPS (Virtual Private Server) с предустановленной ОС Linux (например, Ubuntu 22.04). Рекомендуемые параметры: 1 ГБ RAM, 1 CPU, 10 ГБ SSD. Среди популярных провайдеров – Hetzner, DigitalOcean, Timeweb Cloud.

После аренды сервера подключитесь к нему через SSH:

ssh root@IP_сервера

Установите Node.js (если бот написан на JavaScript/TypeScript):

curl -fsSL https://deb.nodesource.com/setup_20.x | bash -

apt install -y nodejs

Загрузите файлы бота на сервер с помощью SCP или Git:

git clone https://github.com/ваш-репозиторий.git

или

scp -r ./папка_бота root@IP_сервера:/root/

Установите зависимости:

cd папка_бота

npm install

Создайте .env-файл (если используется) и пропишите токен и другие переменные.

Установите и настройте процесс-менеджер PM2:

npm install -g pm2

pm2 start index.js --name bot

pm2 save

pm2 startup

Команда pm2 startup сгенерирует строку, которую необходимо выполнить, чтобы обеспечить автозапуск бота после перезагрузки сервера.

Проверьте статус:

pm2 list

Для логирования используйте:

pm2 logs bot

Настройте брандмауэр (ufw) для защиты:

ufw allow OpenSSH

ufw enable

После завершения всех шагов бот будет работать непрерывно, независимо от вашего локального компьютера.

Вопрос-ответ:

Какие шаги нужно выполнить для создания собственного бота в Discord с нуля?

Сначала необходимо зарегистрировать приложение на портале Discord Developer, после чего создать бота и получить его токен. Далее следует выбрать язык программирования и установить нужные библиотеки для работы с Discord API. Затем пишется основной код бота — прописываются команды и реакции на события. После этого бот нужно запустить и добавить на сервер с помощью ссылки приглашения, сформированной на основе ID приложения и разрешений.

Как обеспечить безопасность токена бота и почему это важно?

Токен бота — это уникальный ключ доступа, который позволяет управлять ботом через Discord API. Если токен попадёт в чужие руки, злоумышленники смогут использовать бота в своих целях, что может привести к блокировке или другим проблемам. Чтобы защитить токен, его не нужно выкладывать в публичных репозиториях и файлах, доступных другим. Обычно токен хранят в файлах конфигурации, которые исключают из публикации, или используют переменные окружения.

Какие библиотеки для разработки Discord-ботов на Python считаются удобными и почему?

Одна из самых популярных библиотек — discord.py. Она предоставляет удобный интерфейс для работы с API Discord, позволяет легко создавать команды, обрабатывать события и поддерживает асинхронное программирование, что улучшает производительность. Ещё есть альтернативы, например, pycord или nextcord, которые основаны на discord.py и предлагают дополнительные функции или исправления, но для начинающих лучше начинать с оригинальной discord.py из-за большой базы примеров и активного сообщества.

Как добавить команду к боту, чтобы он отвечал на определённые сообщения пользователей?

В коде бота нужно зарегистрировать обработчик команд. Например, с использованием discord.py это можно сделать через декоратор @bot.command(). Внутри такой функции прописывается логика ответа — бот проверяет введённое пользователем слово или фразу и отправляет ответное сообщение. При этом можно использовать параметры команды для более гибкой работы, например, чтобы бот принимал аргументы и реагировал в зависимости от них.

Что делать, если бот перестал отвечать на команды после обновления Discord API?

Часто после изменений в API или обновлений библиотек некоторые функции могут перестать работать из-за изменений в способах аутентификации, новых требований к правам или формату сообщений. В таком случае нужно проверить документацию актуальной версии API и библиотеки, обновить библиотеку до последней версии, а также проверить, правильно ли настроены права доступа у бота на сервере. Если проблема сохраняется, полезно обратиться к сообществу разработчиков или официальным форумам для получения рекомендаций по исправлению.

Ссылка на основную публикацию