Objetivos de aprendizado
Depois de ler este artigo, você vai conseguir:
- Criar um bot discord.js que lê o token de variável de ambiente
- Registrar um slash command e testar o bot localmente
- Levar o bot para uma hospedagem e verificar que ele está online
Um bot discord.js é um processo Node.js que abre uma conexão com o Gateway do Discord e responde a eventos. O bot aparece online enquanto esse processo está de pé e conectado; se o processo para, o bot fica offline para todo mundo.
Este guia vai do projeto vazio ao bot no ar, com código completo em discord.js v14 e módulos ES. Se você ainda não criou o app no Discord, o artigo como criar seu primeiro bot do Discord cobre essa parte em detalhes.
O que você precisa antes de começar?#
- Node.js em versão LTS. O guia oficial do discord.js recomenda a versão LTS ativa do Node.js, e o calendário oficial mostra qual é ela.
- Um app no Portal de Desenvolvedores do Discord, com o bot criado e o token copiado.
- Um servidor de teste onde você tenha permissão para convidar o bot.
O token é a senha do bot. Veja como obter e guardar o seu em token do bot do Discord. Daqui em diante ele sempre vem de uma variável de ambiente chamada DISCORD_TOKEN.
Como montar o projeto?#
Crie a pasta e instale a biblioteca:
mkdir meu-bot && cd meu-bot
npm init -y
npm install discord.jsNo package.json, adicione "type": "module" para usar import. Depois crie o arquivo .env (e adicione .env ao .gitignore):
DISCORD_TOKEN=cole_o_token_aqui
CLIENT_ID=id_da_aplicacao
GUILD_ID=id_do_servidor_de_testeO Node.js carrega esse arquivo sozinho com a flag --env-file, sem pacote extra. Ela existe desde a versão 20.6 e é estável a partir da 24.10, segundo a documentação do Node.js.
Como escrever o código do bot?#
Crie o index.js. O bot abaixo usa só o intent Guilds, que basta para slash commands, e responde ao comando /ping:
import { Client, Events, GatewayIntentBits } from "discord.js";
const client = new Client({ intents: [GatewayIntentBits.Guilds] });
client.once(Events.ClientReady, (readyClient) => {
console.log(`Online como ${readyClient.user.tag}`);
});
client.on(Events.InteractionCreate, async (interaction) => {
if (!interaction.isChatInputCommand()) return;
if (interaction.commandName === "ping") {
await interaction.reply("Pong!");
}
});
client.login(process.env.DISCORD_TOKEN);Se o bot precisar ler o texto das mensagens, você terá de ativar o intent privilegiado MessageContent no Portal e no código. Esse é o erro mais comum de quem migra de comandos com prefixo, e está explicado em erro de intents no bot do Discord.
Como registrar o slash command?#
Ligar o bot não cria o comando. É preciso enviá-lo à API do Discord uma vez, e de novo sempre que a definição mudar. Crie o deploy-commands.js:
import { REST, Routes, SlashCommandBuilder } from "discord.js";
const commands = [
new SlashCommandBuilder().setName("ping").setDescription("Responde com Pong!"),
].map((command) => command.toJSON());
const rest = new REST().setToken(process.env.DISCORD_TOKEN);
await rest.put(
Routes.applicationGuildCommands(process.env.CLIENT_ID, process.env.GUILD_ID),
{ body: commands },
);
console.log(`${commands.length} comando(s) registrado(s).`);Registrar por servidor é o caminho indicado para testar. Quando os comandos estiverem prontos, troque a rota por Routes.applicationCommands(process.env.CLIENT_ID) para valer em todos os servidores onde o bot está, como explica o guia do discord.js.
Para o convite funcionar, gere a URL em OAuth2 no Portal marcando os escopos bot e applications.commands.
Como testar antes de hospedar?#
Registre o comando e ligue o bot:
node --env-file=.env deploy-commands.js
node --env-file=.env index.jsO terminal deve mostrar Online como NomeDoBot. No servidor, digite /ping e confira se a resposta chega. Se o bot fica online, mas o comando não aparece, volte ao registro. Se o bot não entra online, o token está errado ou foi redefinido.
Onde hospedar o bot?#
O seu computador serve para desenvolver, mas o bot cai quando a máquina desliga. Para ficar no ar, o processo precisa rodar em outra máquina sempre ligada:
- VPS: você instala o Node.js, configura um supervisor como pm2 ou systemd e cuida de atualizações e firewall. O passo a passo está em como deixar um bot online 24/7.
- Plataforma de hospedagem de bots: você envia o código e define as variáveis; o ambiente Node.js já existe. Costuma ser mais rápido de configurar.
Para estimar a memória do seu bot, veja quanta RAM um bot precisa, e para comparar valores, quanto custa hospedar um bot.
Quais erros aparecem na hora de hospedar?#
Error [TokenInvalid]: An invalid token was provided.: a variávelDISCORD_TOKENnão chegou ao processo. Na hospedagem não existe o seu.envlocal, a menos que você o envie; defina a variável no painel.Used disallowed intents: o código pede um intent privilegiado que não está ativo no Portal.- O processo termina sem erro: o arquivo principal está errado, ou uma exceção não tratada derrubou o Node.js. Leia os logs e veja por que o bot fica offline.
- Comando aparece duas vezes: o mesmo comando foi registrado por servidor e globalmente. Registre só por um dos caminhos.
Como fazer isso na Square Cloud#
Na Square Cloud, o bot roda num container isolado e sempre ligado, com reinício automático (ligado por padrão no deploy pelo painel) quando o processo encerra com erro. Você faz o deploy por ZIP no painel, CLI, GitHub ou extensão do VS Code.
- Compacte o projeto em ZIP (
index.js,package.json, semnode_modules) e envie pelo painel; no start, a plataforma rodanpm install. O arquivo de configuraçãosquarecloud.appé opcional: o painel o gera com o runtime, a memória e o arquivo principal, ou você o escreve na raiz do projeto. - Escolha o Node.js como runtime e
index.jscomo arquivo principal. Cada aplicação de fundo, como um bot, usa no mínimo 256 MB do pool de RAM do plano. - Defina
DISCORD_TOKENnas variáveis de ambiente da aplicação. A mudança vale no próximo reinício, sem rebuild. - Acompanhe os logs em tempo real no painel, na CLI ou no VS Code e confirme a linha
Online como ....
Os planos são pagos: o Hobby, de R$ 12,49 por mês, inclui 1 GB de RAM e 1 vCPU. Veja os detalhes em hospedagem de bots Discord na Square Cloud.
Hospedagem de bots
Seu bot online 24/7, com reinício automático
Perguntas frequentes
Qual versão do Node.js devo usar com discord.js?
Use a versão LTS ativa do Node.js, como recomenda o guia oficial do discord.js. Ela atende ao mínimo que o discord.js v14 declara no npm e recebe correções por mais tempo.
Preciso do intent MessageContent para o bot funcionar?
Não para slash commands. O intent Guilds basta. MessageContent é privilegiado e só é necessário se o bot precisa ler o texto de mensagens comuns.
Posso colocar o token direto no código?
Não. Quem vir o código vê o token e controla o bot. Leia o token de uma variável de ambiente e, se ele vazar, gere outro no Portal de Desenvolvedores.
Por que o slash command não aparece no Discord?
O comando precisa ser registrado na API do Discord, e isso é um passo separado de ligar o bot. Rode o script de registro e confirme que o bot foi convidado com o escopo applications.commands.
Mais em Bots
Ver todos os 33 artigos- Quanto custa hospedar um bot do Discord?O custo de hospedar um bot do Discord depende de RAM, tempo online, banco de dados e serviços externos. Veja como estimar o seu e onde o gasto aparece.
- Rodar bot no celular (Termux) ou no PC vs hospedar: o que mudaUm bot no PC ou no celular (Termux) fica offline quando o aparelho desliga, dorme ou perde a rede. Compare as três opções e veja quando cada uma serve.
- Por que meu bot do Discord fica offline (e como resolver)Bot do Discord offline quase sempre é processo caído, token inválido, intent não habilitada ou falta de memória. Veja como diagnosticar cada causa e corrigir.
- Como hospedar um bot do Telegram 24/7Para manter um bot do Telegram online 24/7, rode o processo num servidor sempre ligado, com long polling ou webhook. Veja o código e os erros comuns.