Erstelle einen WhatsApp-Chatbot mit Python

November 20, 2019
Autor:in:

Build a WhatsApp Chatbot with Python, Flask and Twilio

Ein Chatbot ist eine Softwareanwendung, die ein Gespräch mit einem menschlichen Nutzer in geschriebener oder gesprochener Sprache führen kann. Der Grad der „Intelligenz“ von Chatbots kann sehr unterschiedlich sein. Während einige Chatbots ein eher einfaches Sprachverständnis zeigen, setzen andere hochkomplexe Algorithmen künstlicher Intelligenz (KI) und maschinelles Lernen (ML) ein, um ein nahezu menschliches Konversationsniveau zu erreichen.

In diesem Tutorial zeige ich Ihnen, wie einfach Sie einen Chatbot für WhatsApp mit der Twilio-API für WhatsApp und dem Flask-Framework für Python erstellen können. Unten sehen Sie ein Beispiel für eine Interaktion, die ich mit diesem Chatbot hatte:

WhatsApp chatbot demo session

Anforderungen für das Tutorial zum WhatsApp-Chatbot

Für dieses Tutorial benötigen Sie Folgendes:

  • Python 3.6 oder höher. Wenn Ihr Betriebssystem keinen Python-Interpreter bereitstellt, können Sie unter python.org einen Installer herunterladen.
  • Flask. Wir erstellen eine Webanwendung, die damit auf eingehende WhatsApp-Nachrichten reagiert.
  • ngrok. Dieses praktische Dienstprogramm verwenden wir, um die Flask-Anwendung auf Ihrem System mit einer öffentlichen URL zu verbinden und Twilio damit zugänglich zu machen. Das ist für die Entwicklungsversion des Chatbots notwendig, da sich Ihr Computer wahrscheinlich hinter einem Router oder einer Firewall befindet, sodass er nicht direkt über das Internet erreichbar ist. Wenn Sie ngrok noch nicht installiert haben, können Sie es für Windows, MacOS oder Linux herunterladen.
  • Ein Smartphone mit einer aktiven Telefonnummer und installiertem WhatsApp.
  • Ein Twilio-Konto. Wenn Sie neu bei Twilio sind, dann erstellen Sie jetzt ein kostenloses Konto. Sie können die Vorteile und Einschränkungen eines kostenlosen Twilio Kontos nachlesen.

WhatsApp-Chatbot erstellen

Die folgenden Abschnitte bieten Ihnen alles Notwendige zum Konfigurieren und Erstellen eines WhatsApp-Chatbots mit Python und dem Flask-Framework.

Twilio-WhatsApp-Sandbox konfigurieren

Twilio bietet eine WhatsApp-Sandbox, in der Sie Ihre Anwendung einfach entwickeln und testen können. Wenn Ihre Anwendung fertig ist, können Sie eine Produktionsfreischaltung für Ihre Twilio-Telefonnummer anfordern, wozu eine Genehmigung von WhatsApp erforderlich ist.

Verbinden wir nun Ihr Smartphone mit der Sandbox. Wählen Sie in Ihrer Twilio-Konsole Messaging aus, klicken Sie auf „Try it Out“ (Ausprobieren) und dann auf Send a WhatsApp message (Sende eine WhatsApp Nachricht). Auf der WhatsApp-Sandbox-Seite finden Sie die Ihrem Konto zugewiesene Sandbox-Nummer und einen Join Code (Teilnahmecode).

WhatsApp Sandbox set up screenshot

Um die WhatsApp-Sandbox für Ihr Smartphone zu aktivieren, senden Sie eine WhatsApp-Nachricht mit dem angegebenen Code an die Ihrem Konto zugewiesene Nummer. Der Code beginnt mit „join“, gefolgt von einer zufällig generierten Zwei-Wort-Phrase. Kurz nachdem Sie die Nachricht gesendet haben, sollten Sie eine Antwort von Twilio erhalten, dass Ihre Handynummer mit der Sandbox verbunden ist und mit dem Senden und Empfangen von Nachrichten beginnen kann.

Dieser Schritt muss für alle weiteren Handys, die Sie mit Ihrer Sandbox verbinden wollen, wiederholt werden.

Virtuelle Python-Umgebung erstellen

Entsprechend den üblichen Python-Praktiken erstellen wir ein separates Verzeichnis für unser Chatbot-Projekt und darin eine virtuelle Umgebung. Danach installieren wir die Python-Pakete, die wir für unseren Chatbot benötigen.

Bei einem Unix- oder Mac-Betriebssystem öffnen Sie ein Terminal und geben folgende Befehle ein, um die oben beschriebenen Aufgaben auszuführen:

