Python Telegram Bot – Nachrichten empfangen und beantworten 🤖

Heute schreiben wir einen einfachen Telegram-Bot, der Nachrichten empfangen und beantworten kann. Ich bin Chris und das ist Programmieren mit Chris. Viel Spaß!

Unser Bot soll am Ende wie folgt funktionieren. Er soll grundsätzlich erstmal auf Nachrichten warten und je nachdem, was wir ihm schreiben, unterschiedlich antworten. Wenn ich z.B. „hi“ schreibe, soll der Bot mir auch Hallo sagen. Und wenn ich etwas schreibe, was der Bot nicht erwartet hat, soll er auch eine passende Antwort parat haben.

Wir benutzen heute das Telegram-Bot-Modul. Das installieren wir ganz einfach mit folgendem Befehl:

pip3 install python-telegram-bot

Aus diesem Paket importieren wir uns jetzt Teil, den wir heute brauchen. Das ist der gesamte Bereich mit dem Namen telegram.ext und entsprechend schreiben wir folgenden Befehl:

Vorbereitung

from telegram.ext import * 

Die Verknüpfung zwischen unserem Skript und Telegram passiert über eine API-Schnittstelle. Für die brauchen wir einen API Key. Im ersten Video habe ich euch ja bereits gezeigt, wie ihr an einen solchen API-Code kommt.

Ich zeig euch das trotzdem nochmal in Kurzform. Als erstes öffnen wir Telegram. Dort suchen wir dann nach dem BotFather.

Ein Chatfenster mit dem Botfather mit einer Begrüßungsnachricht.
So sieht die Begrüßung des BotFathers aus.

Danach klicke ich auf „Starten“ und gebe ein:

/newbot

Als erstes gebe ich meinem Bot einem Namen, z.B. Bernd Stromberg. Dann braucht mein Bot noch einen Usernamen, der mit _bot endet. Ich nenne meinen Bot.

Als Antwort erhalte ich jetzt einen API Key. Und den nehme ich gleich mal mit in mein Skript.

API_KEY = '2089asdaa:AAEcadfasdfasdfasdfsYxrJv70UIQArs1YQ'

Nachrichten empfangen

Uns Skript braucht zuerst einmal einen Updater. Der Updater nimmt die Nachrichten, die wir dem Bot schreiben an. Und dann brauchen wir noch einen Dispatcher. Der kümmert sich sozusagen um die ganze Logistik, schickt also die Nachrichten über Telegram auf die Reise.

def main():
    updater = Updater(API_KEY)                                      # updater empfängt die Anfrage und gibt sie
    dp = updater.dispatcher    

Damit unser Dispatcher Nachrichten entgegennehmen kann, müssen wir einen MessageHandler hinzufügen. Das geht folgendermaßen:

    dp.add_handler(MessageHandler(Filters.text, handle_message))

    updater.start_polling(0)

Die Funktion start_polling sorgt einfach dafür, dass der Bot beginnt, auf Nachrichten zu warten. Der Filter bestimmt, auf welche Art von Inhalten der Bot später reagieren soll. Und handle_message ist die Funktion, die wir aufrufen, sobald eine Nachricht eintrifft.

Nachrichten beantworten

Immer wenn eine Nachricht jetzt beim Dispatcher eintrifft, gibt der Dispatcher zwei Informationen weiter. Einmal das Update selbst und dann noch dessen Context. Beide Informationen fangen wir mit unserer Funktion auf.

Wir lassen uns auch gleich mal das Update und den Context ausgeben.

def handle_message(update, context):                 
    print(update, context)

Genau genommen kann unser Bot jetzt schon Nachrichten empfangen. Probieren wir das aus!

{'message': {'channel_chat_created': False, 'text': 'asdf', 'delete_chat_photo': False, 'new_chat_members': [], 'message_id': 31, 'new_chat_photo': [], 'date': 1633806064, 'caption_entities': [], 'entities': [], 'supergroup_chat_created': False, 'group_chat_created': False, 'photo': [], 'chat': {'type': 'private', 'first_name': 'Chris', 'username': 'christopf', 'id': 81102618}, 'from': {'first_name': 'Chris', 'username': 'christopf', 'is_bot': False, 'id': 81102618, 'language_code': 'de'}}, 'update_id': 920648929} <telegram.ext.callbackcontext.CallbackContext object at 0x10d7cfba0>

Von den ganzen Daten, die unser Update enthält, brauchen wir ja eigentlich nur den Text. Genau deshalb holen wir uns den Text jetzt aus dem Update heraus.

    text = update.message.text

Und jetzt wo wir den Text haben, können wir eine Antwort generieren. Dafür erstelle ich jetzt eine neue Funktion, die die Nutzereingabe entgegennimmt und auf sie antwortet.

def create_responses(input_text):                  
    if input_text == "hi":
        return "Hey ho!"
    else:
        return 'Das habe ich nicht verstanden.'

Die Funktion rufen wir jetzt immer auf, wenn ein Update reinkommt. Deshalb ergänzen wir jetzt noch einmal die handle_message-Funktion.

    response = create_responses(text)

Und zu guter Letzt schicken wir die Antwort an den Nutzer aus.

    update.message.reply_text(response)

Unser Skript ist jetzt fast fertig. Wir müssen nur noch mit der name equals main-Funktion festlegen, dass unsere main-Funktion aufgerufen werden soll, sobald wir das Skript direkt starten.

if __name__ == "__main__":
    main()

Und damit haben wir es geschafft!

✅ Kompletter Quellcode:

from telegram.ext import *


API_KEY = '123qwertzuiop1234567890qwertzui234567890'


def handle_message(update, context):
    # print(update, context)
    text = update.message.text

    response = create_responses(text)
    update.message.reply_text(response)


def create_responses(input_text):
    if input_text == 'hi':
        return 'Hey ho!'
    else:
        return 'Das habe ich nicht verstanden.'


def main():
    updater = Updater(API_KEY)
    dp = updater.dispatcher

    dp.add_handler(MessageHandler(Filters.text, handle_message))

    updater.start_polling(0)


if __name__ == "__main__":
    main()