Tutorial

Erstellen eines Discord-Bots mit Node.js

Node.jsDevelopmentJavaScriptProgramming Project

Der Autor wählte den Free and Open Source Fund, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.

Einführung

Discord ist eine Chat-Anwendung, die Millionen von Benutzern auf der ganzen Welt für Messaging und Voice Chat nutzen – in Communities, die Gilden oder Server genannt werden. Außerdem bietet Discord eine umfangreiche API, die Entwickler zum Einrichten leistungsfähiger Discord-Bots verwenden können. Bots können verschiedene Aktionen wie das Senden von Nachrichten an Server, das Ausführen von DM-Befehlen für Benutzer, das Moderieren von Servern und das Abspielen von Audio in Voice Chats erledigen. So können Entwickler leistungsstarke Bots entwickeln, die erweiterte, anspruchsvolle Merkmale wie Moderationstools oder auch Spiele umfassen. Der Utility-Bot Dyno zum Beispiel stellt Millionen von Gilden bereit und bietet nützliche Merkmale wie Spamschutz, einen Musikplayer und andere Dienstprogrammfunktionen. Wenn Sie wissen, wie man Discord-Bots erstellt, können Sie viele Möglichkeiten implementieren, mit denen Tausende von Menschen täglich interagieren können.

In diesem Tutorial erstellen Sie von Grund auf einen Discord-Bot mit Node.js und der Discord.js-Bibliothek, sodass Benutzer direkt mit der Discord-API interagieren können. Sie werden ein Profil für einen Discord-Bot einrichten, Authentifizierungstoken für den Bot erhalten und den Bot mit der Fähigkeit zur Verarbeitung von Befehlen mit Argumenten von Benutzern programmieren.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie Folgendes:

Schritt 1 — Einrichten eines Discord-Bots

In diesem Schritt verwenden Sie die Entwickler-GUI von Discord, um einen Discord-Bot einzurichten und das Token des Bots zu empfangen, das Sie an Ihr Programm übergeben werden.

Um einen Bot in der Discord-Plattform zu registrieren, verwenden Sie das Dashboard der Discord-Anwendung. Hier können Entwickler Discord-Anwendungen einschließlich Discord-Bots erstellen.

Abbildung des Dashboards der Discord-Anwendung nach dem ersten Besuch von https://discord.com/developers/applications

Um zu beginnen, klicken Sie auf Neue Anwendung. Discord wird Sie bitten, einen Namen für Ihre neue Anwendung einzugeben. Klicken Sie dann auf Erstellen, um die Anwendung zu erstellen.

Abbildung der Eingabeaufforderung für die Erstellung einer Anwendung, mit „Test Node.js Bot“ als Name der Anwendung

Anmerkung: Der Name Ihrer Anwendung ist unabhängig vom Namen des Bots und der Bot muss nicht den gleichen Namen tragen wie die Anwendung.

Öffnen Sie nun Ihr Anwendungs-Dashboard. Um der Anwendung einen Bot hinzuzufügen, navigieren Sie links in der Navigationsleiste zur Registerkarte Bot.

Abbildung der Registerkarte Bot des Anwendungs-Dashboards

Klicken Sie auf die Schaltfläche Bot hinzufügen, um der Anwendung einen Bot hinzuzufügen. Klicken Sie auf die Schaltfläche Ja, los!, wenn sie Sie zur Bestätigung aufgefordert werden. Nun befinden Sie sich in einem Dashboard, das Details wie den Namen des Bots, das Authentifizierungstoken und das Profilbild enthält.

Dashboard mit Details Ihres Bots

Sie können den Namen oder das Profilbild Ihres Bots hier im Dashboard ändern. Außerdem müssen Sie das Authentifizierungstoken des Bots kopieren, indem Sie auf Klicken, um Token anzuzeigen klicken und das angezeigte Token kopieren.

Achtung: Teilen oder laden Sie Ihr Bot-Token niemals hoch, damit sich andere Personen nicht bei Ihrem Bot anmelden können.

