text: Erkennen von Prominenten mit der Twilio-API für WhatsApp, AWS Rekognition und Ruby
  Zum Erstellen dieser App benötigen wir ein paar Dinge:
  Ruby und Bundler
  ngrok zum Testen unserer WebHooks
  Wenn Twilio eine WhatsApp-Nachricht empfängt, sendet es eine HTTP-Anfrage (einen WebHook) an eine von uns bereitgestellte URL. Wir müssen eine Anwendung erstellen, die diese WebHooks empfangen, das Bild mit dem AWS Rekognition-Dienst verarbeiten und dann eine Nachricht als Antwort an Twilio zurücksenden kann.
  Wir erstellen ein Verzeichnis, in dem wir die Anwendung erzeugen möchten, und initialisieren eine neue Gemfile mit Bundler:
  Wir öffnen die Gemfile und fügen die Gems hinzu, die wir für diese Anwendung verwenden möchten:
  Wir nutzen Sinatra als Web-Framework, um die eingehenden WebHooks von Twilio zu empfangen. Wir benötigen außerdem das AWS-SDK zur Kommunikation mit dem Rekognition-Dienst. Envyable dient dazu, unsere Anmeldeinformationen in Umgebungsvariablen bei der Entwicklung zu speichern. Down ist ein Gem, mit dem das Herunterladen von Dateien ein Kinderspiel ist. Und mit dem twilio-ruby-Gem erzeugen wir die TwiML, damit wir eine Antwort an Twilio zurücksenden können.
  Wir führen bundle install aus, um die Gems zu installieren, und erstellen dann die anderen Dateien, die wir für diese App benötigen: app.rb, config.ru und config/env.yml. Damit ist die Vorbereitung abgeschlossen. Jetzt können wir mit dem Erstellen der Anwendung beginnen.
  Mit config.ru laden wir die Anwendung und führen sie aus. Wir fügen config.ru den folgenden Code hinzu:
  Dadurch müssen alle Abhängigkeiten in der Gemfile definiert werden. Außerdem wird unsere Konfiguration über Envyable in die Umgebung geladen und schließlich die Anwendung selbst geladen und ausgeführt. Als Nächstes erstellen wir die CelebritySpotting-App.
  Wir öffnen app.rb und erstellen eine neue Klasse:
  Wir benötigen einen Pfad zu einem Endpunkt, den wir als unsere WebHook-URL bereitstellen können. Twilio stellt standardmäßig eine POST-Anfrage, deshalb antwortet unser Endpunkt auf POST-Anfragen:
  Unsere Antwort wird als TwiML zurückgegeben, deshalb erstellen wir eine neue Twilio::TwiML::MessagingResponse und legen den Content-Type-Header auf application/xml fest:
  Um sicherzugehen, ob alles soweit funktioniert, fügen wir eine Nachricht hinzu, geben die TwiML als XML zurück und testen die Anwendung:
  Wir rufen die Anwendung über die Befehlszeile folgendermaßen auf:
  Die Anwendung wird unter http://localhost:9292 gestartet. Es gibt keine Benutzeroberfläche, deshalb führen wir den Test mithilfe von curl durch, um zu sehen, ob sich die Anwendung richtig verhält.
  Wir sehen, dass die Nachricht in der TwiML zurückgegeben wird. Jetzt können wir die Anwendung mit der Twilio-API für WhatsApp verbinden.
  Herstellen einer Verbindung zur Twilio-API für WhatsApp
  Twilio stellt eine Sandbox bereit, um WhatsApp-Integrationen zu testen, ohne dass wir darauf warten müssen, bis WhatsApp eine Twilio-Nummer genehmigt. Wir melden uns an der Twilio-Konsole an und folgen den Anweisungen zum Einrichten der WhatsApp-Sandbox.
  Nachdem wir die Sandbox eingerichtet haben, müssen wir eine WebHook-URL festlegen, damit wir die WhatsApp-Sandboxnummer konfigurieren können.
  Unsere App wird aktuell auf unserem Computer ausgeführt. Wir müssen also einen Tunnel zum öffentlichen Internet erstellen. Hier kommt ngrok ins Spiel. Zum Starten von ngrok führen wir den folgenden Befehl aus:
  Wenn wir diesen Befehl ausführen, erhalten wir eine öffentliche URL, die ungefähr so aussieht: https://RANDOM_STRING.ngrok.io. Wir kopieren diese ngrok-URL, fügen den /messages-Pfad hinzu und geben sie in unsere WhatsApp-Sandboxeinstellungen als URL ein, die aufgerufen werden soll, wenn eine Nachricht von WhatsApp eingeht.
  Wir speichern die Einstellungen für die WhatsApp-Sandbox und senden eine Nachricht an die Sandboxnummer. Wir sollten unsere Testnachricht zurückerhalten.
  Wir haben jetzt erfolgreich zu WhatsApp eine Verbindung hergestellt und können Nachrichten hin- und hersenden. Das bildet die Grundlage für die Arbeit mit den enthaltenen Bildern und ihrer Analyse mit AWS Rekognition.
  Empfangen und Herunterladen von Bildern
  Zu Beginn hatten wir das Down-Gem in die Anwendung eingefügt. Mit diesem Gem laden wir die Bilder herunter, die an unsere WhatsApp-Nummer gesendet werden.
  Wir rufen noch einmal die Datei app.rb auf und prüfen, ob die eingehende Nachricht Bilder enthält. Wenn ja, laden wir das erste Bild herunter.
  Twilio sendet alle erforderlichen Informationen im Text der WebHook-Anfrage. Wir suchen nach dem NumMedia-Parameter, der uns Aufschluss darüber gibt, ob Medien in der Nachricht enthalten sind. Falls dies der Fall ist, befindet sich die Bild-URL im MediaUrl0-Parameter.
  Anhand dieses MediaUrl0-Parameters können wir mit Down das Bild herunterladen. Wenn wir mit Down ein Bild herunterladen, erhalten wir eine Tempfile. Wir können diese Datei oder ihre Eigenschaften lesen.
  Wenn wir mit der Tempfile fertig sind, sollten wir sie mit der Methode close! schließen und die Verknüpfung aufheben, damit sie nicht unnötig Speicherplatz im Betriebssystem belegt. Wir müssen auch den Fall berücksichtigen, wenn kein Bild in der Nachricht enthalten ist. In einem solchen Fall können wir mit einer Nachricht antworten, in der wir um ein Bild bitten.
  Wir löschen die Testnachricht und fügen den folgenden Code hinzu:
  Wir starten die Anwendung neu und senden einige weitere Testnachrichten mit und ohne Bildern, um sicherzustellen, dass die Ergebnisse auch unseren Erwartungen entsprechen.
  Jetzt können wir endlich damit beginnen, nach Prominenten in den Bildern zu suchen. Zeit für AWS Rekognition.
  Bevor wir API-Aufrufe an AWS senden können, benötigen wir einen Zugriffsschlüssel und ein Geheimnis. In der AWS-Konsole erstellen wir einen Benutzer mit der AmazonRekognitionFullAccess-Richtlinie.
  AWS bietet viele Möglichkeiten, um Benutzer zu erstellen und Berechtigungen zu erteilen. Anhand des folgenden Beispiels können wir einen API-Benutzer mit Zugriff auf den Rekognition-Dienst erstellen.
  Wir beginnen auf der Startseite der AWS-Konsole. Dort wählen wir im Feld "Find Services" die Option "IAM" aus.
  Im Abschnitt "IAM" klicken wir in der linken Navigationsleiste auf das Menü "Users" und dann auf die Schaltfläche "Add user".
  Wir geben dem Benutzer einen Namen, aktivieren das Kontrollkästchen "Programmatic Access" und klicken dann auf "Next: Permissions".
  Wenn wir die Option "Attach existing policies directly" auswählen, wird eine Tabelle mit Richtlinien angezeigt. Wir suchen nach den Richtlinien für "Rekognition". Wir sehen drei Richtlinien. Unter den drei Richtlinien wählen wir die AmazonRekognitionFullAccess-Richtlinie mit der Beschreibung "Access to all Amazon Rekognition APIs" aus.
  Dann klicken wir auf "Next", bis wir die Erfolgsmeldung sehen.
  Auf dieser Seite finden wir die "Access key ID" und den "Secret access key". Wir speichern beide in der config/env.yml zusammen mit einer AWS-Region, in der Rekognition verfügbar ist, z. B. "us-east-1". Weitere Informationen über dieses Verfahren findest du in der Dokumentation zur Authentifizierung und Zugriffssteuerung für Rekognition.
  Um Prominente in Bildern zu erkennen, müssen wir jetzt einen Client erstellen, der die AWS-API verwendet und das Bild an den RecognizeCelebrities-Endpunkt sendet. Wir fügen innerhalb des begin-Blocks den folgenden Code hinzu:
  Das Ruby-AWS-SDK ruft automatisch unsere Anmeldeinformationen aus der Umgebung ab. Wir lesen dann das heruntergeladene Bild und senden es als Bytes an die recognize_celebrities-Methode des Clients.
  In der response sind alle Details zu den erkannten Gesichtern enthalten und dazu, ob es sich wahrscheinlich um Prominente handelt. Die Antwort können wir ganz nach unseren Wünschen erstellen. Ich habe mich dazu entschieden, dass in der Antwort enthalten sein soll, ob sich Prominente auf dem Bild befinden, oder falls dies nicht der Fall ist, wie viele Gesichter erkannt wurden:
  Außerdem habe ich eine kurze Hilfsfunktion hinzugefügt, die eine Liste mit Namen in einen lesbaren Satz umwandelt:
  Wir starten die App noch einmal und senden ein Bild an die WhatsApp-Nummer. Wie sich herausgestellt hat, sehe ich keinem Prominenten wirklich ähnlich, um eine Übereinstimmung mit Rekognition zu erhalten, deshalb habe ich es mit einem Bild mit richtigen Prominenten versucht. Ich habe an mich ein paar Bilder mit Prominenten gesendet, wie dieses hier, um die Ergebnisse zu prüfen.
  Auf diesem Bild sind noch weitere Prominente vertreten, die Rekognition nicht erkannt hat.
  WhatsApp, Bilder, AWS und Prominente
  In diesem Blog haben wir erfahren, wie wir Bilder empfangen, die über die Twilio-API für WhatsApp an eine WhatsApp-Nummer gesendet werden, wie diese Bilder mit Down heruntergeladen und dann mit AWS Rekognition nach Prominenten durchsucht werden. Der vollständige Code zu diesem Blog befindet sich in diesem GitHub-Repository.
  Das ist aber erst der Anfang. Rekognition bietet eine Fülle an Tools für die Analyse von Bildern, einschließlich der Erkennung von Objekten und Szenen, Text und sogar Nacktszenen oder anzüglichen Inhalten.
  Bei dieser Anwendung handelt es sich um eine kleine Sinatra-App, aber wir können das Ganze auch in Rails implementieren. Das Herunterladen von Bildern und die Verwendung der Rekognition-APIs dauert ziemlich lange. Deshalb ist es vielleicht besser, diese API-Aufrufe mit ActiveJob zu verzögern und stattdessen mit der REST-API zu antworten. Es lohnt sich, die Reaktionszeiten in Betracht zu ziehen, da Twilio Webhooks nur 15 Sekunden wartet, bevor es eine Zeitüberschreitung ausgibt.
  Hast du schon etwas Interessantes mit der Bildanalyse erstellt? Dann würde ich gern davon erfahren. Hinterlasse einfach einen Kommentar oder kontaktiere mich auf Twitter unter @philnash.