Eigenen Telegram Bot mit Python programmieren

Telegram ist ein Messenger-Dienst, der von Millionen von Nutzern auf der ganzen Welt genutzt wird. Es bietet jedoch nicht nur eine Plattform zum Senden von Nachrichten und Medien, sondern auch eine API, mit der Entwickler eigene Bots erstellen können.

In diesem Tutorial werden wir uns darauf konzentrieren, wie man einen Telegram-Bot über den BotFather erstellt und programmatisch steuert, indem wir Python verwenden. Am Ende dieser Anleitung wird der Bot die Chat-Nachrichten lesen können und bei bestimmten Keywords mit einem Bild antworten.

Was ist ein Bot?

Telegram-Bots sind automatisierte Programme, die Nachrichten von Benutzern empfangen und darauf reagieren können. Diese Bots können eine Vielzahl von Aufgaben ausführen, von einfachen Textantworten bis hin zur Integration von Drittanbieterdiensten wie Wettervorhersagen, Zahlungsabwicklungen und vielem mehr.

Sobald ein Bot erstellt wurde, können Benutzer ihn über den Telegram-Client hinzufügen und mit ihm interagieren. Bots können öffentlich oder privat sein und können in Gruppen- oder Kanalchats verwendet werden. Sie bieten eine Vielzahl von Funktionen und können auf viele verschiedene Arten genutzt werden, um die Nutzererfahrung auf Telegram zu verbessern.

Die Programmierung eines Telegram-Bots ist relativ einfach, da die Plattform eine gut dokumentierte API und Bibliotheken für verschiedene Programmiersprachen wie Python bietet. Dank der Bibliothek https://python-telegram-bot.org/ ist der Zugriff auf die API ohne tiefgehende Kenntnisse über Python möglich.

Einen neuen Telegram Bot erstellen

