Wie willst du den Bot bauen?
Drei Wege führen zum Ziel. Bot-Setup im Discord-Portal (Schritte 2–5) ist überall identisch — nur ab Schritt 6 wird's unterschiedlich.
Bot-Name
Nur als Default in deinen Code-Snippets. Kannst du im Portal später noch ändern.
Application anlegen
Auf Discord existieren Applications (= Apps) und jede App kann optional einen Bot-User haben. Wir machen beides in einem Rutsch.
- Öffne das Developer-Portal: discord.com/developers/applications
- Klick rechts oben auf „New Application"
- Gib einen Namen ein (z. B. MeinBot) und akzeptiere die Developer-ToS
- Du landest auf der App-Übersicht. Im Tab „General Information" findest du die Application ID — das ist deine Client-ID
Application ID hier eintragen
Wird im Schritt 5 gebraucht, um die Invite-URL zu bauen. Bleibt nur in deinem Browser (LocalStorage).
Bot-Token
Der Token ist das Passwort deines Bots. Wer ihn hat, ist dein Bot. Behandle ihn wie einen Hauptschlüssel.
- In deiner Application links auf den Tab „Bot" klicken
- Falls noch keiner existiert: „Add Bot" klicken
- Unter dem Bot-Namen: „Reset Token" → der neue Token wird einmal angezeigt
- Token kopieren und sofort in eine
.env-Datei legen (Beispiel unten)
Beispiel .env
DISCORD_TOKEN=dein-token-kommt-hier-rein
APPLICATION_ID=1234567890123456789
Beispiel .gitignore
node_modules/
__pycache__/
.env
*.env
.env updaten, Bot neu starten, fertig.
Intents
Intents sagen Discord, welche Events dein Bot überhaupt empfangen will. Drei davon sind privileged — die musst du im Portal explizit freischalten, sonst stürzt der Login ab.
Privileged Intents
Im Portal unter Bot → Privileged Gateway Intents aktivieren. Hier nur ankreuzen, was du wirklich brauchst — Code unten passt sich live an.
Permissions & Invite-Link
Permissions sind ein Bitfield — ein riesiger Integer, in dem jedes Bit eine Erlaubnis ist. Pick die, die du brauchst, und unten kommt eine fertige OAuth2-URL raus.
Berechtigungen
Berechnete Permission-Integer
0
Invite-URL
Diesen Link öffnest du im Browser, wählst einen Server (du brauchst „Server verwalten") und klickst Authorize.
App ID in Schritt 2 eintragen…
Lokales Setup
Jetzt kommt der eigentliche Code. Erstmal Projekt & Dependencies.
Voraussetzung: Node.js 18+
Check: node -v sollte v18.x oder höher zeigen. Falls nicht: nodejs.org oder nvm install 20.
Projekt initialisieren
mkdir meinbot
cd meinbot
npm init -y
npm install discord.js dotenv
package.json auf ESM umstellen
Damit import funktioniert, fügst du in package.json eine Zeile hinzu:
{
"name": "meinbot",
"version": "1.0.0",
"type": "module",
"main": "index.js",
...
}
Voraussetzung: Python 3.10+
Check: python --version (oder python3 --version) sollte 3.10 oder höher zeigen.
Projekt initialisieren
mkdir meinbot
cd meinbot
python -m venv venv
# Linux/macOS:
source venv/bin/activate
# Windows:
venv\Scripts\activate
pip install discord.py python-dotenv
source venv/bin/activate — sonst landet pip-install global.
Voraussetzung: n8n läuft
Du hast n8n bereits — also einfach öffnen. Übliche URLs:
- Self-hosted lokal:
http://localhost:5678 - Self-hosted Docker mit Reverse-Proxy: deine Domain
- n8n Cloud:
https://app.n8n.cloud
Was du gleich brauchst
- Bot-Token aus Schritt 3 zur Hand (geht in ein n8n-Credential, nicht in eine
.env) - Bot ist via Invite-URL aus Schritt 5 in deinem Server
- Eine Channel-ID als Ziel — dazu gleich mehr
Channel-ID besorgen
- Discord öffnen → Einstellungen (Zahnrad) → Erweitert
- Entwicklermodus einschalten
- Rechtsklick auf den Ziel-Channel → ID kopieren
Erstes Bot-Skript
Erster Workflow
Hier ist deine index.js bzw. bot.py — angepasst an Library, Bot-Name und Intents, die du oben gewählt hast.
Statt Code schreiben, klickst du den ersten Workflow zusammen: Credential anlegen, Discord-Node, Send-Message, Test-Run.
Code
Clientbaut die WebSocket-Verbindung zu Discord auf.intentssagt: nur diese Events bitte. Spart Bandbreite.ready-Event feuert, sobald der Login durch ist.messageCreatereagiert auf jede Message — wir filtern eigene Bots raus und antworten auf!ping.
messageCreate der Text leer an. Entweder Intent in Schritt 4 aktivieren — oder auf Slash-Commands umsteigen (siehe Schritt 8 → Weiterführend).
1. Discord-Credential anlegen
- In n8n links auf Credentials → + Add Credential
- Suche nach „Discord Bot API" und wähle es aus
- Bei Bot Token deinen Token aus Schritt 3 einfügen
- Save — n8n testet die Verbindung; sollte grün werden
2. Workflow zusammenklicken
- Neuer Workflow → erster Node: Manual Trigger
- Daran einen Discord-Node hängen (nicht „Discord Trigger" — den gibt's nur als Community-Node, mehr in Schritt 8)
- Im Discord-Node konfigurieren:
- Authentication: Bot Token → dein Credential auswählen
- Resource: Message
- Operation: Send
- Send To: Channel
- Channel ID: die ID aus Schritt 6
- Message:
Hallo aus n8n von MeinBot 👋
- Workflow speichern (Strg/Cmd+S) — Name z.B. „Discord Hello"
3. Test-Run
Klick oben rechts auf Execute Workflow. Wenn alles passt:
- Manual-Trigger-Node bekommt einen grünen Haken
- Discord-Node bekommt einen grünen Haken
- Im Channel taucht deine Hallo-Message auf
Starten & testen
Letzter Meter. Bot online, in deinen Server eingeladen, Ping geantwortet — fertig.
Letzter Meter. Workflow aktivieren, sinnvollen Trigger dranhängen, optional auf Discord-Events lauschen.
Bot starten
node index.js
python bot.py
Erwartete Ausgabe
Eingeloggt als MeinBot#1234
Im Server testen
- Auf einen Channel klicken, in dem dein Bot „Send Messages" hat
!pingtippen → Bot antwortetpong 🏓- Funktioniert nicht? → Tabelle unten
Häufige Fehler
| Symptom | Ursache | Fix |
|---|---|---|
Used disallowed intents | Intent im Code an, im Portal aus | Bot-Tab → Privileged Intents aktivieren |
An invalid token was provided | Token falsch / abgelaufen / leerer ENV | .env prüfen, ggf. Reset Token |
Bot online, reagiert nicht auf !ping | MESSAGE CONTENT fehlt | Intent setzen oder Slash-Command nutzen |
| Bot reagiert nicht in einem Channel | Channel-Overwrite blockt | Channel-Permissions prüfen |
Cannot use import statement (Node) | "type": "module" fehlt | In package.json ergänzen |
Workflow aktivieren
Mit Manual Trigger läuft der Workflow nur, wenn du auf Execute klickst. Damit er automatisch arbeitet:
- Manual Trigger durch einen anderen Trigger ersetzen — z.B. Schedule Trigger (Cron-artig, „alle 10 min"), Webhook (HTTP-Call von außen) oder eine andere Datenquelle
- Oben rechts den Toggle auf Active stellen
- Fertig — der Workflow läuft headless im Hintergrund
Auf Discord-Events reagieren
Sending ist trivial. Receiving (Slash-Commands, Reactions, Joins) braucht einen der drei Wege:
| Weg | Aufwand | Wann? |
|---|---|---|
| Polling Schedule + Discord-Node (Operation: Get Many) |
★☆☆ | Wenn 5–10 min Latenz okay sind. Stündliche Channel-Scans, Member-Counts, Stats-Reports. |
| Interactions Endpoint URL Discord → n8n Webhook-Node + ed25519-Signaturprüfung |
★★★ | Slash-Commands. Setzt voraus, dass n8n von außen erreichbar ist (HTTPS, kein Self-Signed). Signatur muss in einem Code-Node verifiziert werden, sonst lehnt Discord den Endpoint ab. |
Community-Node n8n-nodes-discord-trigger-v2Persistent connected via Gateway |
★★☆ | Echter Bot-Trigger mit allen Events. Settings → Community Nodes → Package-Name eingeben → installieren. Achtung: läuft nur, solange n8n läuft. |
Häufige Fehler
| Symptom | Fix |
|---|---|
Credential-Test rot — Unauthorized | Token im Credential falsch oder abgelaufen → im Dev-Portal Reset Token, Credential updaten |
Discord-Node: Missing Permissions | Bot ist im Server, aber Send Messages im Channel fehlt → Permissions in Schritt 5 prüfen oder Channel-Overwrite anpassen |
Discord-Node: Unknown Channel | Channel-ID falsch, oder Bot ist nicht in diesem Server → Invite-URL aus Schritt 5 erneut nutzen |
| Workflow zeigt grün, aber kein Post | Channel-ID gehört zu einem Voice-/Forum-/Thread-Channel → echten Text-Channel verwenden |
| Interactions-Endpoint wird abgelehnt | PING-Response (type 1) muss exakt {"type":1} sein und Signatur muss verifiziert sein, bevor Discord den Endpoint akzeptiert |
REST + Routes.applicationGuildCommands in discord.js, app_commands in discord.py), Cogs/Module-Struktur, Hosting auf einem VPS, Database-Anbindung — aber das ist ein anderer Guide.
Dein Workflow steht. Was als nächstes? Andere Trigger dranhängen (Schedule, Webhook, Postgres, Mail), Embeds bauen, Buttons & Select-Menus über die Discord-API senden, Multi-Step-Flows mit If/Switch — und wenn's wirklich richtig Bot-Logik braucht, der Community-Trigger-Node oder doch der Code-Pfad.