aslain.dev
0%
01 Hizmetler 02 Hakkımda 03 Projeler 04 Stack 05 Blog 06 İletişim
← Tüm makaleler Discord-Bots

Discord-Verifizierungsbot: Mitglieder mit Captcha prüfen

Ein Discord-Verifizierungsbot ist eine kleine, aber entscheidende Sicherheitsschicht, die jedes neue Mitglied davon abhält, deine Kanäle zu erreichen, bevor es beweist, ein echter Mensch zu sein. Wer das Tor mit einem einzigen Klick oder einem kurzen Captcha-Code passiert, wird eingelassen; Bot-Accounts, Raid-Skripte und Spamwellen bleiben draußen. In dieser Anleitung bauen wir mit discord.js ein Verifizierungssystem von Grund auf, beginnend mit einem Button und gehärtet durch ein Captcha. Du richtest das Rollen- und Rechtemodell ein, die automatische Rollenzuweisung und die Sicherheitspraktiken, die in der realen Welt wirklich standhalten, Schritt für Schritt.

Warum du ein Verifizierungssystem brauchst

Ein offener Server ist ein Ort, an dem jeder, der den Einladungslink ergattert, direkt hineinspazieren und losschreiben kann. Das lädt zu zwei Arten von Angriffen ein:

  • Bot-/Self-Bot-Wellen: Automatisierte Accounts nehmen in Minuten Hunderte Einladungen an und kippen Werbung oder schädliche Links aus.
  • Raids: Koordinierte Gruppen treten gleichzeitig bei, fluten Kanäle, belästigen Mitglieder und machen den Server unbrauchbar.

Die Verifizierung setzt diese Reibung genau dorthin, wo sie hingehört: ein paar Sekunden für einen Menschen, aber eine mühsame Hürde für Automatisierung. Ein Captcha gibt dir eine weitere Schutzstufe gegen fortgeschrittene Bots, die einfache „Klick den Button"-Abläufe nachahmen.

Das Rechte- und Rollenmodell einrichten

Bevor du Code schreibst, muss die Serverstruktur stimmen. Die Logik ist einfach: ein unverifiziertes Mitglied soll nichts sehen, und der Zugang soll sich erst nach der Verifizierung öffnen. Es gibt zwei gängige Muster:

  • Öffnen mit einer Verified-Rolle: Verberge alle Kanäle vor der Rolle @everyone, sodass nur ein einziger #verifizierung-Kanal sichtbar bleibt. Erstelle eine Rolle namens „Verified" und gib ihr Kanal ansehen auf den echten Kanälen. Sobald sich ein Mitglied verifiziert, fügt der Bot diese Rolle hinzu und der Server öffnet sich.
  • Beschränken mit einer Unverified-Rolle: Gib jedem, der beitritt, automatisch eine „Unverified"-Rolle, verweigere ihr überall den Zugang und entferne die Rolle bei der Verifizierung.

Die erste Methode ist meist sauberer, weil der Standardzustand „geschlossen" ist, was das Risiko verringert, dass ein Kanal versehentlich offen bleibt. Was du auch wählst, merke dir zwei Regeln: Der Bot braucht die Berechtigung Rollen verwalten, und die Rolle des Bots muss über der Rolle stehen, die er zuweist. Sonst weigert sich Discord, die Rolle hinzuzufügen.

Automatisch handeln, wenn ein Mitglied beitritt

Um neue Mitglieder abzufangen, lauschen wir auf das Ereignis GuildMemberAdd. Damit dieses Ereignis ausgelöst wird, musst du den Server Members Intent des Bots aktivieren, sowohl im Developer Portal als auch in den Client-Optionen.

const { Client, GatewayIntentBits, Events } = require('discord.js');

const client = new Client({
  intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMembers],
});

client.on(Events.GuildMemberAdd, async (member) => {
  // Beim Unverified-Muster die Rolle beim Beitritt zuweisen:
  await member.roles.add(process.env.UNVERIFIED_ROLE_ID);
});

client.login(process.env.TOKEN);

Beim Verified-Muster ist dieser Schritt unnötig; das Mitglied sieht standardmäßig ohnehin nichts außer dem Verifizierungskanal.

Discord-Verifizierungsbot: mit einem Button verifizieren

Die einfachste und schnellste Methode ist die Button-basierte Verifizierung. Zuerst sendest du eine feste Panel-Nachricht in den Verifizierungskanal:

const { ButtonBuilder, ButtonStyle, ActionRowBuilder } = require('discord.js');

const row = new ActionRowBuilder().addComponents(
  new ButtonBuilder()
    .setCustomId('verify')
    .setLabel('Mein Konto verifizieren')
    .setEmoji('✅')
    .setStyle(ButtonStyle.Success),
);

await channel.send({
  content: 'Klicke auf den Button unten, um Zugang zum Server zu erhalten.',
  components: [row],
});

Das Feld customId ist hier entscheidend: Es ist der eindeutige Bezeichner, mit dem du den Klick erkennst. Lauschen wir nun auf Klicks auf diesen Button. Wir senden Antworten privat mit flags: MessageFlags.Ephemeral, damit sich der Kanal nicht mit „Du bist verifiziert"-Nachrichten füllt:

const { Events, MessageFlags } = require('discord.js');

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isButton() || interaction.customId !== 'verify') return;

  const role = interaction.guild.roles.cache.get(process.env.VERIFIED_ROLE_ID);
  if (interaction.member.roles.cache.has(role.id)) {
    return interaction.reply({
      content: 'Du bist bereits verifiziert.',
      flags: MessageFlags.Ephemeral,
    });
  }

  await interaction.member.roles.add(role);
  await interaction.reply({
    content: 'Verifiziert — willkommen!',
    flags: MessageFlags.Ephemeral,
  });
});

Das reicht für die meisten kleinen Communities. Willst du aber einen Schritt weiter gegen Bots gehen, die den Button programmatisch klicken, kommt das Captcha ins Spiel.

Erweiterte Verifizierung mit einem Captcha

Im Captcha-Ablauf zeigen wir dem Mitglied beim Klick auf den Button einen zufälligen Code und bitten es, diesen in ein Modal-Formular einzutippen. Eine einfache Map genügt, um den Code im Speicher zu halten (auf großen Servern ist Redis vorzuziehen). Öffne zuerst das Modal beim Buttonklick:

const {
  Events,
  ModalBuilder,
  TextInputBuilder,
  TextInputStyle,
  ActionRowBuilder,
} = require('discord.js');

const pending = new Map();

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isButton() || interaction.customId !== 'verify') return;

  const code = Math.random().toString(36).slice(2, 8).toUpperCase();
  pending.set(interaction.user.id, code);

  const input = new TextInputBuilder()
    .setCustomId('captcha_input')
    .setLabel(`Tippe diesen Code exakt ein: ${code}`)
    .setStyle(TextInputStyle.Short)
    .setRequired(true);

  const modal = new ModalBuilder()
    .setCustomId('captcha_modal')
    .setTitle('Verifizierung')
    .addComponents(new ActionRowBuilder().addComponents(input));

  await interaction.showModal(modal);
});

Wenn das Mitglied das Formular absendet, kommt eine ModalSubmit-Interaktion an. Wir vergleichen den eingegebenen Wert mit dem erwarteten Code und vergeben die Rolle, wenn sie übereinstimmen:

client.on(Events.InteractionCreate, async (interaction) => {
  if (!interaction.isModalSubmit() || interaction.customId !== 'captcha_modal') return;

  const expected = pending.get(interaction.user.id);
  const given = interaction.fields
    .getTextInputValue('captcha_input')
    .trim()
    .toUpperCase();

  if (!expected || given !== expected) {
    return interaction.reply({
      content: 'Falscher Code. Bitte klicke erneut auf den Button.',
      flags: MessageFlags.Ephemeral,
    });
  }

  pending.delete(interaction.user.id);
  const role = interaction.guild.roles.cache.get(process.env.VERIFIED_ROLE_ID);
  await interaction.member.roles.add(role);

  await interaction.reply({
    content: 'Verifiziert — willkommen! 🎉',
    flags: MessageFlags.Ephemeral,
  });
});

Willst du den Code in ein Bild statt in Klartext einbetten, kannst du mit einer Bibliothek wie canvas eine Grafik erzeugen und sie per DM oder einer ephemeren Nachricht statt des Modals senden; die Logik bleibt gleich, du machst den Code nur für Maschinen schwerer lesbar.

Sicherheitstipps und Best Practices

  • Setze ein Timeout: Lösche pending-Einträge nach ein paar Minuten mit setTimeout, damit sich veraltete Codes nicht im Speicher anhäufen.
  • Wende Rate Limiting an: Verhindere, dass derselbe Nutzer schnell zu viele Versuche macht; kicke wiederholt Scheiternde automatisch.
  • Führe Logs: Schreibe erfolgreiche und gescheiterte Verifizierungen per Webhook in einen Log-Kanal; während eines Raids zu sehen, wer durchkam, ist unbezahlbar.
  • Kontoalter-Filter: Kicke sehr neu erstellte Konten (z. B. jünger als 7 Tage) vor der Verifizierung automatisch, um Bot-Wellen schon an der Tür zu stoppen.
  • Schütze das Token: Schreibe das Bot-Token niemals fest in den Code; nutze process.env mit einer .env-Datei und füge sie der .gitignore hinzu.

Häufige Fragen

Welche Berechtigungen braucht ein Verifizierungsbot?

Der Bot braucht mindestens die Berechtigung Rollen verwalten, und die Rolle des Bots muss über der „Verified"-Rolle stehen, die er vergibt. Um Mitgliederbeitritte abzufangen, muss zudem der Server Members Intent aktiviert sein.

Captcha oder Button — was ist besser?

Für kleine, ruhige Server reicht ein Button mit einem Klick meist aus. Auf großen oder häufig geraideten Servern bietet ein Captcha deutlichen Zusatzschutz, indem es Bots aussiebt, die das Panel automatisch anklicken. Beides zu kombinieren ist die stärkste Lösung.

Sollte ich den Code statt in einer Map in einer Datenbank speichern?

Für kleine Bots mit einem einzigen Prozess ist eine Map schnell und ausreichend. Ausstehende Codes werden beim Neustart des Bots gelöscht, was kein Problem ist. Wenn du Sharding nutzt oder Persistenz brauchst, wähle einen gemeinsamen Speicher wie Redis.

Brauchst du ein zuverlässiges Verifizierungssystem für deinen Server? Ich kann einen maßgeschneiderten Discord-Bot für deine Community entwerfen und bauen — mit Button, Captcha, Anti-Raid und Logging. Kontaktiere mich und lass uns über dein Projekt sprechen.

Bu kategorideki tüm yazılar →

Devamı için