Discord Intents sind ein Abonnementsystem, über das dein Bot vorab erklärt, welche Arten von Events er vom Discord-Gateway empfangen möchte. Wenn der Bot sich zum ersten Mal verbindet, sagt er „diese Events interessieren mich", und Discord sendet nur diese. Aktivierst du nicht die richtigen Intents, funktioniert dein Bot entweder gar nicht, oder bestimmte Events (etwa ein neu beitretendes Mitglied oder der Nachrichteninhalt) kommen nie an. In diesem Artikel erkläre ich, was Intents sind, warum privileged Intents anders sind und wie du sie sowohl im Developer Portal als auch im Code korrekt einrichtest.
Was ist ein Intent und warum gibt es ihn?
Ein Discord-Bot empfängt Echtzeit-Events über eine dauerhafte WebSocket-Verbindung namens Gateway: eine Nachricht wurde gesendet, ein Mitglied ist beigetreten, ein Kanal wurde aktualisiert, eine Reaktion wurde hinzugefügt und Dutzende weitere. Auf großen Servern kann dieser Verkehr enorm sein. Intents lassen den Bot die Eventgruppen auswählen, die ihn wirklich betreffen, und reduzieren so sowohl die Last bei Discord als auch die Datenmenge, die dein Bot verarbeiten muss.
Jeder Intent ist einem Bündel verwandter Events zugeordnet. So deckt der Guilds Intent Server-, Kanal- und Rollen-Events ab, während der GuildMessages Intent das Erstellen/Löschen von Nachrichten abdeckt. Aktivierst du einen Intent nicht, erreichen die Events dieser Gruppe deinen Bot nie und die zugehörigen Event-Listener bleiben einfach stumm.
Standard-Intents und privileged Intents
Intents teilen sich in zwei Kategorien. Die meisten Intents sind Standard und du musst sie nur im Code anfordern; keine zusätzliche Freigabe ist nötig. Drei Intents sind jedoch als privileged markiert, weil sie Zugriff auf sensible Daten gewähren:
- Server Members Intent (
GuildMembers): Events zum Beitritt/Verlassen von Mitgliedern und die vollständige Mitgliederliste. - Presence Intent (
GuildPresences): Presence-Informationen wie der Online-/Offline-Status eines Nutzers und das Spiel, das er spielt. - Message Content Intent (
MessageContent): der tatsächliche Textinhalt, Anhänge und Embeds von Nachrichten.
Diese drei müssen sowohl mit einem Schalter im Developer Portal aktiviert als auch im Code angefordert werden. Forderst du einen privileged Intent im Code an, ohne ihn im Portal aktiviert zu haben, beendet sich der Bot beim Verbindungsversuch mit einem Used disallowed intents-Fehler.
Privileged Intents im Developer Portal aktivieren
Um privileged Intents zu aktivieren, folge diesen Schritten:
- Gehe zum Discord Developer Portal und wähle deine Anwendung aus.
- Öffne den Tab Bot im linken Menü.
- Finde die Schalter unter Privileged Gateway Intents: Presence Intent, Server Members Intent und Message Content Intent.
- Schalte die Intents ein, die dein Bot braucht, und speichere mit Save Changes.
Eine wichtige Einschränkung: Ist dein Bot auf mehr als 100 Servern, musst du den Bot verifizieren und für jeden privileged Intent eine separate Freigabe einholen, bevor du sie nutzen kannst. Bots unter 100 Servern können sie ohne Freigabe verwenden. Aktiviere daher keine privileged Intents, die du nicht wirklich brauchst, denn das erschwert später das Skalieren.
Intents in discord.js definieren
In discord.js v14 werden Intents über das GatewayIntentBits-Enum beim Erstellen des Client übergeben. Füge nur die Intents hinzu, die du brauchst:
const { Client, GatewayIntentBits } = require('discord.js');
const client = new Client({
intents: [
GatewayIntentBits.Guilds,
GatewayIntentBits.GuildMessages,
GatewayIntentBits.MessageContent, // privileged
GatewayIntentBits.GuildMembers // privileged
]
});
client.on('messageCreate', (message) => {
if (message.author.bot) return;
if (message.content === '!ping') {
message.reply('Pong!');
}
});
client.login(process.env.DISCORD_TOKEN);
Eine klassische Falle, auf die du achten solltest: Aktivierst du den MessageContent Intent nicht, kommt das Feld message.content bei den meisten Nachrichten leer zurück. Dein Bot wirkt, als reagiere er nicht auf Befehle, doch das eigentliche Problem ist, dass er den Nachrichtentext nie sieht. Nachrichten, die den Bot erwähnen, und DMs sind eine Ausnahme von dieser Regel, aber für präfixbasierte Befehle ist dieser Intent unerlässlich.
Intents in discord.py definieren
Auf der Python-Seite ist die Logik dieselbe; du konfigurierst ein discord.Intents-Objekt und übergibst es an Client oder commands.Bot:
import discord
from discord.ext import commands
intents = discord.Intents.default()
intents.message_content = True # privileged
intents.members = True # privileged
bot = commands.Bot(command_prefix='!', intents=intents)
@bot.event
async def on_ready():
print(f'Angemeldet als: {bot.user}')
bot.run('TOKEN')
Falls nötig, kannst du mit discord.Intents.all() alles aktivieren, aber das ist eine schlechte Angewohnheit: Sobald du einen privileged Intent anforderst, der im Portal nicht aktiviert ist, stürzt der Bot ab und du erzeugst unnötigen Datenverkehr. Folge dem Prinzip der geringsten Rechte und aktiviere nur die Intents, die du tatsächlich nutzt.
Verwechsle Intents nicht mit Berechtigungen
Eine häufige Verwechslung ist, Intents für dasselbe wie Serverberechtigungen zu halten. Es sind unterschiedliche Schichten:
- Intents bestimmen, welche Events der Bot vom Gateway empfängt; sie werden anwendungsweit definiert.
- Berechtigungen bestimmen, was der Bot auf einem Server tun kann; sie werden auf Rollen- und Kanalebene vergeben (Nachrichten senden, Kanäle verwalten, Mitglieder kicken usw.).
Selbst mit aktiviertem GuildMembers Intent kann der Bot etwa kein Mitglied kicken ohne die Berechtigung „Kick Members". Umgekehrt sieht der Bot die betreffenden Events nie, wenn der richtige Intent nicht aktiviert ist, selbst wenn du ihm alle Berechtigungen gibst. Ein gesundes Bot-Setup bedeutet, die nötigen Intents im Code anzufordern und den Einladungslink (OAuth2-URL) nur mit dem Berechtigungsumfang zu erstellen, den du wirklich brauchst.
Häufige Fragen
Mein Bot reagiert nicht auf Befehle und der Nachrichteninhalt ist leer. Warum?
Höchstwahrscheinlich ist der Message Content Intent deaktiviert. Aktiviere ihn sowohl im Bot-Tab des Developer Portals als auch im Code mit dem MessageContent / message_content Intent. Ohne ihn funktionieren präfixbasierte Befehle nicht; Slash-Befehle hingegen funktionieren weiterhin ohne den Content-Intent.
Ich bekomme einen „Used disallowed intents"-Fehler.
Dieser Fehler bedeutet, dass ein im Code angeforderter privileged Intent im Developer Portal nicht aktiviert ist. Aktiviere den im Fehler genannten Intent im Portal und speichere, oder entferne ihn aus deinem Code, wenn du ihn nicht wirklich nutzt.
Welche Intents soll ich aktivieren?
Nur die, die die Funktionalität deines Bots erfordert. Fast jeder Bot braucht den Guilds Intent. Füge MessageContent für Präfixbefehle hinzu, GuildMembers für Willkommen-/Abschied-Systeme und GuildPresences für Presence-Tracking. Nicht benötigte privileged Intents ausgeschaltet zu lassen ist besser für die Sicherheit und für den Verifizierungsprozess jenseits der 100 Server.
Möchtest du deinen Bot solide mit den richtigen Intents und Berechtigungen aufsetzen? Wenn du Hilfe bei Discord-Bot-Architektur, Intent-Konfiguration und Deployment brauchst, nimm Kontakt mit mir auf.