Jetzt müssen Sie eine Einladung erstellen, mit der Sie die Discord-Gilden des Bots hinzufügen, in denen Sie den Bot testen können. Navigieren Sie zunächst zum Tab OAuth2 des Anwendungs-Dashboards. Um eine Einladung zu erstellen, scrollen Sie nach unten und wählen Sie unter Bereiche Bot aus. Außerdem müssen Sie Berechtigungen festlegen, um zu kontrollieren, welche Aktionen Ihr Bot in Gilden ausführen darf. Wählen Sie für die Zwecke dieses Tutorials Administrator, wodurch Ihr Bot die Berechtigung erhält, fast alle Aktionen in Gilden auszuführen. Kopieren Sie den Link mit der Schaltfläche Kopieren.

OAuth2-Registerkarte, mit dem Bereich auf „bot“ und Berechtigungen auf „administator“ gesetzt

Als Nächstes fügen Sie den Bot einem Server hinzu. Folgen Sie dem gerade erstellten Einladungs-Link. Sie können den Bot jedem Server hinzufügen, den Sie besitzen oder für den Sie über Administratorberechtigungen verfügen (über das Dropdownmenü).

Seite nach dem Folgen des Einladungs-Links, über die Benutzer den Bot Servern hinzufügen können

Klicken Sie nun auf Weiter. Stellen Sie sicher, dass Sie das Kontrollkästchen neben Administrator aktiviert haben – dadurch erhält der Bot Administratorberechtigungen. Klicken Sie dann auf Autorisieren. Discord wird Sie bitten, eine CAPTCHA zu lösen, bevor der Bot dem Server beitritt. Sie werden den Discord-Bot nun auf der Mitgliederliste in dem Server sehen, dem Sie den Bot unter offline hinzugefügt haben.

Mitgliederliste eines Discord-Servers mit dem neu erstellten Bot unter dem Abschnitt „offline“ der Mitgliederliste

Sie haben erfolgreich einen Discord-Bot erstellt und einem Server hinzugefügt. Als Nächstes schreiben Sie ein Programm, um sich bei dem Bot anzumelden.

Schritt 2 — Erstellen Ihres Projekts

In diesem Schritt richten Sie die grundlegende Codierungsumgebung ein, in der Sie Ihren Bot erstellen und sich programmatisch beim Bot anmelden werden.

Zuerst müssen Sie einen Projektordner und die erforderlichen Projektdateien für den Bot einrichten.

Erstellen Sie Ihren Projektordner:

  • mkdir discord-bot

Wechseln Sie in den gerade erstellten Projektordner:

  • cd discord-bot

Als Nächstes verwenden Sie Ihren Texteditor, um eine Datei namens config.json zu erstellen und das Authentifizierungstoken Ihres Bots zu speichern:

  • nano config.json

Fügen Sie dann den folgenden Code der config-Datei hinzu und ersetzen Sie den hervorgehobenen Text durch das Authentifizierungstoken Ihres Bots:

config.json
{
    "BOT_TOKEN": "YOUR BOT TOKEN"
}

Speichern und schließen Sie die Datei.

Als Nächstes erstellen Sie eine package.json-Datei, in der Details Ihres Projekts und Informationen über die Abhängigkeiten gespeichert werden, die Sie für das Projekt verwenden werden. Sie erstellen eine package.json-Datei, indem Sie den folgenden npm-Befehl ausführen:

  • npm init

npm wird Sie nach verschiedenen Details zu Ihrem Projekt fragen. Wenn Sie eine Anleitung für diese Eingabeaufforderungen wünschen, konsultieren Sie Verwenden von Node.js-Modulen mit npm und package.json.

Sie installieren nun das discord.js-Paket, das Sie zur Interaktion mit der Discord-API verwenden werden. Sie können discord.js über npm mit dem folgenden Befehl installieren:

  • npm install discord.js

Nachdem Sie die Konfigurationsdatei eingerichtet und die erforderliche Abhängigkeit installiert haben, können Sie nun mit der Einrichtung Ihres Bots beginnen. In einer realen Anwendung würde ein großer Bot auf viele Dateien verteilt, aber für die Zwecke dieses Tutorials wird sich der Code Ihres Bots in einer Datei befinden.

