- Bots für Facebook
- Anmeldung und Freischaltung
- Verifizierung
- Struktur von Nachrichten
- Verarbeitung von Nachrichten
- Anwendungsfall römische Ziffern
- Auswertung der Eingaben: Besonderheiten berücksichtigen
- Strukturierte Antworten mit Schaltflächen
- Installation
- Deployment
- Verbreitung
- Fazit: Nach dem Anmeldeprozess fängt die eigentliche Arbeit an
Schritt für Schritt zur Chat-Anwendung für Facebooks Nachrichten-App: So entwickelst du einen Messenger-Bot
Wie war das mit den römischen Ziffern, fragte sich offenbar die 85-jährige Oma von Twitter-Nutzer Ben. Der fand jedenfalls folgende Suche seiner Großmutter in seinem Browser: „Bitte übersetze diese römischen Ziffern mcmxcviii, Danke“. Nicht nur waren zehntausende Twitter-Nutzer von dieser Anfrage gerührt, auch Google selbst ließ sich via Twitter zu einer Antwort hinreißen. Einziges Manko: Die Antwort dauerte für Google-Verhältnisse Äonen, nämlich sechs Tage. Das muss doch auch besser gehen! Und wenn wir schon bei natürlich-sprachlichen Anfragen sind – was liegt da näher, als einen Bot mit dieser Anfrage zu betrauen?
In den Medien fanden zuletzt vor allem Chat-Bots [1] große Aufmerksamkeit, auch wegen unrühmlicher „Erfolge“ beim Erlernen nicht erwünschter Dialoge. Sie erlauben im besten Fall kurzweilige, aber letztlich ergebnislose Gespräche. Weitaus interessanter sind da die Assistenz-Bots, die in t3n Nr. 44 vorgestellt wurden. Mit ihrer Hilfe kann ich Flüge buchen, das Wetter erfragen oder eben – wie in unserem folgenden einfachen Beispiel – römische Ziffern in arabische übersetzen lassen.
Bots für Facebook
Anfang des Jahres hat Facebook seinen populären Messenger-Dienst für Dritte geöffnet. Seitdem ist es möglich, in die Kommunikation zwischen einem Facebook-Nutzer und einer Seite einzugreifen beziehungsweise diese ganz durch ein Programm (= Bot) zu übernehmen.
Man benötigt dazu einen Facebook-Account, Admin-Rechte für eine Facebook-Page und einen, bei Facebook „Webhook“ genannten, öffentlich erreichbaren Dienst, der HTTP-POST-Requests für jede an die entsprechende Facebook-Page gesendete Nachricht entgegennimmt. Durch dieses Verfahren ist es prinzipiell mit jeder Plattform möglich, entsprechende Bots zu entwickeln. Für diesen Artikel haben wir uns für Node.js entschieden. PHP-, Java- oder .NET-Entwickler sollten aber ohne Probleme in der Lage sein, die Struktur in ihre Sprache der Wahl zu übersetzen. Der Code zu unserem Bot ist vollständig auf GitHub [2] zu finden und frei verwendbar.
Anmeldung und Freischaltung
Vor dem Spaß hat Facebook die Anmeldung gesetzt. Die initiale Erzeugung einer Messenger-Integration ist noch vergleichsweise einfach: Unter developers.facebook.com/apps erzeugt der Entwickler eine neue „App“. Die hierbei abgefragten Angaben zu Namen und Kategorie sind nebensächlich, da sie Nutzern ohnehin nicht angezeigt werden. Anschließend wählt er im „Product Setup“ die Option „Messenger“ aus. Hierdurch erhält die angelegte App Zugriffsrechte auf die ausgewählte Facebook-Page. Anschließend erhält man einen „Page Access Token“. Dieser ist später notwendig, um auf eingehende Nachrichten auch via Facebook-Graph-API antworten zu können.
Komplizierter wird es bei der Freischaltung, dem App-Review. Um Nutzer vor einer Flut an Spam-Bots zu bewahren, hat Facebook den Anmeldeprozess relativ aufwendig gestaltet. Neben allerlei Einwilligungen und Erklärungen muss man vor allem umfangreiche Beschreibungen des Bots hochladen, inklusive verschiedener Logos und einem Video, das die Interaktion mit dem Bot zeigt.
Die Freischaltung selbst ist dann offensichtlich ein manueller Prozess, wie die spätnächtlichen englisch-sprachlichen Anfragen chinesischer Facebook-Mitarbeiter in unserem Fall zeigten. Da unser Bot kein Englisch verstand und zudem im Entwicklungsstadium auch nicht immer stabil zur Verfügung stand, bekamen wir im ersten Versuch noch keine Freigabe. Erst ein zweiter Anlauf mit mitgeschicktem Chatverlauf samt englischer Übersetzung führte zum Erfolg. Zwischen Anmeldung und Freigabe vergehen in der Regel einige Tage. Das sollte bei Bot-Projekten unbedingt berücksichtigt werden.
Zum Glück lassen sich Bots auch schon vor der Freischaltung durch Facebook programmieren, allerdings stehen diese dann nur Admins und eingetragenen Testnutzern zur Verfügung. Aufrufe anderer Nutzer werden schlicht nicht an den Webhook weitergeleitet.
Verifizierung
Zur Verbindung einer Facebook-Page mit einem Bot sendet Facebook einmalig einen generierten Code an den implementierten Webhook. Diesen Webhook und ein von der Anwendung zu prüfendes Token muss in den App-Settings unter „Setup Webhooks“ eingetragen werden. Dazu gibt man im Dialog „New Page Subscription“ die URL zum Webhook und den „Verify Token“ an. Für unseren Anwendungsfall müssen wir unter „Subscription Fields“ Häckchen bei „messages“ und gegebenenfalls „messaging_options“ setzen.
Facebook ruft daraufhin den angegebenen Webhook via GET mit einem zufälligen Code und dem selbst gewählten Verify-Token als Parameter auf. Unser Bot muss nun nur noch den Token überprüfen und den von Facebook übermittelten Code im Erfolgsfall wieder zurücksenden. Wenn dieser Schritt erfolgreich war, sendet Facebook über eben diesen Webhook nun alle folgenden Nachrichten via POST-Methode.
function webhookGet(req, res) { if (req.query['hub.verify_token'] === 'AveCaesar') { res.send(req.query['hub.challenge']); } else { res.send('Error, wrong validation FB_ACCESS_TOKEN'); } }
Listing 1
Struktur von Nachrichten
Jede Nachricht an die registrierte Seite löst einen entsprechenden Aufruf des registrierten Webhooks aus. Dieser Aufruf beinhaltet neben der eigentlichen Nachricht des Nutzers auch noch einige Metainformationen wie etwa die User-ID des Absenders, die zum Schicken von Antworten notwendig ist. Auch erhält man von der Facebook-Graph-API einige Informationen zum Nutzer selbst, zum Beispiel seinen Namen. Das macht die Kommunikation zwischen Anwender und Bot deutlich persönlicher.
Der wichtigste Teil der übermittelten Daten ist der Nachrichtentext selbst. Hier muss der Bot-Entwickler bei der Implementierung ein wenig aufpassen. Nicht alle Requests, die Facebook sendet, enthalten auch tatsächlich Nachrichten. Neben speziellen Requests, mit denen ein Nutzer beispielsweise über entsprechende Facebook-Plugins den Bot anpingen kann, kommt es aus bisher nicht bekannten Gründen gelegentlich zu leeren Aufrufen. Die Requests sind also vor der weiteren Verarbeitung immer erst darauf zu prüfen, ob sie die notwendigen Attribute – den Nachrichtentext und die Absender-ID – auch enthalten.
Verarbeitung von Nachrichten
Die Nutzererfahrung mit dem Bot steht und fällt mit der Fähigkeit, möglichst flexibel auf Nutzereingaben zu reagieren. Wenn unser Bot nur Kommandos im Stile einer Unix-Shell versteht, ist die Akzeptanz in der Breite beschränkt. Gleichzeitig ist es alles andere als trivial, schon die Intention einfacher Anfragen zu „verstehen“. Beispiel: Wie viele verschiedene Arten, jemanden zu begrüßen, gibt es? Es sind mehr, als man denkt.
Darüber hinaus scheint die natürlich-sprachliche Kommunikation mit dem Bot-Anwender dazu zu verleiten, auch einmal jenseits des eigentlichen Anwendungszwecks Gesprächsversuche zu starten. Es kann nie schaden, seinem Bot beizubringen, auch auf Fragen nach dem Wetter, den Lottozahlen und Beschimpfungen zu reagieren.

