Hướng dẫn này đi qua việc tạo khóa Noxyr Server API, gọi sáu endpoint từ Node.js và trình duyệt, và đưa dữ liệu Discord trực tiếp lên một trang công khai. Nếu bạn từng muốn có một bộ đếm thành viên thực trên website, cập nhật mà không cần kết nối bot, thì đây chính là thứ đó.

A key is generated, a curl request is sent, and the JSON response renders as live text on a page. 1 nxr_••••••••• 2 curl /api/v1/server 3 { memberCount: 812 } 812 members online

Bước 1: Tạo khóa

Mở bảng điều khiển Noxyr, chọn máy chủ của bạn và vào API Access. Bấm Generate API Key. Khóa (bắt đầu bằng nxr_) chỉ được hiển thị một lần, hãy sao chép ngay vào một biến môi trường. Phía máy chủ chỉ lưu băm SHA-256, nên nếu làm mất khóa thì phải tạo lại.

Bước 2: Đặt phạm vi quyền

Bên dưới khóa, sáu công tắc kiểm soát những gì khóa có thể đọc: Server Overview, Tickets, Activity, Invoices, Reviews, Giveaways. Tắt bất cứ thứ gì bạn không cần; một phạm vi bị tắt sẽ trả về 403 ngay lập tức, nên một khóa bị lộ vẫn không thể đọc các phạm vi bạn chưa bật.

Bước 3: Kiểm tra nhanh bằng curl

curl https://noxyrbot.com/api/v1/server \
  -H "Authorization: Bearer nxr_YOUR_KEY"

Bạn sẽ thấy JSON với id máy chủ, tên, URL biểu tượng, số thành viên, số người online và số lượt boost.

Bước 4: Gọi từ Node.js

const KEY = process.env.NOXYR_API_KEY;

async function getStats() {
    const [server, tickets, activity] = await Promise.all([
        fetch('https://noxyrbot.com/api/v1/server',              { headers: { Authorization: `Bearer ${KEY}` } }),
        fetch('https://noxyrbot.com/api/v1/tickets',             { headers: { Authorization: `Bearer ${KEY}` } }),
        fetch('https://noxyrbot.com/api/v1/activity?days=7',     { headers: { Authorization: `Bearer ${KEY}` } })
    ]);
    return {
        server:   await server.json(),
        tickets:  await tickets.json(),
        activity: await activity.json()
    };
}

getStats().then(console.log);

Bước 5: Gọi từ trình duyệt

CORS đã được mở, nên bạn có thể fetch trực tiếp từ một trang tĩnh. Không nhúng khóa vào mã phía client được gửi tới người dùng thật: bất kỳ ai mở DevTools đều sẽ thấy nó. Hai cách an toàn:

  • Bảng điều khiển công khai đứng sau proxy: một hàm serverless nhỏ phía bạn đọc khóa từ biến môi trường, gọi Noxyr và chuyển tiếp JSON cho trình duyệt.
  • Công cụ nội bộ đáng tin cậy: đặt trang sau lớp xác thực của riêng bạn, rồi mới đưa khóa vào.
// Cloudflare Worker / Vercel Edge - key stays on the server
export default {
    async fetch(request, env) {
        const upstream = await fetch('https://noxyrbot.com/api/v1/server', {
            headers: { Authorization: `Bearer ${env.NOXYR_API_KEY}` }
        });
        return new Response(await upstream.text(), {
            headers: { 'content-type': 'application/json', 'cache-control': 'public, max-age=60' }
        });
    }
};

Bước 6: Hiển thị

<div id="members">…</div>
<script>
    fetch('/api/live-server-stats')
        .then((r) => r.json())
        .then((data) => {
            document.getElementById('members').textContent =
                `${data.memberCount.toLocaleString()} members · ${data.onlineCount} online`;
        });
</script>

Giới hạn tốc độ và bộ nhớ đệm

60 yêu cầu mỗi phút cho mỗi khóa. Thời gian thực rất tuyệt trên bảng điều khiển riêng nhưng lãng phí trên một trang công khai; hãy lưu phản hồi từ phía trên trong bộ nhớ đệm 30–60 giây ở lớp proxy của bạn và bạn sẽ không bao giờ chạm đến giới hạn.

Phản hồi lỗi

  • 401 unauthorized: thiếu hoặc sai khóa.
  • 403 key_disabled: khóa đã bị tắt trên bảng điều khiển.
  • 403 scope_disabled: phạm vi của endpoint đã bị tắt; hãy sửa trên bảng điều khiển.
  • 404 guild_unavailable: bot đã bị xóa khỏi máy chủ đó.
  • 429 rate_limited: hãy chậm lại.

Muốn biết vì sao API có cấu trúc như vậy? Nguyên tắc thiết kế API cho bot Discord.