Erstellen Sie zunächst für den Code eine Datei mit dem Namen index.js im Ordner discord-bot:

  • nano index.js

Beginnen Sie mit dem Codieren des Bots, indem Sie die discord.js-Abhängigkeit und die Konfigurationsdatei mit dem Token des Bots vorschreiben:

index.js
const Discord = require("discord.js");
const config = require("./config.json");

Fügen Sie danach die folgenden zwei Codezeilen hinzu:

index.js
...
const client = new Discord.Client();

client.login(config.BOT_TOKEN);

Speichern und schließen Sie Ihre Datei.

Die erste Zeile des Codes erstellt einen neuen Discord.Client und weist ihn der Konstanten client zu. Dieser Client ist ein Teil davon, wie Sie mit der Discord-API interagieren werden und wie Discord Sie bei Ereignissen wie neuen Meldungen benachrichtigen wird. Der Client ist in Wirklichkeit der Discord-Bot.

Die zweite Zeile des Codes verwendet die login-Methode für den Client, um sich bei dem von Ihnen erstellten Discord-Bot anzumelden, wobei das Token in der Datei config.json als Passwort verwendet wird. Mit dem Token erfährt die Discord-API, an welches Programm sich der Bot richtet und dass Sie für die Nutzung des Bots authentifiziert sind.

Führen Sie nun mit Node die Datei index.js aus:

  • node index.js

Der Status Ihres Bots wird sich auf dem Discord-Server, dem er hinzugefügt wurde, in „online“ ändern.

Abbildung des Bots im Online-Zustand

Sie haben erfolgreich eine Codierungsumgebung eingerichtet und den grundlegenden Code für die Anmeldung bei einem Discord-Bot erstellt. Im nächsten Schritt werden Sie Benutzerbefehle verwalten und Ihren Bot zur Durchführung von Aktionen veranlassen, wie z. B. zum Senden von Nachrichten.

Schritt 3 — Verwendung Ihres ersten Benutzerbefehls

In diesem Schritt erstellen Sie einen Bot, der Benutzerbefehle handhaben kann. Sie werden Ihren ersten Befehl (ping) implementieren, der mit "pong" und der Zeit antworten wird, die zum Antworten auf den Befehl benötigt wurde.

Zunächst müssen Sie alle Nachrichten erkennen und empfangen, die Benutzer senden, damit Sie Befehle verarbeiten können. Mit der Methode on auf dem Discord-Client wird Ihnen Discord eine Benachrichtigung zu neuen Ereignissen senden. Die Methode on hat zwei Argumente: den Namen eines Ereignisses, auf das gewartet wird, und eine Funktion, die jedes Mal ausgeführt wird, wenn das Ereignis eintritt. Bei dieser Methode können Sie auf das Ereignis message warten – es wird jedes Mal eintreten, wenn eine Nachricht an eine Gilde gesendet wird, in der der Bot die Berechtigung zum Anzeigen von Nachrichten hat. Lassen Sie uns daher eine Funktion erstellen, die bei jeder Übermittlung einer Nachricht ausgeführt wird, um Befehle zu verarbeiten.

Öffnen Sie zunächst Ihre Datei:

  • nano index.js

Fügen Sie den folgenden Code zur Datei hinzu:

index.js
...
const client = new Discord.Client();


client.on("message", function(message) { 
                                         
});                                      

client.login(config.BOT_TOKEN);

Diese Funktion, die beim Ereignis message ausgeführt wird, nutzt message als Parameter. message wird den Wert einer Discord.js message-Instanz haben, die Informationen über die gesendete Nachricht und Methoden enthält, um dem Bot beim Antworten zu helfen.

Fügen Sie nun Ihrer Befehlsverarbeitungsfunktion die folgende Codezeile hinzu:

index.js
...
client.on("message", function(message) {
  if (message.author.bot) return;
});
...