Anwendungsfall römische Ziffern
In unserem kleinen Beispiel, der Übersetzung römischer Ziffern, ist die Erkennung des für uns relevanten Inhalts noch vergleichsweise einfach. Wir suchen im Text eine Abfolge von (in der Regel Groß-)Buchstaben aus der Menge (M, D, C, X, L, V, I). Mit dieser Regel lässt sich ein regulärer Ausdruck definieren, der aus beliebigen Texten passende Abschnitte herausfiltert. Der Rest sind dann ein paar Code-Zeilen mit „if-then“-Anweisungen und ein wenig Addition. Der entsprechende Code findet sich ebenfalls im GitHub-Repository.
In realistischeren Anwendungssszenarien mögen einfache reguläre Ausdrücke nicht mehr ausreichen. Inzwischen gibt es einige Anbieter am Markt, die mittels Machine-Learning versuchen, die variantenreiche natürliche Sprache in ihrer Komplexität auf die jeweils dahintersteckende „Intention“ zu reduzieren. Nach unseren Recherchen scheidet diese Herangehensweise aufgrund der für Machine-Learning-Algorithmen in der Regel zu kleinen Anzahl an Trainingsdaten aber aus.
let regex = /^(?=[MDCLXVI])M*(C[MD]|D?C{0,3})(X[CL]|L?X{0,3})(I[XV]|V?I{0,3})$/; let match = regex.exec(message);
Listing 2
Als hilfreich für die Imitation menschlicher Interaktion hat sich erwiesen, auch auf identische Anfragen möglichst variantenreich zu reagieren. Dazu hinterlegt man für eine Anfrage mehrere mögliche Antwort-Formulierungen, von denen der Bot dann zufällig eine auswählt. Das gilt insbesondere für die Antwort auf nicht verstandene Anfragen. Hier sollte man Nutzern auch Gelegenheit geben, an den Limitierungen des Bots vorbei mit einem echten Menschen Kontakt aufzunehmen. Denn wer möchte schon bis ans Ende seiner Tage in einer „Ich habe Sie leider nicht verstanden“-Schleife hängen bleiben?
Auswertung der Eingaben: Besonderheiten berücksichtigen
Nach Extraktion und Interpretation der Anfrage und in unserem Fall „Übersetzung“ der römischen Ziffern muss der Anwender noch unsere Antwort erhalten. Dies erfolgt über die Facebook-Graph-API. Hierzu benötigt man den bei der Erzeugung der App erhaltenen Access-Token sowie die Nutzer-ID aus der ursprünglichen Nachricht.
Auch hier müssen wieder Sonderfälle berücksichtigt werden: Nutzer können in ihren Einstellungen die Nutzung von Apps oder Plugins, von Facebook „Plattform“ genannt, komplett deaktivieren. Das hindert solche Nutzer jedoch nicht daran, Nachrichten an euren Bot zu schicken. Beim Versuch, weitere Informationen über solche Nutzer via Facebook-Graph-API zu erhalten oder eine Antwort zu schicken, erhält man allerdings eine Fehlermeldung.
Außerdem dürfen über die API geschickte Nachrichten nicht länger als 320 Zeichen sein. Hier sollte euer Code im Zweifel längere Nachrichten in sinnvolle Häppchen (Sätze) aufteilen.
Strukturierte Antworten mit Schaltflächen
Als eine Besonderheit von Facebook-Bots, die die Nutzung insbesondere für transaktionale Systeme wie Shops vereinfachen soll, bietet Facebook neben reinen Textnachrichten auch strukturierte Antworten. Hier werden im Messenger dann Schaltflächen angezeigt, die der Nutzer anklicken kann, statt eine Antwort einzutippen. Das erspart auf der Bot-Seite das Parsen der Nachrichten, nimmt dem Bot aber auch das „Menschliche“ und macht ihn mehr zu einer klassischen Website.
curl -X POST -H "Content-Type: application/json" -d '{ "recipient":{ "id":"USER_ID" }, "message":{ "attachment":{ "type":"template", "payload":{ "template_type":"button", "text":"What do you want to do next?", "buttons":[ { "type":"web_url", "url":"https://petersapparel.parseapp.com", "title":"Show Website" }, { "type":"postback", "title":"Start Chatting", "payload":"USER_DEFINED_PAYLOAD" } ] } } } }' https://graph.facebook.com/me/messages?access_token=<PAGE_ACCESS_TOKEN>
Listing 3
Installation
Um unsere Demo-Anwendung auszuprobieren und auf dieser Basis eure eigenen Bots zu entwickeln, lässt sich unser Git-Repository klonen. Welche Schritte dazu genau notwendig sind, steht in der Readme-Datei. Voraussetzung ist eine aktuelle Node.js-Installation.
Deployment
Damit Facebook einen Bot auch erreichen kann, müssen dessen Webhooks öffentlich verfügbar sein. Wir müssen dazu nach der lokalen Entwicklung unseren Bot also noch deployen. Besonders einfach und für unsere Zwecke sogar kostenlos geht das zum Beispiel bei Heroku.com. Via Kommandozeile lassen sich unsere lokalen Änderungen in das automatisch angelegte Git-Repository bei Heroku pushen. Dort wird das Projekt dann gebaut und steht anschließend für uns und Facebook zur Verfügung [3].

Verbreitung
Der Bot ist nach Freigabe durch Facebook nun für alle Welt zugänglich. Anwender können einen Chat starten, indem sie der Seite, mit der der Bot verknüpft wurde, eine Nachricht schicken. Noch einfacher geht es mit den von Facebook zur Verfügung gestellten Plugins. Durch die Integration auf der eigenen Website lassen sich Besucher so direkt in eine Interaktion mit dem Bot bringen. Eine weitere Möglichkeit sind „Messenger Codes“, eine besondere Form von QR-Codes, die mit der Facebook-Messenger-App gescannt werden können und Anwender in den Chat leiten. Ihr könnt euch so einen Code für eure Seite im Bereich „Nachrichten“ unten links über das „i“ herunterladen.
Fazit: Nach dem Anmeldeprozess fängt die eigentliche Arbeit an
Wenn man vom Anmeldeprozess bei Facebook absieht, ist das Grundgerüst eines Bots dank leicht verständlicher Schnittstellen schnell erstellt. Die eigentliche Arbeit beginnt dann aber erst, denn ein Bot lebt davon, flexibel mit verschiedenen Formulierungen, Schreibweisen und Rechtschreibfehlern umzugehen und „menschlich“ darauf zu antworten. Tests mit Nutzern zeigen, dass sie von der Flexibilität eines Messengers fleißig Gebrauch machen, obwohl sie wissen, dass sie nur mit einer Maschine reden. Hier werden in nächster Zeit sicher noch eine Menge Frameworks und Tools entstehen, die den Umgang mit dieser Thematik erleichtern. Denn schließlich wollen Chatbot-Entwickler sich auf die Lösung eines Nutzerproblems konzentrieren und nicht in die Niederungen deutscher Grammatik einsteigen.