$ mkdir whatsapp-bot
$ cd whatsapp-bot
$ python3 -m venv whatsapp-bot-venv
$ source whatsapp-bot-venv/bin/activate
(whatsapp-bot-venv) $ pip install twilio flask requests

Wer diesem Tutorial mit einem Windows-Rechner folgt, gibt die folgenden Befehle in eine Kommandozeile ein:

$ mkdir whatsapp-bot
$ cd whatsapp-bot
$ python3 -m venv whatsapp-bot-venv
$ whatsapp-bot-venvScripts\activate
(whatsapp-bot-venv) $ pip install twilio flask requests

Der letzte Befehl verwendet pip, den Python-Paket-Installer, um die drei Pakete zu installieren, die wir in diesem Projekt verwenden werden, nämlich:

Zu Ihrer Information: Zum Zeitpunkt der Veröffentlichung dieses Tutorials waren dies die getesteten Versionen der genannten Pakete und deren Abhängigkeiten:

Jinja2-3.1.2 
MarkupSafe-2.1.1 
PyJWT-2.4.0 
Werkzeug-2.1.2 
certifi-2021.10.8 
charset-normalizer-2.0.12 
click-8.1.3 
flask-2.1.2 
idna-3.3 
importlib-metadata-4.11.3 
itsdangerous-2.1.2 
pytz-2022.1 
requests-2.27.1 
twilio-7.9.0 
urllib3-1.26.9 
zipp-3.8.0

Flask-Chatbot-Dienst erstellen

Nun kommen wir zum spannenden Teil: Wir bauen einen Chatbot!

Welche Art von Chatbot sich am besten für Sie eignet, ist weitgehend von Ihrer individuellen Situation abhängig. Für dieses Tutorial erstelle ich einen trivialen Chatbot, der zwei Schlüsselwörter in Nachrichten erkennt, die vom Benutzer gesendet werden, und auf sie reagiert. Wenn der Nutzer etwas schreibt, dass das Wort „Zitat“ enthält, dann soll der Chatbot mit einem zufälligen bekannten Zitat antworten. Wenn die Nachricht stattdessen das Wort „Katze“ enthält, wird ein zufälliges Katzenbild zurückgesendet. Sollte die Nachricht sowohl „Zitat“ als auch „Katze“ enthält, antwortet der Bot sowohl mit einem Zitat als auch einem Katzenbild.

Webhook

Die Twilio-API für WhatsApp verwendet eine Webhook, um eine Anwendung über eine eingehende Nachricht zu benachrichtigen. Unsere Chatbot-Anwendung muss einen Endpunkt definieren, der als dieser Webhook konfiguriert wird, sodass Twilio damit kommunizieren kann.

Das Flask-Framework macht es extrem einfach, einen Webhook zu definieren. Unten ist eine Skelettanwendung mit einer Webhook-Definition. Machen Sie sich keine Gedanken über das Kopieren dieses Codes. Ich zeige Ihnen zuerst alle verschiedenen Teile der Implementierung. Wenn Sie diese verstanden haben, zeige ich Ihnen, wie sie alle zu einer funktionierenden Anwendung kombiniert werden.

from flask import Flask

app = Flask(__name__)


@app.route('/bot', methods=['POST'])
def bot():
    # add webhook logic here and return a response


if __name__ == '__main__':
    app.run(port=4000)

Wenn Sie mit dem Flask-Framework nicht vertraut sind: Die zugehörige Dokumentation enthält einen Schnellstart-Abschnitt, mit dem Sie die Grundlagen schnell lernen können. Wenn Sie eine ausführlichere Lernressource wünschen, empfehle ich Ihnen mein Flask Mega-Tutorial.

Was den obigen Code betrifft, ist unbedingt zu berücksichtigen, dass die Anwendung einen Endpunkt /bot definiert, der POST-Anfragen empfängt. Für jede Nachricht eines Nutzers, die bei Twilio eingeht, wird dieser Endpunkt aufgerufen. Der Hauptteil der Funktion bot() analysiert die vom Nutzer gesendete Nachricht und gibt die richtige Antwort.

Nachrichten und Antworten