Diese Zeile prüft, ob der Autor der Nachricht ein Bot ist; wenn ja, wird die Verarbeitung des Befehls gestoppt. Dies ist wichtig, da Sie Nachrichten von Bots im Allgemeinen weder bearbeiten noch beantworten möchten. Bots müssen oder wollen unseren Bot in der Regel nicht verwenden, sodass ein Ignorieren ihrer Nachrichten Rechenleistung spart und unbeabsichtigte Antworten verhindert.

Jetzt schreiben Sie einen Befehlshandler. Um das zu erreichen, ist es hilfreich, das übliche Format eines Discord-Befehls zu verstehen. In der Regel enthält die Struktur eines Discord-Befehls drei Teile in der folgenden Reihenfolge: ein Präfix, einen Befehlsnamen und (manchmal) Befehlsargumente.

Abbildung eines typischen Discord-Befehls, der "! add 1 2" lautet

  • Präfix: Das Präfix kann alles sein, ist aber in der Regel eine Interpunktion oder abstrakte Phrase, die normalerweise nicht am Anfang einer Nachricht stehen würde. Das bedeutet, dass bei Eingabe des Präfix am Anfang der Nachricht der Bot weiß, dass der Befehl von einem Bot verarbeitet werden soll.

  • Befehlsname: Der Name des Befehls, den der Benutzer verwenden möchte. Das bedeutet, dass der Bot mehrere Befehle mit unterschiedlicher Funktionalität unterstützen kann und Benutzer durch Angabe eines anderen Befehlsnamens zwischen ihnen wählen können.

  • Argumente: Wenn der Befehl ggf. zusätzliche Informationen vom Benutzer benötigt oder verwendet, kann der Benutzer nach dem Befehlsnamen Argumente angeben, wobei jedes Argument durch ein Leerzeichen getrennt wird.

Anmerkung: Es gibt keine zwingende Befehlsstruktur; Bots können Befehle verarbeiten, wie sie wollen. Die hier dargestellte Struktur ist jedoch eine effiziente Struktur, die eine überwiegende Mehrheit der Bots verwendet.

Um mit der Erstellung eines Befehlsparsers zu beginnen, der dieses Format handhabt, fügen Sie der Nachrichtenverarbeitungsfunktion folgende Codezeilen hinzu:

index.js
...
const prefix = "!";

client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;
});
...

Sie fügen die erste Codezeile hinzu, um den Wert "!" der Konstanten prefix zuzuweisen, die Sie als Präfix des Bots nutzen werden.

Die zweite Codezeile, die Sie hinzufügen, prüft, ob der Inhalt der Nachricht, die der Bot verarbeitet, mit dem von Ihnen festgelegten Präfix beginnt; wenn nicht, wird die Weiterverarbeitung der Nachricht gestoppt.

Jetzt müssen Sie den Rest der Nachricht in einen Befehlsnamen und jegliche Argumente konvertieren, die in der Nachricht vorhanden sind. Fügen Sie die folgenden hervorgehobenen Zeilen hinzu:

index.js
...
client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();
});
...

Sie verwenden hier die erste Zeile, um das Präfix aus dem Nachrichteninhalt zu entfernen und das Ergebnis der Konstanten commandBody zuzuweisen. Dies ist notwendig, da Sie das Präfix nicht in den analysierten Befehlsnamen einfügen möchten.

Die zweite Zeile nimmt die Nachricht mit dem entfernten Präfix und wendet die split-Methode darauf an, wobei ein Leerzeichen als Trennzeichen dient. Dadurch wird eine Aufspaltung in eine Gruppe von untergeordneten Zeichenfolgen vorgenommen, wobei bei jedem Leerzeichen eine Trennung vorgenommen wird. So entsteht ein Array, das den Befehlsnamen und dann (wenn in der Nachricht enthalten) Argumente beinhaltet. Sie weisen dieses Array der Konstanten args zu.

