Discord ist eine der beliebtesten Plattformen für Kommunikation und Zusammenarbeit von Gamern und Communitys. Die Erstellung von Bots, die auf Discord laufen, ermöglicht es Entwicklern, benutzerdefinierte Funktionen und Automatisierungen zu erstellen, um den Nutzern ein verbessertes Erlebnis zu bieten.

Python ist eine sehr populäre Programmiersprache, die für die Entwicklung von Discord Bots aufgrund ihrer Flexibilität und einfachen Syntax ideal geeignet ist.

In diesem Zusammenhang ist die Programmierung von Discord Bots in Python ein faszinierendes Thema, das es ermöglicht, eine leistungsstarke und dynamische Bot-Funktionalität zu entwickeln, um das Nutzererlebnis auf Discord zu verbessern. In diesem Artikel werden wir uns damit beschäftigen, wie du Discord Bots in Python programmieren kannst.

Vorbereitung

Zunächst brauchst du einen eigenen Account bei Discord. Das ist zum einen die Voraussetzung, um auf das Entwicklerportal zugreifen zu können und zum anderen musst du ja irgendwie sehen, was dein Bot schreibt. Mit diesem Account kannst du dann auch auf den Chat zugreifen.

Als weitere Vorbereitung musst du deinen Discord Bot registrieren und dann einen Server haben, auf dem er laufen soll.

Discordbot registrieren

Im Entwicklerportal kannst du eine Anwendung registrieren. Dazu klickst du einfach auf New Application.

Im nächsten Fenster kannst du das Profil deiner Anwendung schreiben. Um aus der Anwendung einen Bot zu machen, musst du jetzt nur noch links im Hauptmenü auf Bot drücken.

Sobald du im nächsten Fenster auf Add Bot drückst und das aufploppende Fenster bestätigst, ist dein Bot als Discordbenutzer bzw. User registriert. Herzlichen Glückwunsch, du bist jetzt der stolze Besitzer eines Discordbots!

Per Default heißt der Discord Bot genauso wie deine Application. Das kannst du natürlich ändern.

Login Token generieren

Um deine Software später mit Discord zu verbinden, brauchst du ein Login Token. Dieses Token kannst du im Entwicklerportal unter Bot –> Build-A-Bot –> Token generieren.

Bei diesem Token handelt es sich um einen längeren String, der aus zufälligen Buchstaben, Zahlen und Sonderzeichen besteht.

Behandle dein Token wie ein Passwort. Jeder der an dieses Token kommt, kann sich als dein Bot ausgeben.

Discord Server registrieren

Zum Testen kann es sich lohnen einen eigenen Server zu registrieren, auf dem du deinen Bot ausprobieren kannst, ohne andere Leute zu nerven. Server werden oft auch guild (Deutsch: Gilde) genannt.

So einen Server kannst du einfach über die Discord Webseite oder die App registrieren.

Tipp: Wenn du deinen Server mit mehreren Benutzern teilst, dann kann es sinnvoll sein, wenn du auch einen eigenen Kanal für deine Bot-Tests verwendest.

Bot zum Server hinzufügen

Discord verwendet das OAuth2 Protokoll, um Bots hinzuzufügen.

OAuth2 ist ein Protokoll für die Autorisierung, bei dem ein Dienst einer Clientanwendung basierend auf den Anmeldeinformationen und den zulässigen Bereichen der Anwendung eingeschränkten Zugriff gewähren kann.

Praktisch funktioniert das ganze folgendermaßen:

Um einen Bot zu einem Server hinzuzufügen, müssen wir im Entwicklerportal einen Link generieren und diesen an den Manager des Servers schicken, der den Bot auf seinem Server haben will. Im Entwicklerportal wählst du dazu zunächst deine neue Applikation aus und klickst dann links im Menü auf OAuth2 –> URL Generator.

Dort kannst du die Rechte die dein Bot benötigt zusammenklicken.

Für meinen textbasierten Bot aktiviere ich das Kästchen für bot. Dadurch eröffnen sich unten neue Optionen. Dort wähle ich die Kästchen für Send Messages und Read Message History aus den Text Permissions.

Anschließend kannst du ganz unten auf der Seite deine fertige URL rauskopieren und sie an die Server Manager schicken. Dort werden sie gefragt, ob sie den ausgewählten Rechten zustimmen. Tun sie das, wird dein Bot auf dem Server in der Benutzerliste erscheinen.

Discordbot mit Python

Jetzt gehts endlich ans Programmieren. Um die Discord API zu bedienen, verwenden wir das Python-Modul discord.py als Wrapper.

Dieses Modul nimmt uns einiges an low-level Programmierung wie zum Beispiel das rate limit handling ab.

Du brauchst Python 3.8 oder höher.

Discord.py installieren

Sobald du Python und Pip installiert hast, kannst du discord.py auf allen Betriebssystemen mit folgendem Kommandozeilenbefehl installieren.

pip install discord.py==2.2.2

Während ich das hier schreibe, ist discord.py in der Version 2.2.2 erhältlich. Falls es schon eine neuere Version gibt, kannst du natürlich auch die Neuere installieren, indem du die Versionsnummer im Pip Befehl anpasst.

Python Code für einen Bot

Hier zum Abschluss das “Basic Bot” Beispiel. Es benötigt intent Rechte für Members und Message Content. Die kannst du auch ganz einfach im Developer Portal in den jeweiligen Checkboxen konfigurieren.

Danach musst du am Ende des folgenden Codes das Wort “token” mit deinem Token aus dem Developer Portal ersetzen, es in eine Datei bot.py speichern und sie anschließend mit Python ausführen.

Weitere Beispielprogramme findest du auf Github

# This example requires the 'members' and 'message_content' privileged intents to function.

import discord
from discord.ext import commands
import random

description = '''An example bot to showcase the discord.ext.commands extension
module.
There are a number of utility commands being showcased here.'''

intents = discord.Intents.default()
intents.members = True
intents.message_content = True

bot = commands.Bot(command_prefix='?', description=description, intents=intents)


@bot.event
async def on_ready():
    print(f'Logged in as {bot.user} (ID: {bot.user.id})')
    print('------')


@bot.command()
async def add(ctx, left: int, right: int):
    """Adds two numbers together."""
    await ctx.send(left + right)


@bot.command()
async def roll(ctx, dice: str):
    """Rolls a dice in NdN format."""
    try:
        rolls, limit = map(int, dice.split('d'))
    except Exception:
        await ctx.send('Format has to be in NdN!')
        return

    result = ', '.join(str(random.randint(1, limit)) for r in range(rolls))
    await ctx.send(result)


@bot.command(description='For when you wanna settle the score some other way')
async def choose(ctx, *choices: str):
    """Chooses between multiple choices."""
    await ctx.send(random.choice(choices))


@bot.command()
async def repeat(ctx, times: int, content='repeating...'):
    """Repeats a message multiple times."""
    for i in range(times):
        await ctx.send(content)


@bot.command()
async def joined(ctx, member: discord.Member):
    """Says when a member joined."""
    await ctx.send(f'{member.name} joined {discord.utils.format_dt(member.joined_at)}')


@bot.group()
async def cool(ctx):
    """Says if a user is cool.
    In reality this just checks if a subcommand is being invoked.
    """
    if ctx.invoked_subcommand is None:
        await ctx.send(f'No, {ctx.subcommand_passed} is not cool')


@cool.command(name='bot')
async def _bot(ctx):
    """Is the bot cool?"""
    await ctx.send('Yes, the bot is cool.')


bot.run('token')
python bot.py

Hat alles funktioniert, wirst du den Bot jetzt in der Userliste auf dem Server sehen. Außerdem hört dieser Bot auf folgende Commands und reagiert entsprechend:

  • add
  • roll
  • choose
  • repeat
  • joined
  • cool bzw. bot

Am besten schaust du auch mal in die offizielle discord.py Dokumentation.


Konnte ich helfen? Ich freue mich über einen Drink! 💙