Anzeige
Anzeige
Anzeige
Anzeige
Verpasse keine News mehr!

Schritt für Schritt zur Chat-Anwendung für Facebooks Nachrichten-App: So entwickelst du einen Messenger-Bot

Chat- und Messenger-Bots sind in aller Munde – nicht zuletzt, seit Facebook seine großen Pläne für die automatisierte Kommunikation angekündigt hat. Und einen eigenen Chatbot zu programmieren und implementieren ist gar nicht so schwer. Wir zeigen anhand eines simplen Beispiels, wie das funktioniert.

8 Min.
Artikel merken
Anzeige
Anzeige

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?

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Anzeige
Anzeige

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.

Codebeispiel: Verifizierung
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.

Anzeige
Anzeige

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.

Damit der Bot menschlicher wird, gibt er als Antwort nicht nur das bloße Ergebnis in Zahlen wieder, sondern verpackt es in einer lockeren Formulierung, von denen mehrere Varianten zur Auswahl stehen sollten.
Damit der Bot menschlicher wird, gibt er als Antwort nicht nur das bloße Ergebnis in Zahlen wieder, sondern verpackt es in einer lockeren Formulierung, von denen mehrere Varianten zur Auswahl stehen sollten.

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.

Anzeige
Anzeige

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.

Codebeispiel: Parsen von römischen Ziffern
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.

Anzeige
Anzeige

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.

Anzeige
Anzeige
Beispiel für eine strukturierte Antwort
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].

Eine einfache Möglichkeit, den fertigen Bot in seine Website zu integrieren, ist der von Facebook generierte, individuelle QR-Code. Dieser leitet den Nutzer driekt in eine Konversation mit dem Chatbot.
Eine einfache Möglichkeit, den fertigen Bot in seine Website zu integrieren, ist der von Facebook generierte, individuelle QR-Code. Dieser leitet den Nutzer driekt in eine Konversation mit dem Chatbot.

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.

Mehr zu diesem Thema
Fast fertig!

Bitte klicke auf den Link in der Bestätigungsmail, um deine Anmeldung abzuschließen.

Du willst noch weitere Infos zum Newsletter? Jetzt mehr erfahren

Anzeige
Anzeige
Kommentare

Community-Richtlinien

Bitte schalte deinen Adblocker für t3n.de aus!
Hallo und herzlich willkommen bei t3n!

Bitte schalte deinen Adblocker für t3n.de aus, um diesen Artikel zu lesen.

Wir sind ein unabhängiger Publisher mit einem Team von mehr als 75 fantastischen Menschen, aber ohne riesigen Konzern im Rücken. Banner und ähnliche Werbemittel sind für unsere Finanzierung sehr wichtig.

Schon jetzt und im Namen der gesamten t3n-Crew: vielen Dank für deine Unterstützung! 🙌

Deine t3n-Crew

Anleitung zur Deaktivierung
Artikel merken

Bitte melde dich an, um diesen Artikel in deiner persönlichen Merkliste auf t3n zu speichern.

Jetzt registrieren und merken

Du hast schon einen t3n-Account? Hier anmelden

oder
Auf Mastodon teilen

Gib die URL deiner Mastodon-Instanz ein, um den Artikel zu teilen.

Community-Richtlinien

Wir freuen uns über kontroverse Diskussionen, die gerne auch mal hitzig geführt werden dürfen. Beleidigende, grob anstößige, rassistische und strafrechtlich relevante Äußerungen und Beiträge tolerieren wir nicht. Bitte achte darauf, dass du keine Texte veröffentlichst, für die du keine ausdrückliche Erlaubnis des Urhebers hast. Ebenfalls nicht erlaubt ist der Missbrauch der Webangebote unter t3n.de als Werbeplattform. Die Nennung von Produktnamen, Herstellern, Dienstleistern und Websites ist nur dann zulässig, wenn damit nicht vorrangig der Zweck der Werbung verfolgt wird. Wir behalten uns vor, Beiträge, die diese Regeln verletzen, zu löschen und Accounts zeitweilig oder auf Dauer zu sperren.

Trotz all dieser notwendigen Regeln: Diskutiere kontrovers, sage anderen deine Meinung, trage mit weiterführenden Informationen zum Wissensaustausch bei, aber bleibe dabei fair und respektiere die Meinung anderer. Wir wünschen Dir viel Spaß mit den Webangeboten von t3n und freuen uns auf spannende Beiträge.

Dein t3n-Team

Kommentar abgeben

Melde dich an, um Kommentare schreiben und mit anderen Leser:innen und unseren Autor:innen diskutieren zu können.

Anmelden und kommentieren

Du hast noch keinen t3n-Account? Hier registrieren