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
- Deschide Discord Developer Portal și apasă New Application. Numele pe care i-l dai e numele botului.
- Deschide Bot din meniul din stânga și apasă Reset Token. Copiază token-ul și ține-l într-un loc privat.
- Mai jos, pe aceeași pagină, pornește Server Members Intent. Mesajul de bun venit are nevoie de el; comenzile slash nu.
- Deschide OAuth2, apoi URL Generator. Bifează bot și applications.commands, iar la Bot Permissions bifează Send Messages.
- 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:
npm init -y
npm install discord.jsAsta 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:
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.
Guildsacoperă comenzile slash;GuildMembersadaugă evenimentele de intrare pe server. SlashCommandBuilderdescrie fiecare comandă și opțiunile ei.commands.setle înregistrează la Discord când botul e gata.InteractionCreatese declanșează când cineva folosește o comandă.options.getIntegercitește numerele, deja verificate de Discord.GuildMemberAddrulează 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:
export DISCORD_TOKEN="paste-your-token-here"
node index.jsÎn Windows PowerShell:
$env:DISCORD_TOKEN="paste-your-token-here"
node index.jsTerminalul 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:
- Pe Creează serverul, alege planul Bot și Discord bot (Node.js).
- În panel, deschide Startup și pune token-ul în Bot token.
- Deschide Files, șterge fișierele botului de start și urcă-ți
index.jsșipackage.json, fărănode_modules. Verifică la Startup că Main file eindex.js. - 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 cuawait interaction.editReply(...). - Prinde erorile la fiecare comandă. Pune codul riscant în
tryșicatchși răspunde cu un mesaj scurt, în loc să lași comanda să eșueze fără niciun semn. Scrie eroarea cuconsole.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ă înInteractionCreate. Există opțiuni pentru texte, numere, utilizatori, roluri și canale. - Comenzi doar pentru admini: adaugă
.setDefaultMemberPermissions(PermissionFlagsBits.Administrator)la un builder, importândPermissionFlagsBitsdin 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.
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.

