Tạo bot Discord đầu tiên bằng discord.js: lệnh slash và phản hồi tin nhắn

  • author-image

    Nguyễn Đình Cường

  • blog-tag
  • blog-comment 0 comment
  • created-date 09 Nov, 2026
blog-thumbnail

Bot Discord có thể chào thành viên mới, trả lời lệnh, quản lý kênh hay phát nhạc. Với Node.js và thư viện discord.js, bạn có thể làm bot đầu tiên chỉ trong khoảng một giờ. Bài này hướng dẫn tạo ứng dụng bot, mời vào máy chủ thử nghiệm và viết lệnh slash đơn giản.

Bước 1: Tạo ứng dụng bot

  1. Truy cập Discord Developer Portal và đăng nhập tài khoản Discord của bạn.
  2. Chọn New Application, đặt tên cho ứng dụng.
  3. Vào mục Bot, bấm Reset Token để lấy token. Hãy xem token như mật khẩu: chỉ hiển thị một lần, không chia sẻ, không đưa lên Git. Nếu lỡ lộ, hãy tạo lại token ngay.
  4. Ghi lại Application ID (ở mục General Information) để dùng đăng ký lệnh.

Bước 2: Mời bot vào máy chủ thử nghiệm

Hãy tạo một máy chủ Discord riêng chỉ để thử nghiệm. Trong mục OAuth2 > URL Generator, chọn phạm vi (scope) bot và applications.commands, cấp quyền tối thiểu cần thiết như gửi tin nhắn. Mở đường dẫn được tạo ra và chọn máy chủ để mời bot. Nguyên tắc quyền tối thiểu giúp hạn chế rủi ro nếu bot bị lợi dụng.

Bước 3: Khởi tạo dự án

Cần Node.js phiên bản đủ mới theo yêu cầu của discord.js (xem tài liệu chính thức). Tạo dự án:

mkdir my-bot
cd my-bot
npm init -y
npm install discord.js dotenv

Tạo file .env chứa thông tin bí mật và thêm nó vào .gitignore:

DISCORD_TOKEN=dán_token_của_bạn
CLIENT_ID=dán_application_id
GUILD_ID=id_máy_chủ_thử_nghiệm

Bạn lấy GUILD_ID bằng cách bật Developer Mode trong cài đặt Discord rồi chuột phải vào tên máy chủ chọn Copy Server ID.

Bước 4: Đăng ký lệnh slash

Lệnh slash phải được đăng ký với Discord. Tạo file deploy-commands.js:

require('dotenv').config();
const { REST, Routes, SlashCommandBuilder } = require('discord.js');

const commands = [
  new SlashCommandBuilder()
    .setName('ping')
    .setDescription('Kiểm tra bot còn sống không'),
  new SlashCommandBuilder()
    .setName('chao')
    .setDescription('Bot chào bạn')
    .addStringOption((opt) =>
      opt.setName('ten').setDescription('Tên của bạn').setRequired(false)
    ),
].map((c) => c.toJSON());

const rest = new REST().setToken(process.env.DISCORD_TOKEN);

(async () => {
  await rest.put(
    Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID),
    { body: commands }
  );
  console.log('Đã đăng ký lệnh.');
})();

Chạy node deploy-commands.js một lần mỗi khi bạn đổi danh sách lệnh. Đăng ký theo máy chủ (guild) có hiệu lực gần như tức thì, thích hợp để thử; đăng ký toàn cục có thể mất thời gian để lan truyền.

Bước 5: Viết bot

Tạo file index.js:

require('dotenv').config();
const { Client, Events, GatewayIntentBits } = require('discord.js');

const client = new Client({ intents: [GatewayIntentBits.Guilds] });

client.once(Events.ClientReady, (c) => {
  console.log('Đã đăng nhập với tên ' + c.user.tag);
});

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isChatInputCommand()) return;

  if (interaction.commandName === 'ping') {
    await interaction.reply('Pong!');
  } else if (interaction.commandName === 'chao') {
    const name = interaction.options.getString('ten') ?? interaction.user.username;
    await interaction.reply('Xin chào ' + name + '!');
  }
});

client.login(process.env.DISCORD_TOKEN);

Chạy node index.js, rồi vào máy chủ thử nghiệm gõ /ping hoặc /chao. Discord yêu cầu phản hồi trong khoảng 3 giây; với tác vụ lâu hơn, dùng interaction.deferReply() rồi editReply sau.

Về đọc nội dung tin nhắn

Để bot đọc nội dung tin nhắn thường (không phải lệnh slash), cần bật intent MessageContent trong Developer Portal và thêm vào mã. Đây là intent đặc quyền và Discord khuyến khích dùng lệnh slash khi có thể, vừa thân thiện vừa tôn trọng quyền riêng tư.

Lỗi thường gặp

  • Lệnh không hiện: chưa chạy bước đăng ký, hoặc bot chưa được mời với scope applications.commands.
  • Lỗi token không hợp lệ: sai token hoặc đã bị đặt lại.
  • Lỗi Missing Access/Permissions: bot thiếu quyền ở kênh đó.
  • Bot offline: tiến trình Node đã dừng, bot chỉ online khi chương trình còn chạy.

Cho bot chạy liên tục

Khi muốn bot trực tuyến 24/7, chạy nó trên VPS bằng trình quản lý tiến trình như PM2 hoặc đóng gói với Docker.

Kết luận

Bạn đã tạo bot, cấu hình quyền, đăng ký lệnh và xử lý tương tác. Từ đây có thể thêm nút bấm, menu chọn, cơ sở dữ liệu và những lệnh hữu ích cho cộng đồng của bạn.

Nếu muốn học JavaScript và Node.js bài bản để làm bot và nhiều ứng dụng khác, hãy xem các khóa học tại codebem.com.

author_photo
Nguyễn Đình Cường

0 comment