Wenn man einen neuen Telegram-Bot erstellen möchte, ist der BotFather der erste Anlaufpunkt. Der BotFather ist ein offizieller Bot von Telegram, der Benutzern dabei hilft, eigene Bots zu erstellen und zu verwalten. Mit dem BotFather kannst du einen neuen Bot erstellen und ihm einen Namen und Benutzernamen geben. Außerdem generiert der BotFather einen API-Token, der es dir ermöglicht, deinen Bot programmatisch zu steuern.

  1. Öffne den Telegram-Client und suche nach dem Benutzer „BotFather“ (du kannst auch hier klicken: https://t.me/botfather).
  2. Sende dem BotFather den Befehl „/newbot“, um einen neuen Bot zu erstellen.
  3. Der BotFather fordert dich auf, einen Namen für deinen Bot einzugeben. Gib einen Namen ein, den du deinem Bot geben möchtest. Dieser Name wird später als Benutzername für deinen Bot verwendet.
  4. Du wirst nun aufgefordert, einen Benutzernamen für deinen Bot einzugeben. Dieser Benutzername muss eindeutig sein und mit dem Suffix „Bot“ enden. Beispiel: „DemoImageBot“.
  5. Nachdem du einen Namen und Benutzernamen für deinen Bot eingegeben hast, gibt dir der BotFather einen API-Token. Dieser Token ist der Schlüssel, mit dem du deinen Bot programmatisch steuern kannst.

Jeder der Zugriff auf das API-Token hat, hat auch vollen Zugriff auf deinen Bot. Bewahre das Token irgendwo auf, wo nur du Zugriff darauf hast und wo er nicht für andere zugänglich ist!

Die Programmierung

Der Bot ist angelegt, jetzt geht es an die Programmierung. Der Zugriff auf den Telegram-Bot erfolgt über eine eigene API, die den Zugriff auf die Funktionen des Bots ermöglicht. Die API bietet grundlegende Funktionen zum Senden und Empfangen von Nachrichten, Verwalten von Benutzerinformationen, Arbeiten mit Medieninhalten und vieles mehr. Wir können HTTP-Anfragen an die API senden, um Befehle an den Bot zu übermitteln und Antworten von Telegram zu empfangen. Die API ist gut dokumentiert und leicht zugänglich, was die Entwicklung von Bots in verschiedenen Programmiersprachen, einschließlich Python, ermöglicht.
Für diese Anleitung nutze ich die folgende Open-Source Python Bibliothek: https://python-telegram-bot.org/

Nachfolge
Bevor wir anfangen erstellen wir eine neue Datei mit dem Namen main.py. Bei dieser Datei handelt es sich um unser Skript, welches den Bot steuert. Zudem erstellen wir ein leeres Verzeichnis mit dem Namen Images. Dieses muss sich an der gleichen Stelle wie die main.py befinden und beinhaltet am Ende die Bilder, von dem der Bot zufällig eines herausgibt, wenn er sich angesprochen fühlt.

Damit wir die Telegram-Bot Bibliothek nutzen können müssen wir diese erstmal auf dem System installieren. Das istallierene erfolgt über pip:

pip install python-telegram-bot

Anschließend müssen wir diese dann in unser Python-Skript importieren, damit wir die Funktionen daraus nutzen können. Neben den Bibliothek für unseren Telegram Bot importieren wir noch weitere Libraries, die für das logging und die Kommunikation mit dem Betriebssystem erforderlich sind. Der Anfang unseres Skripts müsste also wiefolgt aussehen:

import os, random, re, logging          
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, CommandHandler, filters

Das Ziel ist es, das Skript auf dem Server im Hintergrund auszuführen. Durch das Ausführen im Hintergrund haben wir keine Möglichkeit direkt auf die Ausgabe des Programms zugreifen. Hier kommt die Logging-Funktion von Python ins Spiel. Hierdurch können wir eingehende Nachrichten und Fehler in einer Datei protokollieren, die wir anschließend zu jeder Zeit öffnen und auswerten können. Zum konfigurieren der Llogging-Funktion füren wir folgende Zeilen in unser Skript ein:

#Basic logging funktion in the file log_file.log
logging.basicConfig(
    filename='log_file.log',
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

Jetzt werden Fehler und gewollte Ausgaben wie eingehende Nachrichten in die Datei log_file.log geschrieben, auch wenn das Skript im Hintergrund ausgeführt wird.

Damit unser Programm weiß, welche Bilder es verschicken kann, müssen wir das Image Verzeichnis durchsuchen und die gefundenen Einträge speichern. Anschließend kann aus dieser Liste ein zufälliges Bild ausgewählt und versendet werden. Damit wir die Performance unseres Programms beibehalten erstellen wir die Liste nur ein mal am Anfang des Skripts und durchsuchen das Image Verzeichnis nicht jedes mal neu, wenn eine Nachricht eingeht. Sollten wir neue Bilder hinzufügen müssen wir das Skript allerdings neu starten, damit diese mit in die Liste aufgenommen werden. Die folgende Zeile Code durchsucht den Ordner Images nach Bildern und speichert den Pfad in der Liste file_list:

#get all images inside of the folder "Images"
file_list = os.listdir("Images")

Als nächstes definieren wir unsere erste Funktion send_image, die für das laden und senden des Bildes verantwortlich ist:


async def send_image(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """
    This function sends a random image from the 'Images' directory to the user.
    """
    logging.info("New Message:")
    logging.info(update.message.chat_id)

    try:
        photo_filename = random.choice(file_list)
        photo_path = os.path.join("Images", photo_filename)

        with open(photo_path, 'rb') as photo_file:
            await context.bot.send_photo(chat_id=update.effective_chat.id, photo=photo_file)
    except Exception:
        logging.info("ERROR: " + photo_path)

Die Funktion wird aufgerufen, wenn der Bot eine Nachricht von einem Benutzer empfängt. Sie akzeptiert zwei Argumente:

  • update: Ein Telegram-Update-Objekt, das Informationen über die eingehende Nachricht enthält.
  • context: Der Kontext für den Handler, der verschiedene Funktionen und Eigenschaften enthält, um mit dem Bot zu interagieren.

Die Funktion führt die folgenden Schritte aus:

  1. Protokollierung: Die Funktion protokolliert, dass eine neue Nachricht empfangen wurde, und gibt die Chat-ID des Benutzers aus, der die Nachricht gesendet hat. Diese Protokollierung ist nützlich, um den Bot-Betrieb nachzuverfolgen und potenzielle Fehler zu identifizieren.
  2. Zufällige Auswahl des Bildes: Die Funktion durchsucht das Verzeichnis ‚Images‘ und wählt eine zufällige Bilddatei aus dem Verzeichnis aus.
  3. Senden des Bildes: Nachdem die Bilddatei ausgewählt wurde, öffnet die Funktion die Datei im Binärmodus (‚rb‘) und sendet das Bild als Foto an den Chat des Benutzers. Dabei wird die send_photo-Methode des Bots verwendet, die das Bild im Chat anzeigt.
  4. Fehlerbehandlung: Die Funktion enthält eine Fehlerbehandlung, falls beim Senden des Bildes ein Fehler auftritt. In diesem Fall wird der Fehler protokolliert, aber der Bot läuft weiter, um auf weitere Nachrichten zu warten und andere Aktionen auszuführen.

Weiter geht es mit der about Funktion:

async def about(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """
    This function sends a message to the user with information about the bot.
    """
    await context.bot.send_message(
        chat_id=update.effective_chat.id,
        text="DemoImageBot says:\nThis text is shown when the command /about is sent."
    )

Die Funktion wird aufgerufen, wenn der Bot den Befehl /about von einem Benutzer erhält. Sie akzeptiert zwei Argumente:

  • update: Ein Telegram-Update-Objekt, das Informationen über die eingehende Nachricht enthält.
  • context: Der Kontext für den Handler, der verschiedene Funktionen und Eigenschaften enthält, um mit dem Bot zu interagieren.

Die Funktion verwendet die send_message-Methode des Bots, um eine einfache Textnachricht an den Benutzer zu senden. Diese Nachricht enthält Informationen über den Bot und wird folgendermaßen formatiert:

Abschließend müssen wir noch unsere main Funktion anlegen. Diese wird ausgeführt, wenn wir unser Skript starten:

if __name__ == '__main__':
    # Create the Telegram bot application using the provided bot token
    # Replace 'YOUR_TELEGRAM_BOT_TOKEN' with your actual Telegram bot token
    application = ApplicationBuilder().token('YOUR_TELEGRAM_BOT_TOKEN').build()

    # Define the message handler for the 'message' event
    # Define keywords on which the bot will sen replies
    image_handler = MessageHandler(filters.Regex(re.compile(r'(Photo|Image)', re.IGNORECASE)), send_image)

    # Define the message handler for the 'command' event
    start_handler = CommandHandler('start', send_image)
    about_handler = CommandHandler('about', about)


    application.add_handler(image_handler)
    application.add_handler(start_handler)
    application.add_handler(about_handler)

    print("Bot is running...")
    application.run_polling()
  1. Anwendungserstellung: Das Hauptprogramm erstellt eine Telegram-Bot-Anwendung mithilfe des bereitgestellten Bot-Tokens. Das Token dient als Authentifizierung, um den Bot mit der Telegram-API zu verbinden. Du musst das Token YOUR_TELEGRAM_BOT_TOKEN durch deinen eigenen Telegram-Bot-Token ersetzen, der dir von BotFather (dem Bot, der Telegram-Bots verwaltet) zur Verfügung gestellt wurde.
  2. Nachrichten-Handler: Das Hauptprogramm definiert einen Nachrichten-Handler für das ‚message‘-Ereignis. Der Handler wird aktiviert, wenn der Bot eine Nachricht von einem Benutzer empfängt. Der Handler überprüft die empfangene Nachricht auf Schlüsselwörter ‚Photo‘ oder ‚Image‘ (unabhängig von der Groß-/Kleinschreibung) und ruft dann die Funktion send_image auf, um ein zufälliges Bild aus dem ‚Images‘-Verzeichnis an den Benutzer zu senden.
  3. Befehls-Handler: Das Hauptprogramm definiert zwei Befehls-Handler für die Befehle ‚/start‘ und ‚/about‘. Diese Handler werden aktiviert, wenn der Benutzer den jeweiligen Befehl eingibt. Wenn der Benutzer ‚/start‘ eingibt, wird die Funktion send_image aufgerufen, um ein zufälliges Bild zu senden. Wenn der Benutzer ‚/about‘ eingibt, wird die Funktion about aufgerufen, um Informationen über den Bot zu senden.
  4. Handler-Registrierung: Die erstellten Nachrichten- und Befehls-Handler werden der Anwendung hinzugefügt. Dadurch kann die Anwendung auf eingehende Nachrichten und Befehle reagieren und die entsprechenden Funktionen aufrufen.
  5. Bot-Ausführung: Die Anwendung wird im Polling-Modus gestartet, was bedeutet, dass der Bot aktiv auf neue Ereignisse und Befehle wartet und entsprechende Handler aufruft. Die Ausführung des Bots beginnt, und er wird in Betrieb genommen.

Jetzt haben wir unser Python Skript soweit vervollständigt, dass der ersten Ausführung nichts mehr im Wege steht.

Hier noch mal das ganze Skript:
import os, random, re, logging          
from telegram import Update
from telegram.ext import ApplicationBuilder, MessageHandler, ContextTypes, CommandHandler, filters


#Basic logging funktion in the file log_file.log
logging.basicConfig(
    filename='log_file.log',
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    level=logging.INFO
)

#get all images inside of the folder "Images"
file_list = os.listdir("Images")


async def send_image(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """
    This function sends a random image from the 'Images' directory to the user.
    """
    logging.info("New Message:")
    logging.info(update.message.chat_id)

    try:
        photo_filename = random.choice(file_list)
        photo_path = os.path.join("Images", photo_filename)

        with open(photo_path, 'rb') as photo_file:
            await context.bot.send_photo(chat_id=update.effective_chat.id, photo=photo_file)
    except Exception:
        logging.info("ERROR: " + photo_path)

async def about(update: Update, context: ContextTypes.DEFAULT_TYPE):
    """
    This function sends a message to the user with information about the bot.
    """
    await context.bot.send_message(
        chat_id=update.effective_chat.id,
        text="DemoImageBot says:\nThis text is shown when the command /about is sent."
    )

if __name__ == '__main__':
    # Create the Telegram bot application using the provided bot token
    # Replace 'YOUR_TELEGRAM_BOT_TOKEN' with your actual Telegram bot token
    application = ApplicationBuilder().token('6101315012:AAGa5OpKpglRUUk-tXlB9fb4NHkqHnTiVxY').build()

    # Define the message handler for the 'message' event
    # Define keywords on which the bot will sen replies
    image_handler = MessageHandler(filters.Regex(re.compile(r'(Photo|Image)', re.IGNORECASE)), send_image)

    # Define the message handler for the 'command' event
    start_handler = CommandHandler('start', send_image)
    about_handler = CommandHandler('about', about)


    application.add_handler(image_handler)
    application.add_handler(start_handler)
    application.add_handler(about_handler)

    print("Bot is running...")
    application.run_polling()

Ausführen des Bot-Skripts

Das Skript ist angelegt und jetzt geht es an das Ausführen. Grundsätzlich arbeitet unser Skript mit der Polling-Methode. Das bedeutet, dass der Bot aktiv auf neue Nachrichten und Befehle von Benutzern wartet, indem er wiederholt Abfragen an die Telegram-Server stellt. Der Bot nutzt für die Anfragen das HTTPS Protokoll, wodurch auf den meisten Systemen keine Portfreigabe oder Konfiguration an der Firewall notwendig sind. Das Skript kann auf allen Rechnern mit Python Support und Internet betrieben werden. Wer den Bot aber kontinuierlich und für alle zugänglich betreiben möchte, sollte die Nutzung eines VPS´s in Erwägung ziehen.

Ein VPS (Virtual Private Server) ist ein gemieteter Server, der sich seine Ressourcen mit anderen Benutzern teilt. Jeder Nutzer erhält ein eigenes virtualisiertes System, auf das nur die Nutzer mit entsprechenden Rechten Zugriff haben. Der Vorteil eines VPS´s sind die niedrigen Kosten und die gute Verwaltung. Für meinen Bot nutze ich einen Linux-VPS von Contabo.

Wenn wir das Skript mit den Bildern auf unser System kopiert haben und sichergestellt haben, dass alle Abhängigkeiten erfüllt sind (Imports) können wir das Skript unter Linux einfach über den folgenden Befehl starten:

python3 main.py &

Das & führt das Skript im Hintergrund aus und sorgt zudem dafür, dass dieses weiter läuft, auch wenn die SSH Verbindung oder Sitzung getrennt wird. Um das Skript zurück in den Vordergrund zu bekommen kann der Befehl fg genutzt werden.

Jetzt müssen wir den Bot nur noch in Telegram als Nutzer suchen und das wars auch schon. Unser Bot antwortet jetzt auf unsere definierten Nachrichten und schickt jedes mal ein zufälliges Bild als Antwort.

0 Comments

Was ist deine Meinung?

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>