Das Erste, was wir in unserem Chatbot tun müssen, ist das Abrufen der vom Benutzer eingegebenen Nachricht. Diese Nachricht kommt in der Payload der POST-Anforderung mit dem Schlüssel ‘’Body’. Wir können über das Flask-request`-Objekt darauf zugreifen:

from flask import request
incoming_msg = request.values.get('Body', '').lower()

Da wir eine vereinfachte Textanalyse durchführen werden, habe ich den String zudem in Kleinbuchstaben konvertiert, sodass wir uns nicht um verschiedene Schreibweisen eines Wortes kümmern müssen.

Die Antwort, die Twilio vom Webhook erwartet, muss in TwiML (Twilio Markup Language), einer XML-basierten Sprache, gegeben werden. Die Twilio-Hilfsbibliothek für Python enthält Klassen, die das Erstellen dieser Antwort vereinfachen, da keine XML direkt erstellt werden muss. Unten sehen Sie, wie Sie eine Antwort erstellen, die Text- und Medienkomponenten enthält:

from twilio.twiml.messaging_response import MessagingResponse

resp = MessagingResponse()
msg = resp.message()
msg.body('Dies ist ein Beispieltext')
msg.media('https://example.com/path/image.jpg')

Beachten Sie, wie ein Bild zurückgegeben wird: Twilio erwartet statt des eigentlichen Bildes eine URL, die auf das Bild verweist.

Chatbot-Logik

Für die eigentliche Chatbot-Logik verwende ich einen sehr einfachen, aber überraschend effektiven Ansatz. Ich durchsuche die eingehenden Nachrichten nach den Schlüsselwörtern ’quote’ und ’cat’. Hier die Grundstruktur des Chatbots:

    responded = False
    if 'zitat' in incoming_msg:
        # Füge hier ein Zitat ein
        responded = True
    if 'katze' in incoming_msg:
        # Füge hier ein Katzenbild ein
        responded = True
    if not responded:
        # Gib eine Standardantwort zurück

Mit dieser einfachen Struktur können wir Erwähnungen von Zitaten und/oder Katzen erkennen und das Twilio-Antwortobjekt entsprechend konfigurieren. Der boolesche Wert responded hilft, den Fall zu verfolgen, in dem die Nachricht keines der von uns gesuchten Schlüsselwörter enthält, und in dem Fall eine generische Antwort zu liefern.

Drittanbieter-APIs

Um den Chatbot mit Originalzitaten und Katzenbildern zu versorgen, verwende ich zwei öffentlich zugängliche APIs. Für bekannte Zitate habe ich die Quotable API von Luke Peavey gewählt. Eine GET-Anfrage an https://api.quotable.io/random gibt ein zufälliges Zitat aus einem Pool von 1500 Zitaten im JSON-Format zurück.

Für die Katzenbilder nehme ich die Cat as a Service API von Kevin Balicot. Das ist eine sehr lustige API. Die URL https://cataas.com/cat gibt jedes Mal ein anderes Katzenbild zurück. (Das können Sie ausprobieren, indem Sie die URL in die Adresszeile des Browsers einfügen und dann auf Aktualisieren drücken, um ein neues Katzenbild zu erhalten). Das ist sehr praktisch, weil, wie bereits erwähnt, Twilio das Bild als URL für die Vorbereitung der TwiML-Antwort benötigt.

Alles beisammen

Jetzt haben Sie alle Aspekte der Chatbot-Implementierung gesehen. Wir sind jetzt also bereit, alle Teile in den vollständigen Chatbot-Service zu integrieren. Sie können folgenden Code in eine  bot.py-Datei kopieren:

from flask import Flask, request
import requests
from twilio.twiml.messaging_response import MessagingResponse
app = Flask(__name__)
@app.route('/bot', methods=['POST'])
def bot():
   incoming_msg = request.values.get('Body', '').lower()
   resp = MessagingResponse()
   msg = resp.message()
   responded = False
   if 'zitat' in incoming_msg:
       # return a quote
       r = requests.get('https://api.quotable.io/random')
       if r.status_code == 200:
           data = r.json()
           quote = f'{data["content"]} ({data["author"]})'
       else:
           quote = 'Bitte entschuldigen Sie. Ich konnte kein Zitat finden.'
       msg.body(quote)
       responded = True
   if 'katze' in incoming_msg:
       # return a cat pic
       msg.media('https://cataas.com/cat')
       responded = True
   if not responded:
       msg.body('Ich kenne mich leider nur mit Zitaten und Katzen aus.')
   return str(resp)
if __name__ == '__main__':
   app.run(port=4000)

WhatsApp-Chatbot testen

Bereit, den Chatbot zu testen? Nachdem Sie obigen Code in die  bot.py-Datei kopiert haben, starten Sie den Chatbot, indem Sie python bot.py ausführen. Dabei muss die virtuelle Python-Umgebung aktiviert sein. Die Ausgabe sollte etwa so aussehen:

(whatsapp-bot-venv) $ python bot.py
 * Serving Flask app 'bot' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:4000 (Press CTRL+C to quit)

Der Dienst wird jetzt als privater Dienst auf Port 4000 in Ihrem Computer ausgeführt und wartet dort auf eingehende Verbindungen. Um diesen Dienst vom Internet aus erreichbar zu machen, müssen wir ngrok verwenden.

Öffnen Sie ein zweites Terminalfenster und führen Sie den Befehl ngrok http 4000 aus, um diesem Port eine temporäre, öffentliche URL zuzuweisen. Bei einem Unix- oder Mac-Betriebssystem müssen Sie, wenn die ausführbare Datei ngrok in Ihrem aktuellen Verzeichnis vorhanden ist, möglicherweise ./ngrok http 4000 verwenden. Die Ausgabe von ngrok sollte etwa so aussehen:

Nicht schlecht! Hast du auch ein Bild von einer Katze?

Running ngrok to connect port 4000

 

Beachten Sie die Zeilen, die mit „Forwarding“ beginnen. Diese zeigen die öffentliche URL, die ngrok verwendet, um Anforderungen an unseren Dienst umzuleiten. Jetzt müssen wir Twilio anweisen, diese URL zu verwenden, um Benachrichtigungen über eingehende Nachrichten zu senden.

Gehen Sie zurück zur Twilio-Konsole, klicken Sie auf Messaging, dann auf Settings (Einstellungen) und schließlich auf WhatsApp sandbox settings (WhatsApp-Sandbox-Einstellungen). Kopieren Sie die https:// URL aus der ngrok-Ausgabe und fügen Sie sie in das Feld „When a message comes in“ (Bei eingehender Nachricht) ein. Da unser Chatbot unter der /bot-URL zugänglich ist, hängen Sie diese am Ende der ngrok-Root-URL an. Die Anforderungsmethode muss auf HTTP Post festgelegt sein. Vergessen Sie nicht, auf die rote Schaltfläche „Speichern“ unten auf der Seite zu klicken, damit diese Änderungen übernommen werden.

Twilio Sandbox for WhatsApp configuration screenshot

Jetzt können Sie anfangen, Nachrichten an den Chatbot von dem Smartphone aus zu senden, das Sie mit der Sandbox verbunden haben. Sie können beliebige Sätze eingeben. Jedes Mal, wenn die Wörter „Zitat“ und „Katze“ in Nachrichten erscheinen, ruft der Chatbot die Drittanbieter-APIs auf und gibt Ihnen einen aktualisierten Inhalt zurück. Falls Sie es am Anfang des Artikels verpasst haben, hier ein Beispiel für eine Konversation, die ich mit dem Chatbot geführt habe:

WhatsApp chatbot demo session

Denken Sie daran, dass es bei der kostenlosen Nutzung von ngrok einige Einschränkungen gibt. Insbesondere können Sie eine ngrok-URL nicht länger als 8 Stunden aufrechterhalten, und der Ihnen zugewiesene URL ist jedes Mal eine Andere, wenn Sie ngrok starten. Daher müssen Sie die URL in der Twilio-Konsole jedes Mal aktualisieren, wenn Sie ngrok neu starten.

WhatsApp-Bot bereitstellen

Ich hielt es für hilfreich, Ihnen am Ende dieses Tutorials eine Liste der Dinge zu geben, die zu beachten sind, wenn Sie einen WhatsApp-Chatbot für die Nutzung in der Produktion bereitstellen möchten.

Zunächst einmal haben Sie gesehen, dass es beim Starten der Flask-Anwendung eine etwas erschreckende Warnung darüber gibt, dass man keinen Entwicklungsserver für die Produktion verwenden sollte. Der Webserver, der mit Flask geliefert wird, ist sehr praktisch zum Entwickeln und Testen einer Anwendung, aber nicht robust genug, um die Anforderungen einer Produktionsnutzung zu erfüllen. Die beiden gängigsten produktionsfertigen Webserver für Python-Webanwendungen sind gunicorn und uWSGI. Beide können in Ihrer virtuellen Umgebung mit pip installiert werden. Hier ein Beispiel, wie Sie den Chatbot mit Gunicorn ausführen:

(whatsapp-bot-venv) $ gunicorn -b :4000 bot:app

Denken Sie auch daran, dass Sie bei einer Produktionsbereitstellung den Dienst auf einem Cloud-Server ausführen und nicht von Ihrem eigenen Computer aus, sodass Sie ngrok nicht verwenden müssen.

Mehr erfahren über WhatsApp-Chatbots

Unternehmen setzen zunehmend auf Chatbots, um ihren Kunden unmittelbaren Zugang zu Support, Vertrieb oder Marketing zu bieten. Ein Chatbot kann hilfreich sein, um Kundeninformationen zu sammeln, noch bevor ein Mensch beteiligt ist. Ein gut konzipierter Chatbot sollte auch in der Lage sein, gängige Kundenworkflows ganz ohne menschliche Unterstützung zu handhaben.

Ich hoffe, dieses Tutorial war nützlich und Sie haben jetzt eine bessere Vorstellung davon, wie Sie sich Ihren WhatsApp Chatbot bauen. Unten finden Sie einige weitere Ressourcen zum Erstellen von Chatbots mit Python, falls Sie weitere Implementierungen sehen möchten: