Facebook mit VBA programmieren

Facebook hat zum Zeitpunkt der Erstellung dieses Beitrags bereits mehr als 25 Millionen aktive Nutzer allein in Deutschland. Gute Chancen also, dass Sie unter den Nutzern sind – und Zeit, sich einmal mit der Programmierschnittstelle von Facebook zu beschäftigen. Was viele nämlich nicht wissen: Es gibt durchaus Alternativen zum Browser für den Zugriff auf Facebook. Was auch hier und da nötig ist – nicht überall bietet die Benutzeroberfläche die Möglichkeiten, die sich die Benutzer erhoffen.

Einsatzmöglichkeiten

Facebook bietet schon eine umfangreiche Benutzeroberfläche, aber hier und da wünscht man sich vielleicht doch noch die eine oder andere Optimierung. Da die Facebook-API Zugriff auf nahezu alle Daten bietet, auf die Sie auch als Facebook-Benutzer Zugriff haben, lassen sich bestimmt interessante Ideen entwickeln. Fürs Erste wollen wir einmal zeigen, wie Sie eine Statusmeldung auf Facebook anlegen, diese wieder löschen und wie Sie auf Ihre eigenen Statusmeldungen zugreifen.

Dies lässt sich sicher nutzbringend in eine Anwendung integrieren – vielleicht möchte beispielsweise ein Unternehmen regelmäßig Produkte auf seiner Facebook-Seite vorstellen und kann diese Aufgabe dann von einer Access-Anwendung aus erledigen – natürlich, indem man die anzuzeigenden Inhalte wie Produktbeschreibungen oder Werbetexte aus einer Tabelle der Datenbank bezieht.

Sollten Sie etwas ähnliches im Sinn haben, könnten Sie dann auch gleich die Kommentare der Benutzer auf diese Statusmeldungen einlesen und diese gegebenenfalls verschiedenen Mitarbeitern zur Beantwortung zuweisen. Sie sehen: Es gibt ausreichend Gründe für die Facebook-Integration.

Voraussetzungen

Wenn Sie die Beispiele der folgenden Lösung durchspielen möchten, benötigen Sie zunächst einen Facebook-Account. Außerdem müssen Sie sich als Entwickler registrieren. Dazu klicken Sie nach der Anmeldung bei Facebook ganz unten rechts auf den Menüeintrag Mehr|Entwickler (der Eintrag ist recht klein) und registrieren sich dann auf der folgenden Seite.

Anwendung registrieren

Für den Zugriff auf Facebook müssen Sie zunächst eine Anwendung bei Facebook registrieren, in deren Kontext Sie auf die Facebook-API zugreifen. Dies erledigen Sie über den Menüpunkt App erstellen oben rechts im Menü (s. Bild 1). Voraussetzung hierfür ist, dass Sie selbst über einen Benutzeraccount bei Facebook verfügen. Anderenfalls legen Sie zuvor einen entsprechenden Zugang an.

Registrieren einer neuen Anwendung

Bild 1: Registrieren einer neuen Anwendung

Im folgenden Dialog klicken Sie dann auf die Schaltfläche Neue Anwendung erstellen. Einen Dialog weiter geben Sie bereits den Anwendungsnamen ein. Dieser darf verschiedene Elemente nicht enthalten, wie zum Beispiel Facebook oder Book (s. Bild 2). Also legen wir die neue Anwendung unter dem Namen aiuBaceFook an. Hier meckert Facebook nicht. Einen Dialog weiter fordert Facebook weitere Informationen an. Hier müssen Sie vor allem eine Integrationsart wählen. Am einfachsten geschieht dies mit der ersten Option Webseite mit Facebook-Anmeldung und der Angabe einer URL inklusive http: (s. Bild 3). Den Sandbox-Modus können Sie vorerst beibehalten – nach ersten Tests werden die Statusmeldungen auch in diesem Modus ganz normal veröffentlicht. Warum das Ganze Damit Sie die oben ersichtlichen Daten App ID und App Secret entnehmen können.

Erstellen der neuen Anwendung - hier fehlgeschlagen, da der Anwendungsname den Namen Facebook enthält

Bild 2: Erstellen der neuen Anwendung – hier fehlgeschlagen, da der Anwendungsname den Namen Facebook enthält

Eintragen der Detaildaten zur neuen Anwendung

Bild 3: Eintragen der Detaildaten zur neuen Anwendung

Token ermitteln

Die Ermittlung des für den Zugriff auf die Facebook-API notwendigen Token ist etwas hakelig. Geben Sie die folgende URL in den Browser ein:

https://www.facebook.com/dialog/
oauthclient_id=<client_id>
&scope=<scope>&response_type=token&
redirect_uri=<redirect_uri>

Dabei ersetzen Sie die Platzhalter wie folgt:

  • : die soeben ermittelte App-ID
  • : Eine komma-separierte Liste mit einem oder mehreren der Werte read_stream, read_friendlists und publish_stream.
  • : Angabe einer beliebigen URL, die nach der Ermittlung des Tokens aufgerufen werden soll

Die drei Werte für definieren verschiedene Zugriffsrechte und haben folgende Bedeutung – zum Beispiel die folgenden:

  • read_stream: Zugriff auf die Timeline des Benutzers
  • read_friendlists: Zugriff auf die Freundesliste
  • publish_stream: Erlaubnis, Beiträge im Namen des Benutzers zu veröffentlichen

Eine Liste der Berechtigungen für verschiedene Bereiche finden Sie unter https://developers.facebook.com/docs/reference/login/#permissions.

Facebook ruft dann die als angegebene Webseite auf und hängt einen Code an die URL an. Dies sieht dann beispielsweise so aus (den Code haben wir an dieser Stelle gekürzt):

http://www.access-basics.de/
code=AQDR9eNN3DRzme9ubqUwAk5J6HmLeRu
ESJXcTS1XAlydVjnF

Diesen Code müssen Sie auslesen und damit einen erneuten Aufruf starten. Dieser sieht dann wie folgt aus:

https://graph.facebook.com/oauth/access_tokenclient_id=
147265685342185&redirect_uri=
http://www.access-im-unternehmen.de/
&client_secret=7eed5c5ef46c69c90c0ec511
edd73734&code=AdDR9eNN3DRzme9ubqUwAk5J6H
mLeRuESJXcTS1XAlyLVjnF

Darauf antwortet Facebook dann, indem es zu einer URL weiterleitet, die wieder aus der angegebenen Redirect-URL und dem Token besteht:

http://www.access-im-unternehmen.de/
#access_token=CAAGxIOTNxqMBACV5AkFqWK
l9TWZBrZB9ucXd0dTC1CfyXaL6pCmfz1OfvT
XP67YXymi5AsffjaIROOWcfu5Cfe50HNro3kI
vDahulaYONVNmzDdMgjKc3vnTMuGDVUmOQD
GBe9Hg50GDrt5yinuvUtaeRYEWjO9OVlQ9gPx
AZDZD&expires_in=5894

Mit diesem Token können Sie nun alle Aktionen durchführen, welche die angegebenen Zugriffsrechte erlauben. Wenn Sie also etwa publish_stream angegeben haben, können Sie unter Angabe des Tokens Beiträge im Namen des mit der Anwendung verbundenen Benutzers posten.

Noch einmal zusammengefasst: Sie starten die Anfrage an Facebook, Facebook zeigt einen Dialog an, mit dem Sie die Anfrage bestätigen müssen, und ruft dann die Redirect-URL mit einem Code als Parameter auf.

Diesen Code fügen Sie in einen weiteren Aufruf von Facebook ein und Facebook ruft erneut die Redirect-URL auf – diesmal allerdings mit dem gewünschten Token als Parameter. Normalerweise würde die unter Redirect-URL angegebene Webseite die Parameter auswerten und die weiteren Aufrufe starten. Allerdings wollen wir ja keine Webseite betreiben, um auf Facebook zuzugreifen, sondern dies von Access aus erledigen. Der Ablauf sieht prinzipiell allerdings ähnlich aus.

Token automatisch holen

Wir haben ein Formular entwickelt, das den Token automatisch bezieht beziehungsweise erneuert. Dieses basiert auf einer kleinen Tabelle, welche die Anwendungsdaten speichert und die auch den Token aufnehmen soll. Die Tabelle ist wie in Bild 4 aufgebaut und heißt tblOptionen. Tragen Sie dort die über die Facebook-Anwendungsseite ermittelten Werte in die Felder AppID und AppSecret ein.

Tabelle zum Speichern der Anwendungsdaten für den Zugriff auf Facebook

Bild 4: Tabelle zum Speichern der Anwendungsdaten für den Zugriff auf Facebook

Für Scope tragen Sie eine kommaseparierte Liste der Zugriffsrechte ein, also beispielsweise read_stream,publish_actions,publish_stream. Redirect nimmt die URL der Seite auf, zu der Facebook nach dem Erstellen des Token weiterleiten soll.

Welche Sie verwenden, spielt keine Rolle – Sie benötigen diese nur, weil Facebook an diese nach dem Weiterleiten den Token anhängt. Aber es muss die gleiche URL sein, die Sie weiter oben bei der Registrierung der Anwendung angegeben haben, sonst tritt beim Abruf des Tokens ein Fehler auf. Nach dem Füllen und dem Einlesen des Tokens sieht der einzige Datensatz dieser Tabelle etwa wie in Bild 5 aus.

Tabelle mit Anwendungsdaten und Token

Bild 5: Tabelle mit Anwendungsdaten und Token

Token-Formular

Nun kümmern wir uns um das Formular, welches das Einlesen des Tokens für uns übernimmt. Das Formular heißt frmToken und enthält lediglich ein Webbrowser-Steuerelement namens ctlWebbrowser. Im Klassenmodul des Formulars legen Sie die folgende Zeile an, um eine Objektvariable zum Speichern des Webbrowser-Steuerelements zu deklarieren:

Dim WithEvents objWebbrowser As WebBrowser

Das Schlüsselwort WithEvents ist wichtig, weil wir später ein Ereignis des Webbrowser-Steuerelements nutzen möchten. Dieses wird beim Beenden des Ladevorgangs einer Internetseite ausgelöst.

Danach hinterlegen Sie die Prozedur aus Listing 1, die durch das Ereignis Beim Laden des Formulars ausgelöst werden soll. Diese Prozedur füllt die Variable obj-Webbrowser mit einem Verweis auf das Webbrowser-Steuerelement und liest die Werte der drei Felder AppID, Scope und Redirect in entsprechende Variablen ein. Die Funktion AddSlash untersucht die Redirect-URL dahingehend, ob diese mit einem Slash-Zeichen endet, und ergänzt dieses gegebenenfalls (s. Listing 2).

Private Sub Form_Load()
     Dim strClientID As String
     Dim strScope As String
     Dim strURL As String
     Dim strRedirect As String
     Set objWebbrowser = Me!ctlWebbrowser.Object
     strClientID = DLookup("AppID", "tblOptionen")
     strScope = DLookup("Scope", "tblOptionen")
     strRedirect = DLookup("Redirect", "tblOptionen")
     strRedirect = AddSlash(strRedirect)
     strURL = "https://graph.facebook.com/oauth/authorizeclient_id=" _
         & strClientID & "&scope=" & strScope & "&redirect_uri=" & strRedirect
     objWebbrowser.Navigate strURL
End Sub

Listing 1: Beim öffnen ruft das Formular die Webseite zum Freischalten des Tokens auf.

Das Webbrowser-Steuerelement zeigt daraufhin den Dialog aus Bild 6 an. Hier bestätigen Sie, dass die Facebook-Anwendung die von Ihnen angeforderten Berechtigungen freigeben darf. Wenn Sie hier auf OK klicken, dürfen Sie auf das öffentliche Profil und die Freundesliste zugreifen sowie Neuigkeiten posten.

Manuelle Freigabe des Zugriffs

Bild 6: Manuelle Freigabe des Zugriffs

Sobald dieses Dokument erscheint, wird die Ereignisprozedur aus Listing 3 erstmals ausgelöst. Dieses Dokument wollen wir jedoch nicht per Code untersuchen – an dieser Stelle ist lediglich der Klick auf die OK-Schaltfläche gefragt. Daher prüfen wir die mit dem Parameter URL gelieferte Internetadresse auf das Auftreten der Zeichenkette Code, die aber erst in der nachfolgend aufgerufenen Seite enthalten ist.

Private Sub objWebbrowser_DocumentComplete(ByVal pDisp As Object, URL As Variant)
     Dim strToken As String
     Dim strClient As String
     Dim strAppSecret As String
     Dim strCode As String
     Dim strURL As String
     Dim strRedirect As String
     Dim strResponse As String
     If InStr(1, URL, "code=") > 0 Then
         strCode = URL
         strCode = Mid(strCode, InStr(1, strCode, "code=") + 5)
         strClient = DLookup("AppID", "tblOptionen")
         strAppSecret = DLookup("AppSecret", "tblOptionen")
         strRedirect = DLookup("Redirect", "tblOptionen")
         strRedirect = AddSlash(strRedirect)
         strURL = "https://graph.facebook.com/oauth/access_tokenclient_id=" _
             & strClient & "&redirect_uri=" & strRedirect & "&client_secret=" _
             & strAppSecret & "&code=" & strCode
         If HTTPRequest(strURL, strResponse) = True Then
             strToken = Replace(strResponse, "access_token=", "")
             CurrentDb.Execute "UPDATE tblOptionen SET Token = ''" & strToken _
                 & "''", dbFailOnError
         Else
             Debug.Print strResponse
         End If
         DoCmd.Close acForm, Me.Name
     End If
End Sub

Listing 3: Nach dem Laden des Dokuments wird eine weitere URL aufgerufen.

Der Klick auf die OK-Schaltfläche führt jedoch dazu, dass Facebook die Redirect-URL mit dem Code aufruft. Im Webbrowser-Steuerelement wird nun die von Ihnen mit Redirect-URL angegebene Internetseite geöffnet.

Wenn die Seite fertig geladen ist, löst dies wiederum das Ereignis objWebbrowser_DocumentComplete aus. Diesmal enthält die mit dem Parameter URL gesendete Internetadresse den Parameter Code.

Diesen wertet die Prozedur nun aus, indem sie den Code zunächst in der Variablen strCode speichert. Mit dieser Information und einigen weiteren, die wiederum aus der Tabelle tblOptionen ausgelesen werden, rufen wir erneut eine URL bei Facebook auf – diesmal allerdings nicht über das Webbrowser-Steuerelement, sondern mit dem HTTPRequest-Objekt. Um dieses zu nutzen, müssen Sie zuvor einen Verweis auf die Bibliothek Microsoft XML, v6.0 hinzufügen.

Dies erlaubt es, einfach auf gelieferte Ergebnisse zu reagieren. Die URL wird mit der Variablen strURL an die Funktion HTTPRequest übergeben, welche den Request durchführt und im Erfolgsfall das Ergebnis, den sogenannten Response, an die aufrufende Prozedur zurückliefert – und zwar mit dem Rückgabeparameter strResponse.

Der eigentliche Funktionswert ist einer Boolean-Variable vorbehalten, die über den Erfolg des Requests Auskunft gibt (s. Listing 4).

Public Function HTTPRequest(strURL As String, strResponse As String, _
         Optional strMethod As String = "POST") As Boolean
     Dim objHTTP As ServerXMLHTTP
     Set objHTTP = CreateObject("MSXML2.ServerXMLHTTP")
     With objHTTP
         .Open strMethod, strURL, False
         .setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
         .Send
         strResponse = objHTTP.responseText
         If .status = 200 Then
             HTTPRequest = True
         End If
     End With
End Function

Listing 4: Die Funktion HTTPRequest

strResponse enthält im Erfolgsfall einen Ausdruck wie den folgenden:

access_token=CAACF7ZCbcxZBkBAOipq8Qp
zdMA2dvw3rE...&expires=5181905

Hier muss die Prozedur noch das führende access_token= und das Verfallsdatum am Ende, das mit &expires= eingeleitet wird, entfernen. Schließlich enthält die Variable strToken den reinen Token, der so im Feld Token der Tabelle tblOptionen gespeichert wird. Die Haltbarkeit des Tokens beträgt übrigens 60 Tage – danach müssen Sie diesen erneut beantragen. Das öffnen des Formulars frmToken reicht dazu völlig aus – den Rest erledigen Sie per Mausklick.

Die eigenen Berechtigungen abrufen

Starten wir mit einem einfachen Beispiel. Wir wollen prüfen, welche Berechtigungen die Anwendungen für den Zugriff auf die Daten des mit der Anwendung verknüpften Benutzers hat. Dazu würden Sie im Browser die folgende URL absetzen:

https://graph.facebook.com/me/
permissionsaccess_token=CAAH7dz9zXZCoB
BP9J9g35HwACZAICiiDs8Dmvit4eavqL2i...

Wie ist diese Abfrage aufgebaut https://graph.facebook.com ist die URL für alle Anfragen an Facebook. me ist der Platzhalter für das Konto des Accounts, in dessen Kontext die Anwendung erstellt wurde. Sie können hier auch explizit den Namen oder die ID des zu verwendenden Accounts angeben. permissions gibt den Inhalt an, der abgefragt werden soll. Und der Parameter access_token übergibt Ihren Token an Facebook. Das Ergebnis dieser Abfrage können Sie Bild 7 entnehmen.

Einfaches Beispiel: die Abfrage der Zugriffsrechte

Bild 7: Einfaches Beispiel: die Abfrage der Zugriffsrechte

Wie aber ermitteln wir dieses Ergebnis, ohne den Webbrowser zu bemühen Schließlich wollen wir es ja auch einmal weiterverarbeiten können. Weiter oben haben Sie bereits die Funktion HTTP-Re-quest kennengelernt – und genau die hilft uns auch jetzt weiter.

Am einfachsten übergeben wir die zuvor in einer Variablen gespeicherte URL an diese Funktion und lesen das Ergebnis ebenfalls in eine zuvor deklarierte Variable ein. Deren Wert geben wir dann anschließend im Direktbereich des VBA-Editors aus. Die Prozedur BerechtigungenEinfach sieht wie in Listing 5 aus. Sie ermittelt den Token und stellt die URL in der Variablen strURL zusammen. Der Aufruf liefert indes das folgende Ergebnis – nicht gerade das, was wir erwartet haben:

Public Sub BerechtigungenEinfach()
     Dim strURL As String
     Dim strResponse As String
     Dim strToken As String
     strToken = DLookup("Token", "tblOptionen")
     strURL = "https://graph.facebook.com/me/permissionsaccess_token=" & strToken
     HTTPRequest strURL, strResponse
     Debug.Print strResponse
End Sub

Listing 5: Einfacher Aufruf der Facebook-API

{"error":
   {
     "message":"Unsupported post request.",
     "type": "GraphMethodException",
     "code":100
   }
}

Die Erklärung ist allerdings einfach: Wir haben die Anfrage als POST-Anfrage formuliert und nicht als GET. Also fügen wir zur folgenden Zeile noch GET als letzten Parameter hinzu:

HTTPRequest strURL, strResponse, "GET"

Nun erhalten wir das gewünschte Ergebnis, also genau das JSON-Dokument, das auch der Webbrowser angezeigt hat:

{"data":[{"installed":1,"basic_info":1
,"read_stream":1,"status_update":1,
"photo_upload":1,"video_upload":1,
"create_note":1,"share_item":1,
"publish_stream":1,"publish_actions":1
}],"paging":{"next":"https:\/\/graph.
facebook.com\/100000445458715\/
permissionsaccess_token=CAACF7ZC
bcxZBkBAGZCWYupEWKqZCM7wwuhgIZBwW
O68FuyrZCp1wnOrfZA8FkT6CWQF91W2853Bn7
KssL63ywhSyFc7GRGfD0rmSl5k4HcH6S1M7nZ
CmzuZBd9qasLXe7lSRd77BI4MayRfVTSLIZCrc
JZA&limit=5000&offset=5000"}}

JSON

Aber was ist das für ein Format, in dem diese Abfrage erfolgt Dabei handelt es sich nicht, wie bei anderen Webdiensten, um XML, sondern um JSON. Mehr zu JSON und wie Sie Dokumente in diesem Format parsen können, erfahren Sie im Beitrag JSON-Dokumente mit VBA parsen (www.access-im-unternehmen.de/893). Dort lernen Sie auch eine Funktion namens JSONParsen kennen, welche das JSON-Dokument in ein Collection-Objekt verwandelt, das mitunter weitere verschachtelte Collection-Objekte enthält.

Statusmeldung erstellen

Um diese Funktion zu testen, rufen wir eine Facebook-Methode auf, die eine relativ einfache Antwort zurückliefert. Dabei handelt es sich um das Anlegen einer neuen Statusmeldung auf der eigenen Pinnwand. Als Methode geben wir diesmal nicht permissions, sondern feed an. Außerdem benötigen wir einen zusätzlichen Parameter namens message, der den Meldungstext übergibt. Die URL sieht beispielsweise so aus:

https://graph.facebook.com/me/
feedmessage=Testmeldung&access_token=
CAACF7ZCbcxZBkBAGZCW...

Die Prozedur, um den Aufruf einfach durchzuführen, finden Sie in Listing 6. Das Ergebnis enthält lediglich den Namen des Elements (id) und den Wert (die ID der neuen Statusmeldung):

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar