Bot Discord với trang web quản lý menu - Đăng nhập bảo mật bằng Discord OAuth2.
-
Discord Bot:
- Lệnh
/menuhiển thị embed menu chính với dropdown - Khi chọn item từ dropdown, hiển thị embed chi tiết
- Hỗ trợ đầy đủ tính năng Discord Embed (thumbnail, image, author, footer, fields)
- Lệnh
-
Trang web quản lý:
- ✅ Đăng nhập bảo mật bằng Discord OAuth2 - Không cần password!
- ✅ Whitelist User ID - Chỉ cho phép người dùng cụ thể truy cập
- Chỉnh sửa embed menu chính
- Quản lý danh sách dịch vụ (thêm/xóa/sửa)
- Upload ảnh lên Discord CDN
- Giao diện đơn giản, dễ sử dụng
Xem video hướng dẫn chi tiết: howtosetup.mp4
Video này sẽ hướng dẫn bạn từng bước:
- Cách tạo Discord Bot & OAuth Application
- Lấy các thông tin cần thiết (Token, Client ID, Client Secret, Guild ID, v.v.)
- Cấu hình file
.envđầy đủ
Đảm bảo bạn đã cài Node.js (phiên bản 16 trở lên)
npm install- Truy cập Discord Developer Portal
- Click New Application
- Đặt tên cho application (ví dụ: "Menu Bot")
- Click Create
- Vào tab Bot
- Click Add Bot → Yes, do it!
- Copy Bot Token (sẽ dùng cho
DISCORD_TOKEN) - Bật các Privileged Gateway Intents nếu cần
- Vào tab OAuth2 → General
- Copy Client ID (sẽ dùng cho
DISCORD_CLIENT_ID) - Copy Client Secret (sẽ dùng cho
DISCORD_CLIENT_SECRET) - Trong Redirects, thêm:
(Nếu hosting, thay
http://localhost:3000/auth/discord/callbacklocalhost:3000bằng domain của bạn)
- Vào tab OAuth2 → URL Generator
- Chọn Scopes:
- ✅
bot - ✅
applications.commands
- ✅
- Chọn Bot Permissions:
- ✅ Send Messages
- ✅ Attach Files
- ✅ Use Slash Commands
- Copy URL ở cuối trang và mở trong trình duyệt
- Chọn server và authorize
- Mở Discord
- Vào User Settings > Advanced > Bật Developer Mode
- Click phải vào server → Copy Server ID
- Tạo một channel riêng để lưu ảnh (ví dụ:
#bot-uploads) - Click phải vào channel → Copy Channel ID
- Click phải vào tên của bạn → Copy User ID
- Nếu muốn cho nhiều người, cách nhau bởi dấu phẩy
💡 Mẹo: Nếu chưa rõ cách lấy các thông tin, xem video hướng dẫn setup ở phần đầu!
Tạo file .env từ .env.example:
cp .env.example .envChỉnh sửa file .env:
# Discord Bot
DISCORD_TOKEN=MTIzNDU2Nzg5MDEyMzQ1Njc4OQ.GaBcDe.Fg123456789
GUILD_ID=123456789012345678
UPLOAD_CHANNEL_ID=987654321098765432
# Discord OAuth2
DISCORD_CLIENT_ID=123456789012345678
DISCORD_CLIENT_SECRET=abcdefghijklmnopqrstuvwxyz123456
DISCORD_CALLBACK_URL=http://localhost:3000/auth/discord/callback
# Web Dashboard
WEB_PORT=3000
# Session Secret (chuỗi ngẫu nhiên dài)
SESSION_SECRET=aB3xK9mP2nQrS7vW4yZ8cD1eF5gH6jL0
# Whitelist User ID (cách nhau bởi dấu phẩy)
ALLOWED_USER_IDS=123456789012345678,987654321098765432Quan trọng:
SESSION_SECRET: Tạo chuỗi ngẫu nhiên dài (có thể dùng lệnh:node -e "console.log(require('crypto').randomBytes(32).toString('hex'))")ALLOWED_USER_IDS: Danh sách Discord User ID được phép truy cập dashboardDISCORD_CALLBACK_URL: Nếu hosting, đổi thành domain của bạn (ví dụ:https://yourdomain.com/auth/discord/callback)
npm startBot sẽ khởi động và web server sẽ chạy tại http://localhost:3000
Trong server Discord, gõ lệnh:
/menu
Bot sẽ hiển thị:
- Embed menu chính với dropdown list
- Khi chọn một dịch vụ → hiển thị embed chi tiết của dịch vụ đó
- Truy cập
http://localhost:3000 - Click "Đăng nhập với Discord"
- Discord sẽ hỏi xác nhận → Click Authorize
- Nếu User ID của bạn trong
ALLOWED_USER_IDS→ Vào dashboard
Lưu ý: Chỉ những User ID trong ALLOWED_USER_IDS mới được vào dashboard!
Chỉnh sửa embed hiển thị khi gõ /menu:
- Tiêu đề, Mô tả, Màu sắc
- Thumbnail: Ảnh nhỏ góc phải
- Image: Ảnh lớn bên dưới
- Author: Tên tác giả với icon và link
- Footer: Text footer với icon
- Fields: Các trường thông tin bổ sung
Mỗi dịch vụ có 2 phần:
📌 Hiển thị trong Dropdown:
- Tên hiển thị
- Value (ID duy nhất)
- Mô tả ngắn (hiện trong dropdown)
- Emoji
📄 Nội dung Chi tiết: Khi user chọn dịch vụ, sẽ hiển thị embed với:
- Tiêu đề, Mô tả, Màu
- Thumbnail & Image
- Author & Footer
- Fields (có thể thêm nhiều fields)
Mọi trường hình ảnh đều có nút Upload:
- Click Upload
- Chọn file ảnh (PNG, JPG, GIF)
- Ảnh sẽ được upload lên Discord CDN
- URL tự động điền vào ô input
- Nhấn Lưu tất cả thay đổi
Lưu ý:
- Ảnh được lưu vào channel
UPLOAD_CHANNEL_IDtrong Discord - Giới hạn 10MB/file
- URL Discord CDN vĩnh viễn và nhanh
Click nút Đăng xuất ở góc trên bên phải dashboard.
✅ Không cần quản lý password - Discord lo việc đó ✅ Tự động có HTTPS - Discord xử lý đăng nhập qua HTTPS của họ ✅ Whitelist User ID - Chỉ cho phép người dùng cụ thể ✅ An toàn hơn - Không lo bị đánh cắp password ✅ Đơn giản hơn - 1 click đăng nhập
- User click "Đăng nhập với Discord"
- Discord yêu cầu xác nhận
- Sau khi đồng ý → Discord trả về thông tin user
- Server kiểm tra User ID có trong
ALLOWED_USER_IDSkhông - Nếu có → Cho vào dashboard
- Danh sách
ALLOWED_USER_IDSnên chỉ gồm owner/admin server SESSION_SECRETphải là chuỗi ngẫu nhiên mạnh- Nếu hosting public, nhớ đổi
DISCORD_CALLBACK_URLthành domain thật
Menu/
├── index.js # Entry point
├── bot.js # Discord bot logic
├── server.js # Express web server + Discord OAuth
├── config.json # Cấu hình embed và menu
├── package.json # Dependencies
├── .env # Biến môi trường (không commit)
├── .env.example # Template
├── .gitignore # Git ignore
├── public/
│ ├── login.html # Trang đăng nhập (Discord OAuth)
│ └── dashboard.html # Trang quản lý
├── uploads/ # Thư mục tạm cho upload (tự động tạo)
└── README.md # Hướng dẫn
- Đảm bảo bot đã được mời với scope
botvàapplications.commands - Kiểm tra
GUILD_IDtrong.env - Khởi động lại bot
Lỗi: "Bạn không có quyền truy cập dashboard này"
- Kiểm tra User ID của bạn có trong
ALLOWED_USER_IDSkhông - Lấy User ID: Click phải vào tên bạn trong Discord → Copy User ID
Lỗi: "Redirect URI mismatch"
- Vào Discord Developer Portal → OAuth2 → Redirects
- Thêm chính xác URL:
http://localhost:3000/auth/discord/callback - Kiểm tra
DISCORD_CALLBACK_URLtrong.envkhớp với URL đã thêm
Lỗi: "Invalid client_id or client_secret"
- Kiểm tra lại
DISCORD_CLIENT_IDvàDISCORD_CLIENT_SECRETtrong.env - Vào Discord Developer Portal → OAuth2 → General để lấy lại
- Kiểm tra
UPLOAD_CHANNEL_IDđã đúng chưa - Đảm bảo bot có quyền gửi tin nhắn + đính kèm file trong channel đó
- Kiểm tra kích thước file < 10MB
- Kiểm tra URL hình ảnh có hợp lệ không
- Màu sắc phải là hex code (ví dụ:
#0099ff) - Nếu để trống author.name hoặc footer.text, phần đó sẽ không hiển thị
Nếu muốn host lên VPS/Cloud:
-
Cập nhật Callback URL:
- Trong Discord Developer Portal → OAuth2 → Redirects, thêm:
https://yourdomain.com/auth/discord/callback - Cập nhật
.env:DISCORD_CALLBACK_URL=https://yourdomain.com/auth/discord/callback
- Trong Discord Developer Portal → OAuth2 → Redirects, thêm:
-
HTTPS:
- Nếu không có HTTPS, dùng Cloudflare hoặc reverse proxy (nginx + Let's Encrypt)
- Discord OAuth yêu cầu HTTPS cho production
-
Port:
- Đổi
WEB_PORTnếu cần (mặc định 3000)
- Đổi
MIT License - Copyright (c) 2025 gaucandy
Dự án này được phát hành dưới giấy phép MIT License, cho phép:
- Sử dụng cho mục đích thương mại
- Sửa đổi và phân phối tự do
- Sử dụng trong dự án private hoặc open source
Yêu cầu: Phải giữ thông tin copyright và credit cho tác giả gaucandy trong mọi bản sao hoặc phần quan trọng của phần mềm.
Xem chi tiết tại LICENSE