Die dritte Zeile entfernt das erste Element aus dem Array args (was der bereitgestellte Befehlsname sein wird), konvertiert es in Kleinbuchstaben und weist es dann der Konstanten command zu. Dadurch können Sie den Befehlsnamen isolieren und nur Argumente im Array belassen. Außerdem verwenden Sie die Methode toLowerCase, da bei Befehlen in Discord-Bots typischerweise nicht zwischen Groß-/Kleinschreibung unterschieden wird.

Sie haben die Erstellung eines Befehlsparsers, die Implementierung eines erforderlichen Präfix und das Erhalten des Befehlsnamens und der Argumente von Nachrichten abgeschlossen. Sie werden nun den Code für die spezifischen Befehle implementieren und erstellen.

Fügen Sie folgenden Code hinzu, um den ping-Befehl zu implementieren:

index.js
...
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
                           
  }                        
});
...

Diese if-Anweisung prüft, ob der analysierte Befehlsname (der der Konstanten command zugewiesen ist) mit "ping" übereinstimmt. Wenn ja, heißt das, dass der Benutzer den Befehl "ping" verwenden möchte. Sie werden den Code für den spezifischen Befehl im if-Anweisungsblock verschachteln. Sie werden dieses Muster für andere Befehle, die Sie implementieren möchten, wiederholen.

Jetzt können Sie den Code für den Befehl "ping" implementieren:

index.js
...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }
...

Speichern und schließen Sie Ihre Datei.

Sie fügen den Befehlsblock "ping" hinzu, der die Differenz zwischen der aktuellen Zeit (ermittelt durch Anwendung der Methode now auf das Objekt Date) und dem Zeitstempel, als die Nachricht erstellt wurde, berechnet (in Millisekunden). Dadurch wird berechnet, wie lang die Verarbeitung der Nachricht und das "ping" des Bots benötigt haben.

Die zweite Zeile reagiert auf den Befehl des Benutzers mit der reply-Methode in der Konstanten message. Die reply-Methode pingt (wodurch der Benutzer benachrichtigt und die Nachricht für den angegebenen Benutzer hervorgehoben wird) den Benutzer an, der den Befehl aufgerufen hat, gefolgt von dem Inhalt, der als erstes Argument der Methode angegeben wurde. Sie stellen ein template literal bereit, das eine Nachricht und den errechneten Ping als Antwort enthält, die die reply-Methode verwenden wird.

Damit ist die Implementierung des Befehls "ping" abgeschlossen.

Führen Sie Ihren Bot mit dem folgenden Befehl aus (im selben Ordner wie index.js):

  • node index.js

Sie können nun den Befehl "! ping" in jedem Kanal nutzen, den der Bot anzeigen und in dem der Bot Nachrichten senden kann; dabei kommt es zu einer Antwort.

Abbildung von Bot, der in Discord auf "! ping" mit "@T0M, Pong! This message had a latency of 1128ms." antwortet.

Sie haben nun erfolgreich einen Bot erstellt, der Benutzerbefehle handhaben kann, und Ihren ersten Befehl implementiert. Im nächsten Schritt werden Sie Ihren Bot weiterentwickeln, indem Sie einen sum-Befehl implementieren.

Schritt 4 — Implementieren des sum-Befehls

Jetzt werden Sie Ihr Programm durch Implementieren des "! sum"-Befehls erweitern. Der Befehl nimmt eine beliebige Anzahl von Argumenten an und fügt sie zusammen, bevor die Summe aller Argumente an den Benutzer zurückgegegen wird.

Wenn Ihr Discord-Bot noch ausgeführt wird, können Sie den Prozess mit Strg+C anhalten.

Öffnen Sie erneut Ihre index.js-Datei:

  • nano index.js

Um mit der Implementierung des "! sum"-Befehls zu beginnen, werden Sie einen else-if-Block verwenden. Nach der Prüfung des ping-Befehlsnamens wird geprüft, ob der Befehlsname gleich "sum" ist. Wir verwenden einen else-if-Block, da nur ein Befehl auf einmal verarbeitet wird; wenn das Programm dem Befehlsnamen "ping" entspricht, muss also nicht auf den Befehl "sum" geprüft werden. Fügen Sie in Ihrer Datei die folgenden hervorgehobenen Zeilen hinzu:

