Cum faci un bot de Discord în JavaScript (discord.js)

Fă de la zero un bot de Discord în JavaScript cu discord.js și Node.js: creezi aplicația, scrii comenzi slash, adaugi un mesaj de bun venit, îl testezi local și îl găzduiești gratuit pe Torchlite.

4 min de cititDe Echipa TorchliteActualizat

Cum faci un bot de Discord în JavaScript (discord.js)
Pe această pagină

Tutorialul ăsta construiește în JavaScript, cu discord.js pe Node.js, un bot de Discord mic, dar adevărat: două comenzi slash, /hello și /add, și un mesaj care îi întâmpină pe membrii noi. Îl testezi pe calculatorul tău, apoi îl pui pe un server Bot gratuit pe Torchlite, ca să rămână online fără calculatorul tău.

Îți trebuie Node.js 22 sau mai nou și un cont de Discord. Nu ai nevoie de experiență cu boți.

Creează botul în Discord

  1. Deschide Discord Developer Portal și apasă New Application. Numele pe care i-l dai e numele botului.
  2. Deschide Bot din meniul din stânga și apasă Reset Token. Copiază token-ul și ține-l într-un loc privat.
  3. Mai jos, pe aceeași pagină, pornește Server Members Intent. Mesajul de bun venit are nevoie de el; comenzile slash nu.
  4. Deschide OAuth2, apoi URL Generator. Bifează bot și applications.commands, iar la Bot Permissions bifează Send Messages.
  5. Deschide URL-ul generat, alege serverul tău de Discord și apasă Authorize.

Pregătește proiectul

Fă un folder pentru bot și instalează discord.js în el:

bash
npm init -y
npm install discord.js

Asta creează package.json, care trece discord.js ca dependență, și un folder node_modules pe care nu-l urci și nu-l pui niciodată în Git.

Scrie botul

Creează index.js:

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

const client = new Client({
    // Guilds is enough for slash commands; GuildMembers adds join events
    // and is switched on in the portal.
    intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
});

const commands = [
    new SlashCommandBuilder().setName('hello').setDescription('Say hello'),
    new SlashCommandBuilder()
        .setName('add')
        .setDescription('Add two numbers')
        .addIntegerOption((o) => o.setName('a').setDescription('The first number').setRequired(true))
        .addIntegerOption((o) => o.setName('b').setDescription('The second number').setRequired(true)),
];

client.once(Events.ClientReady, async (ready) => {
    // Sends the slash commands to Discord once, at startup.
    await ready.application.commands.set(commands.map((c) => c.toJSON()));
    console.log(`Online as ${ready.user.tag} in ${ready.guilds.cache.size} server(s).`);
});

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

    if (interaction.commandName === 'hello') {
        await interaction.reply(`Hello, ${interaction.user}!`);
    } else if (interaction.commandName === 'add') {
        const a = interaction.options.getInteger('a');
        const b = interaction.options.getInteger('b');
        await interaction.reply(`${a} + ${b} = ${a + b}`);
    }
});

client.on(Events.GuildMemberAdd, async (member) => {
    const channel = member.guild.systemChannel;
    if (channel) await channel.send(`Welcome to ${member.guild.name}, ${member}!`);
});

client.login(process.env.DISCORD_TOKEN);

Ce face fiecare parte:

  • Intent-urile îi spun lui Discord ce evenimente vrea botul. Guilds acoperă comenzile slash; GuildMembers adaugă evenimentele de intrare pe server.
  • SlashCommandBuilder descrie fiecare comandă și opțiunile ei. commands.set le înregistrează la Discord când botul e gata.
  • InteractionCreate se declanșează când cineva folosește o comandă. options.getInteger citește numerele, deja verificate de Discord.
  • GuildMemberAdd rulează când intră cineva și scrie în canalul de sistem al serverului, cel setat la Server Settings, Overview.
  • Token-ul vine din variabila de mediu DISCORD_TOKEN, niciodată din cod.

Poți traduce în română textele pe care le trimite botul, de exemplu Hello în Salut; restul codului rămâne la fel.

Rulează-l pe calculator

Setează token-ul pentru sesiunea asta de terminal, apoi pornește botul. Pe macOS sau Linux:

bash
export DISCORD_TOKEN="paste-your-token-here"
node index.js

În Windows PowerShell:

powershell
$env:DISCORD_TOKEN="paste-your-token-here"
node index.js

Terminalul afișează Online as YourBot#1234 in 1 server(s). Scrie / pe serverul tău de Discord și apar cele două comenzi. Prima dată, comenzile slash pot avea nevoie de câteva minute ca să apară.

Găzduiește-l gratuit pe Torchlite

Botul se oprește imediat ce închizi terminalul. Ca să rămână pornit:

  1. Pe Creează serverul, alege planul Bot și Discord bot (Node.js).
  2. În panel, deschide Startup și pune token-ul în Bot token.
  3. Deschide Files, șterge fișierele botului de start și urcă-ți index.js și package.json, fără node_modules. Verifică la Startup că Main file e index.js.
  4. Apasă Start în Console. Serverul instalează discord.js din package.json și îți pornește botul.

Ca să faci deploy din GitHub, încât un push și un restart să fie tot deploy-ul, urmează ghidul pentru boți de Discord. Planul Bot dă 512 MB RAM și îți cere un Renew o dată la 24 de ore; hostingul pentru boți de Discord are detaliile.

Ține-l sănătos

Câteva obiceiuri te scapă de cele mai multe probleme odată ce botul e folosit de oameni reali:

  • Răspunde în 3 secunde. Discord afișează „The application did not respond” dacă o comandă nu e confirmată la timp. Pentru orice operație lentă, ca o cerere web sau o interogare în baza de date, apelează întâi await interaction.deferReply(), apoi trimite rezultatul cu await interaction.editReply(...).
  • Prinde erorile la fiecare comandă. Pune codul riscant în try și catch și răspunde cu un mesaj scurt, în loc să lași comanda să eșueze fără niciun semn. Scrie eroarea cu console.error, ca să apară în Console din panel.
  • Ține datele pe disc, nu în memorie. Tot ce e în variabilele JavaScript se pierde când botul repornește, iar pe un server gratuit repornește de fiecare dată când se ratează o reînnoire. Păstrează ce contează în baza de date MySQL sau într-un fișier SQLite.
  • Nu inunda canalele. Multe mesaje trimise într-o buclă se lovesc de limitele Discord; discord.js le pune la coadă, dar între timp botul pare blocat. Strânge textul într-un singur mesaj.
  • Urmărește memoria. 512 MB ajung din plin, dar dacă ții în memorie fiecare membru al unui server mare, se adună. Cere doar intent-urile pe care chiar le folosești.

Ce urmează

  • Mai multe comenzi: adaugă încă un builder în commands și încă o ramură în InteractionCreate. Există opțiuni pentru texte, numere, utilizatori, roluri și canale.
  • Comenzi doar pentru admini: adaugă .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) la un builder, importând PermissionFlagsBits din discord.js.
  • O bază de date: serverul tău Bot include o bază de date MySQL, sau păstrează lucrurile simple cu un fișier SQLite.
  • Împarte codul: când fișierul crește, pune fiecare comandă în fișierul ei și încarcă-le dintr-un folder, cum arată ghidul discord.js.

Probleme frecvente

„An invalid token was provided” sau TokenInvalid

Variabila de mediu e goală sau are un spațiu în ea, sau pe Torchlite câmpul Bot token e gol. Copiază din nou token-ul și repornește.

„Used disallowed intents”

Codul cere GuildMembers, dar Server Members Intent e oprit în Developer Portal. Pornește-l, sau șterge GuildMembers și mesajul de bun venit.

Comenzile slash nu apar

Așteaptă câteva minute după prima pornire și verifică dacă URL-ul de invitare a inclus applications.commands. Repornește botul o dată.

Te-ai blocat la un pas?

Întreabă pe forum. Întrebarea ta trimite înapoi la ghid, ca cine răspunde să știe unde ai rămas.

Întreabă despre ghid

Despre autor

Echipa Torchlite

Oamenii care administrează Torchlite

Construim și administrăm panelul Torchlite și nodurile. Fiecare ghid e verificat pe serverele noastre înainte să apară și actualizat când se schimbă panelul.

Ai găsit o greșeală? Spune-ne pe Discord

Ghiduri similare

Toate ghidurile →