index.js
...
  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Ping! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
                               
  }                            
});
...

Sie können mit der Implementierung des Codes für den "sum"-Befehl beginnen. Der Code für den Befehl "sum" wird in den gerade erstellten else-if-Block eingebunden. Fügen Sie nun folgenden Code hinzu:

index.js
...
  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
...

Sie verwenden die map-Methode in der Argumentenliste, um eine neue Liste zu erstellen, indem Sie die Funktion parseFloat auf jedes Element im Array args anwenden. Dadurch ensteht ein neues Array (das der Konstanten numArgs zugewiesen ist), in dem alle Elemente Zahlen anstelle von Zeichenfolgen sind. Das bedeutet, dass Sie durch Addieren die Summe der Zahlen ermitteln können.

Die zweite Zeile wendet die reduce-Methode auf die Konstante numArgs an; so ist eine Funktion verfügbar, die die Summe aller Elemente in der Liste errechnet. Sie weisen die Summe aller Elemente in numArgs der Konstanten sum zu.

Dann wenden Sie die reply-Methode auf das Nachrichtenobjekt an, um auf den Befehl des Benutzers mit einem template literal zu antworten, das die Summe aller Argumente enthält, die der Benutzer an den Bot sendet.

Damit ist die Implementierung des Befehls "sum" abgeschlossen. Führen Sie Ihren Bot nun mit dem folgenden Befehl aus (im selben Ordner wie index.js):

  • node index.js

Sie können den Befehl "! sum" jetzt in jedem Kanal verwenden, den der Bot anzeigen und in dem er Nachrichten senden kann.

Abbildung von Bot, der mit „Die Summe aller von Ihnen angegebenen Argumente ist 6!“ auf "! sum 1 2 3" und dann mit „Die Summe aller von Ihnen angegebenen Argumente ist 13!“ auf "! sum 1.5 1.5 10" antwortet

Im Folgenden finden Sie eine fertige Version des index.js-Bot-Skripts:

index.js
const Discord = require("discord.js");
const config = require("./config.json");

const client = new Discord.Client();

const prefix = "!";

client.on("message", function(message) {
  if (message.author.bot) return;
  if (!message.content.startsWith(prefix)) return;

  const commandBody = message.content.slice(prefix.length);
  const args = commandBody.split(' ');
  const command = args.shift().toLowerCase();

  if (command === "ping") {
    const timeTaken = Date.now() - message.createdTimestamp;
    message.reply(`Pong! This message had a latency of ${timeTaken}ms.`);
  }

  else if (command === "sum") {
    const numArgs = args.map(x => parseFloat(x));
    const sum = numArgs.reduce((counter, x) => counter += x);
    message.reply(`The sum of all the arguments you provided is ${sum}!`);
  }
});

client.login(config.BOT_TOKEN);

In diesem Schritt haben Sie Ihren Discord-Bot durch Implementieren des sum-Befehls weiterentwickelt.

Zusammenfassung

Sie haben einen Discord-Bot implementiert, der verschiedene Benutzerbefehle und Befehlsargumente handhaben kann. Wenn Sie Ihren Bot erweitern möchten, können Sie ggf. weitere Befehle implementieren oder weitere Bestandteile der Discord-API zur Erstellung eines leistungsfähigen Discord-Bots testen. Konsultieren Sie die Discord.js-Dokumentation oder Discord-API-Dokumentation, um mehr über die Discord-API zu erfahren.

Bei der Erstellung von Discord-Bots müssen Sie stets die allgemeinen Geschäftsbedingungen der Discord-API im Auge behalten; darin wird umrissen, wie Entwickler die Discord-API verwenden müssen. Außerdem können Sie diesen Satz an Leitfäden lesen, um einen Discord-Bot optimal zu implementieren und Tipps zur Gestaltung von Discord-Bots zu erhalten. Wenn Sie mehr über Node.js erfahren möchten, lesen Sie unsere Serie zum Codieren in Node.js.

Creative Commons License