{"id":55000895,"date":"2013-08-01T00:00:00","date_gmt":"2020-05-22T21:29:42","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=895"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Facebook_mit_VBA_programmieren","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/","title":{"rendered":"Facebook mit VBA programmieren"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>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 &#8211; und Zeit, sich einmal mit der Programmierschnittstelle von Facebook zu besch&auml;ftigen. Was viele n&auml;mlich nicht wissen: Es gibt durchaus Alternativen zum Browser f&uuml;r den Zugriff auf Facebook. Was auch hier und da n&ouml;tig ist &#8211; nicht &uuml;berall bietet die Benutzeroberfl&auml;che die M&ouml;glichkeiten, die sich die Benutzer erhoffen.<\/b><\/p>\n<p><b>Einsatzm&ouml;glichkeiten<\/b><\/p>\n<p>Facebook bietet schon eine umfangreiche Benutzeroberfl&auml;che, aber hier und da w&uuml;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&uuml;rs Erste wollen wir einmal zeigen, wie Sie eine Statusmeldung auf Facebook anlegen, diese wieder l&ouml;schen und wie Sie auf Ihre eigenen Statusmeldungen zugreifen.<\/p>\n<p>Dies l&auml;sst sich sicher nutzbringend in eine Anwendung integrieren &#8211; vielleicht m&ouml;chte beispielsweise ein Unternehmen regelm&auml;&szlig;ig Produkte auf seiner Facebook-Seite vorstellen und kann diese Aufgabe dann von einer Access-Anwendung aus erledigen &#8211; nat&uuml;rlich, indem man die anzuzeigenden Inhalte wie Produktbeschreibungen oder Werbetexte aus einer Tabelle der Datenbank bezieht.<\/p>\n<p>Sollten Sie etwas &auml;hnliches im Sinn haben, k&ouml;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&uuml;nde f&uuml;r die Facebook-Integration.<\/p>\n<p><b>Voraussetzungen<\/b><\/p>\n<p>Wenn Sie die Beispiele der folgenden L&ouml;sung durchspielen m&ouml;chten, ben&ouml;tigen Sie zun&auml;chst einen Facebook-Account. Au&szlig;erdem m&uuml;ssen Sie sich als Entwickler registrieren. Dazu klicken Sie nach der Anmeldung bei Facebook ganz unten rechts auf den Men&uuml;eintrag Mehr|Entwickler (der Eintrag ist recht klein) und registrieren sich dann auf der folgenden Seite.<\/p>\n<p><b>Anwendung registrieren<\/b><\/p>\n<p>F&uuml;r den Zugriff auf Facebook m&uuml;ssen Sie zun&auml;chst eine Anwendung bei Facebook registrieren, in deren Kontext Sie auf die Facebook-API zugreifen. Dies erledigen Sie &uuml;ber den Men&uuml;punkt <b>App erstellen <\/b>oben rechts im Men&uuml; (s. Bild 1). Voraussetzung hierf&uuml;r ist, dass Sie selbst &uuml;ber einen Benutzeraccount bei Facebook verf&uuml;gen. Anderenfalls legen Sie zuvor einen entsprechenden Zugang an.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_001.png\" alt=\"Registrieren einer neuen Anwendung\" width=\"700\" height=\"295,1786\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 1: Registrieren einer neuen Anwendung<\/span><\/b><\/p>\n<p>Im folgenden Dialog klicken Sie dann auf die Schaltfl&auml;che <b>Neue Anwendung erstellen<\/b>. Einen Dialog weiter geben Sie bereits den Anwendungsnamen ein. Dieser darf verschiedene Elemente nicht enthalten, wie zum Beispiel <b>Facebook <\/b>oder <b>Book <\/b>(s. Bild 2). Also legen wir die neue Anwendung unter dem Namen <b>aiuBaceFook <\/b>an. Hier meckert Facebook nicht. Einen Dialog weiter fordert Facebook weitere Informationen an. Hier m&uuml;ssen Sie vor allem eine Integrationsart w&auml;hlen. Am einfachsten geschieht dies mit der ersten Option <b>Webseite mit Facebook-Anmeldung <\/b>und der Angabe einer URL inklusive <b>http: <\/b>(s. Bild 3). Den Sandbox-Modus k&ouml;nnen Sie vorerst beibehalten &#8211; nach ersten Tests werden die Statusmeldungen auch in diesem Modus ganz normal ver&ouml;ffentlicht. Warum das Ganze Damit Sie die oben ersichtlichen Daten <b>App ID <\/b>und <b>App Secret <\/b>entnehmen k&ouml;nnen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_002.png\" alt=\"Erstellen der neuen Anwendung - hier fehlgeschlagen, da der Anwendungsname den Namen Facebook enth&auml;lt\" width=\"570\" height=\"212,8481\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 2: Erstellen der neuen Anwendung &#8211; hier fehlgeschlagen, da der Anwendungsname den Namen Facebook enth&auml;lt<\/span><\/b><\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_003.png\" alt=\"Eintragen der Detaildaten zur neuen Anwendung\" width=\"570\" height=\"507,1115\"\/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 3: Eintragen der Detaildaten zur neuen Anwendung<\/span><\/b><\/p>\n<p><b>Token ermitteln<\/b><\/p>\n<p>Die Ermittlung des f&uuml;r den Zugriff auf die Facebook-API notwendigen Token ist etwas hakelig. Geben Sie die folgende URL in den Browser ein:<\/p>\n<pre>https:\/\/www.facebook.com\/dialog\/\r\noauthclient_id=&lt;client_id&gt;\r\n&scope=&lt;scope&gt;&response_type=token&\r\nredirect_uri=&lt;redirect_uri&gt;<\/pre>\n<p>Dabei ersetzen Sie die Platzhalter wie folgt:<\/p>\n<ul>\n<li><b><client_id><\/b>: die soeben ermittelte App-ID<\/li>\n<li><b><scope><\/b>: Eine komma-separierte Liste mit einem oder mehreren der Werte <b>read_stream<\/b>, <b>read_friendlists <\/b>und <b>publish_stream<\/b>.<\/li>\n<li><b><redirect_uri><\/b>: Angabe einer beliebigen URL, die nach der Ermittlung des Tokens aufgerufen werden soll<\/li>\n<\/ul>\n<p>Die drei Werte f&uuml;r <b><scope> <\/b>definieren verschiedene Zugriffsrechte und haben folgende Bedeutung &#8211; zum Beispiel die folgenden:<\/p>\n<ul>\n<li><b>read_stream<\/b>: Zugriff auf die Timeline des Benutzers<\/li>\n<li><b>read_friendlists<\/b>: Zugriff auf die Freundesliste<\/li>\n<li><b>publish_stream<\/b>: Erlaubnis, Beitr&auml;ge im Namen des Benutzers zu ver&ouml;ffentlichen<\/li>\n<\/ul>\n<p>Eine Liste der Berechtigungen f&uuml;r verschiedene Bereiche finden Sie unter <b>https:\/\/developers.facebook.com\/docs\/reference\/login\/#permissions<\/b>.<\/p>\n<p>Facebook ruft dann die als <b><redirect_uri> <\/b>angegebene Webseite auf und h&auml;ngt einen Code an die URL an. Dies sieht dann beispielsweise so aus (den Code haben wir an dieser Stelle gek&uuml;rzt):<\/p>\n<pre>http:\/\/www.access-basics.de\/\r\ncode=AQDR9eNN3DRzme9ubqUwAk5J6HmLeRu\r\nESJXcTS1XAlydVjnF<\/pre>\n<p>Diesen Code m&uuml;ssen Sie auslesen und damit einen erneuten Aufruf starten. Dieser sieht dann wie folgt aus:<\/p>\n<pre>https:\/\/graph.facebook.com\/oauth\/access_tokenclient_id=\r\n147265685342185&redirect_uri=\r\nhttp:\/\/www.access-im-unternehmen.de\/\r\n&client_secret=7eed5c5ef46c69c90c0ec511\r\nedd73734&code=AdDR9eNN3DRzme9ubqUwAk5J6H\r\nmLeRuESJXcTS1XAlyLVjnF<\/pre>\n<p>Darauf antwortet Facebook dann, indem es zu einer URL weiterleitet, die wieder aus der angegebenen Redirect-URL und dem Token besteht:<\/p>\n<pre>http:\/\/www.access-im-unternehmen.de\/\r\n#access_token=CAAGxIOTNxqMBACV5AkFqWK\r\nl9TWZBrZB9ucXd0dTC1CfyXaL6pCmfz1OfvT\r\nXP67YXymi5AsffjaIROOWcfu5Cfe50HNro3kI\r\nvDahulaYONVNmzDdMgjKc3vnTMuGDVUmOQD\r\nGBe9Hg50GDrt5yinuvUtaeRYEWjO9OVlQ9gPx\r\nAZDZD&expires_in=5894<\/pre>\n<p>Mit diesem Token k&ouml;nnen Sie nun alle Aktionen durchf&uuml;hren, welche die angegebenen Zugriffsrechte erlauben. Wenn Sie also etwa <b>publish_stream <\/b>angegeben haben, k&ouml;nnen Sie unter Angabe des Tokens Beitr&auml;ge im Namen des mit der Anwendung verbundenen Benutzers posten.<\/p>\n<p>Noch einmal zusammengefasst: Sie starten die Anfrage an Facebook, Facebook zeigt einen Dialog an, mit dem Sie die Anfrage best&auml;tigen m&uuml;ssen, und ruft dann die Redirect-URL mit einem Code als Parameter auf.<\/p>\n<p>Diesen Code f&uuml;gen Sie in einen weiteren Aufruf von Facebook ein und Facebook ruft erneut die Redirect-URL auf &#8211; diesmal allerdings mit dem gew&uuml;nschten Token als Parameter. Normalerweise w&uuml;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 &auml;hnlich aus.<\/p>\n<p><b>Token automatisch holen<\/b><\/p>\n<p>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&szlig;t <b>tblOptionen<\/b>. Tragen Sie dort die &uuml;ber die Facebook-Anwendungsseite ermittelten Werte in die Felder <b>AppID <\/b>und <b>AppSecret <\/b>ein.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_004.png\" alt=\"Tabelle zum Speichern der Anwendungsdaten f&uuml;r den Zugriff auf Facebook\" width=\"570\" height=\"396,0095\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 4: Tabelle zum Speichern der Anwendungsdaten f&uuml;r den Zugriff auf Facebook<\/span><\/b><\/p>\n<p>F&uuml;r <b>Scope <\/b>tragen Sie eine kommaseparierte Liste der Zugriffsrechte ein, also beispielsweise <b>read_stream,publish_actions,publish_stream<\/b>. <b>Redirect <\/b>nimmt die URL der Seite auf, zu der Facebook nach dem Erstellen des Token weiterleiten soll.<\/p>\n<p>Welche Sie verwenden, spielt keine Rolle &#8211; Sie ben&ouml;tigen diese nur, weil Facebook an diese nach dem Weiterleiten den Token anh&auml;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&uuml;llen und dem Einlesen des Tokens sieht der einzige Datensatz dieser Tabelle etwa wie in Bild 5 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_005.png\" alt=\"Tabelle mit Anwendungsdaten und Token\" width=\"570\" height=\"190,508\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 5: Tabelle mit Anwendungsdaten und Token<\/span><\/b><\/p>\n<p><b>Token-Formular<\/b><\/p>\n<p>Nun k&uuml;mmern wir uns um das Formular, welches das Einlesen des Tokens f&uuml;r uns &uuml;bernimmt. Das Formular hei&szlig;t <b>frmToken <\/b>und enth&auml;lt lediglich ein <b>Webbrowser<\/b>-Steuerelement namens <b>ctlWebbrowser<\/b>. Im Klassenmodul des Formulars legen Sie die folgende Zeile an, um eine Objektvariable zum Speichern des <b>Webbrowser<\/b>-Steuerelements zu deklarieren:<\/p>\n<pre><span style=\"color:blue;\">Dim <\/span>WithEvents objWebbrowser<span style=\"color:blue;\"> As <\/span>WebBrowser<\/pre>\n<p>Das Schl&uuml;sselwort <b>WithEvents <\/b>ist wichtig, weil wir sp&auml;ter ein Ereignis des <b>Webbrowser<\/b>-Steuerelements nutzen m&ouml;chten. Dieses wird beim Beenden des Ladevorgangs einer Internetseite ausgel&ouml;st.<\/p>\n<p>Danach hinterlegen Sie die Prozedur aus Listing 1, die durch das Ereignis <b>Beim Laden <\/b>des Formulars ausgel&ouml;st werden soll. Diese Prozedur f&uuml;llt die Variable <b>obj-Webbrowser <\/b>mit einem Verweis auf das <b>Webbrowser<\/b>-Steuerelement und liest die Werte der drei Felder <b>AppID<\/b>, <b>Scope <\/b>und <b>Redirect <\/b>in entsprechende Variablen ein. Die Funktion <b>AddSlash <\/b>untersucht die Redirect-URL dahingehend, ob diese mit einem Slash-Zeichen endet, und erg&auml;nzt dieses gegebenenfalls (s. Listing 2).<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>Form_Load()\r\n     <span style=\"color:blue;\">Dim <\/span>strClientID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strScope<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRedirect<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Set<\/span> objWebbrowser = Me!ctlWebbrowser.Object\r\n     strClientID = DLookup(\"AppID\", \"tblOptionen\")\r\n     strScope = DLookup(\"Scope\", \"tblOptionen\")\r\n     strRedirect = DLookup(\"Redirect\", \"tblOptionen\")\r\n     strRedirect = AddSlash(strRedirect)\r\n     strURL = \"https:\/\/graph.facebook.com\/oauth\/authorizeclient_id=\" _\r\n         & strClientID & \"&scope=\" & strScope & \"&redirect_uri=\" & strRedirect\r\n     objWebbrowser.Navigate strURL\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 1: Beim &ouml;ffnen ruft das Formular die Webseite zum Freischalten des Tokens auf.<\/span><\/b><\/p>\n<p>Das <b>Webbrowser<\/b>-Steuerelement zeigt daraufhin den Dialog aus Bild 6 an. Hier best&auml;tigen Sie, dass die Facebook-Anwendung die von Ihnen angeforderten Berechtigungen freigeben darf. Wenn Sie hier auf <b>OK <\/b>klicken, d&uuml;rfen Sie auf das &ouml;ffentliche Profil und die Freundesliste zugreifen sowie Neuigkeiten posten.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_006.png\" alt=\"Manuelle Freigabe des Zugriffs\" width=\"395\" height=\"366,2452\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 6: Manuelle Freigabe des Zugriffs<\/span><\/b><\/p>\n<p>Sobald dieses Dokument erscheint, wird die Ereignisprozedur aus Listing 3 erstmals ausgel&ouml;st. Dieses Dokument wollen wir jedoch nicht per Code untersuchen &#8211; an dieser Stelle ist lediglich der Klick auf die <b>OK<\/b>-Schaltfl&auml;che gefragt. Daher pr&uuml;fen wir die mit dem Parameter URL gelieferte Internetadresse auf das Auftreten der Zeichenkette <b>Code<\/b>, die aber erst in der nachfolgend aufgerufenen Seite enthalten ist.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>objWebbrowser_DocumentComplete(ByVal pDisp<span style=\"color:blue;\"> As Object<\/span>, URL<span style=\"color:blue;\"> As Variant<\/span>)\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strClient<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strAppSecret<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strCode<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strRedirect<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">InStr<\/span>(1, URL, \"code=\") &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         strCode = URL\r\n         strCode = <span style=\"color:blue;\">Mid<\/span>(strCode, <span style=\"color:blue;\">InStr<\/span>(1, strCode, \"code=\") + 5)\r\n         strClient = DLookup(\"AppID\", \"tblOptionen\")\r\n         strAppSecret = DLookup(\"AppSecret\", \"tblOptionen\")\r\n         strRedirect = DLookup(\"Redirect\", \"tblOptionen\")\r\n         strRedirect = AddSlash(strRedirect)\r\n         strURL = \"https:\/\/graph.facebook.com\/oauth\/access_tokenclient_id=\" _\r\n             & strClient & \"&redirect_uri=\" & strRedirect & \"&client_secret=\" _\r\n             & strAppSecret & \"&code=\" & strCode\r\n         <span style=\"color:blue;\">If <\/span>HTTPRequest(strURL, strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n             strToken = <span style=\"color:blue;\">Replace<\/span>(strResponse, \"access_token=\", \"\")\r\n             CurrentDb.Execute \"UPDATE tblOptionen SET Token = ''\" & strToken _\r\n                 & \"''\", dbFailOnError\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strResponse\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         DoCmd.Close acForm, Me.Name\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 3: Nach dem Laden des Dokuments wird eine weitere URL aufgerufen. <\/span><\/b><\/p>\n<p>Der Klick auf die <b>OK<\/b>-Schaltfl&auml;che f&uuml;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&ouml;ffnet.<\/p>\n<p>Wenn die Seite fertig geladen ist, l&ouml;st dies wiederum das Ereignis <b>objWebbrowser_DocumentComplete <\/b>aus. Diesmal enth&auml;lt die mit dem Parameter <b>URL <\/b>gesendete Internetadresse den Parameter <b>Code<\/b>.<\/p>\n<p>Diesen wertet die Prozedur nun aus, indem sie den Code zun&auml;chst in der Variablen <b>strCode <\/b>speichert. Mit dieser Information und einigen weiteren, die wiederum aus der Tabelle <b>tblOptionen <\/b>ausgelesen werden, rufen wir erneut eine URL bei Facebook auf &#8211; diesmal allerdings nicht &uuml;ber das Webbrowser-Steuerelement, sondern mit dem <b>HTTPRequest<\/b>-Objekt. Um dieses zu nutzen, m&uuml;ssen Sie zuvor einen Verweis auf die Bibliothek <b>Microsoft XML, v6.0 <\/b>hinzuf&uuml;gen.<\/p>\n<p>Dies erlaubt es, einfach auf gelieferte Ergebnisse zu reagieren. Die URL wird mit der Variablen <b>strURL <\/b>an die Funktion <b>HTTPRequest <\/b>&uuml;bergeben, welche den Request durchf&uuml;hrt und im Erfolgsfall das Ergebnis, den sogenannten Response, an die aufrufende Prozedur zur&uuml;ckliefert &#8211; und zwar mit dem R&uuml;ckgabeparameter <b>strResponse<\/b>.<\/p>\n<p>Der eigentliche Funktionswert ist einer <b>Boolean<\/b>-Variable vorbehalten, die &uuml;ber den Erfolg des Requests Auskunft gibt (s. Listing 4).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>HTTPRequest(strURL<span style=\"color:blue;\"> As String<\/span>, strResponse<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strMethod<span style=\"color:blue;\"> As String<\/span> = \"POST\")<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objHTTP<span style=\"color:blue;\"> As <\/span>ServerXMLHTTP\r\n     <span style=\"color:blue;\">Set<\/span> objHTTP = CreateObject(\"MSXML2.ServerXMLHTTP\")\r\n     <span style=\"color:blue;\">With<\/span> objHTTP\r\n         .Open strMethod, strURL, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", \"application\/x-www-form-urlencoded\"\r\n         .Send\r\n         strResponse = objHTTP.responseText\r\n         <span style=\"color:blue;\">If <\/span>.status = 200<span style=\"color:blue;\"> Then<\/span>\r\n             HTTPRequest = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><!--30percent--><\/p>\n<p><b><span style=\"color:darkgrey;\">Listing 4: Die Funktion HTTPRequest<\/span><\/b><\/p>\n<p><b>strResponse <\/b>enth&auml;lt im Erfolgsfall einen Ausdruck wie den folgenden:<\/p>\n<pre>access_token=CAACF7ZCbcxZBkBAOipq8Qp\r\nzdMA2dvw3rE...&expires=5181905<\/pre>\n<p>Hier muss die Prozedur noch das f&uuml;hrende <b>access_token= <\/b>und das Verfallsdatum am Ende, das mit <b>&#038;expires= <\/b>eingeleitet wird, entfernen. Schlie&szlig;lich enth&auml;lt die Variable <b>strToken <\/b>den reinen Token, der so im Feld <b>Token <\/b>der Tabelle <b>tblOptionen <\/b>gespeichert wird. Die Haltbarkeit des Tokens betr&auml;gt &uuml;brigens 60 Tage &#8211; danach m&uuml;ssen Sie diesen erneut beantragen. Das &ouml;ffnen des Formulars <b>frmToken <\/b>reicht dazu v&ouml;llig aus &#8211; den Rest erledigen Sie per Mausklick.<\/p>\n<p><b>Die eigenen Berechtigungen abrufen<\/b><\/p>\n<p>Starten wir mit einem einfachen Beispiel. Wir wollen pr&uuml;fen, welche Berechtigungen die Anwendungen f&uuml;r den Zugriff auf die Daten des mit der Anwendung verkn&uuml;pften Benutzers hat. Dazu w&uuml;rden Sie im Browser die folgende URL absetzen:<\/p>\n<pre>https:\/\/graph.facebook.com\/me\/\r\npermissionsaccess_token=CAAH7dz9zXZCoB\r\nBP9J9g35HwACZAICiiDs8Dmvit4eavqL2i...<\/pre>\n<p>Wie ist diese Abfrage aufgebaut <b>https:\/\/graph.facebook.com <\/b>ist die URL f&uuml;r alle Anfragen an Facebook. <b>me <\/b>ist der Platzhalter f&uuml;r das Konto des Accounts, in dessen Kontext die Anwendung erstellt wurde. Sie k&ouml;nnen hier auch explizit den Namen oder die ID des zu verwendenden Accounts angeben. <b>permissions <\/b>gibt den Inhalt an, der abgefragt werden soll. Und der Parameter <b>access_token <\/b>&uuml;bergibt Ihren Token an Facebook. Das Ergebnis dieser Abfrage k&ouml;nnen Sie Bild 7 entnehmen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_007.png\" alt=\"Einfaches Beispiel: die Abfrage der Zugriffsrechte\" width=\"570\" height=\"297,419\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 7: Einfaches Beispiel: die Abfrage der Zugriffsrechte<\/span><\/b><\/p>\n<p>Wie aber ermitteln wir dieses Ergebnis, ohne den Webbrowser zu bem&uuml;hen Schlie&szlig;lich wollen wir es ja auch einmal weiterverarbeiten k&ouml;nnen. Weiter oben haben Sie bereits die Funktion <b>HTTP-Re-quest <\/b>kennengelernt &#8211; und genau die hilft uns auch jetzt weiter.<\/p>\n<p>Am einfachsten &uuml;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&szlig;end im Direktbereich des VBA-Editors aus. Die Prozedur <b>BerechtigungenEinfach <\/b>sieht wie in Listing 5 aus. Sie ermittelt den Token und stellt die URL in der Variablen <b>strURL <\/b>zusammen. Der Aufruf liefert indes das folgende Ergebnis &#8211; nicht gerade das, was wir erwartet haben:<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>BerechtigungenEinfach()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     strToken = DLookup(\"Token\", \"tblOptionen\")\r\n     strURL = \"https:\/\/graph.facebook.com\/me\/permissionsaccess_token=\" & strToken\r\n     HTTPRequest strURL, strResponse\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strResponse\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 5: Einfacher Aufruf der Facebook-API<\/span><\/b><\/p>\n<pre>{\"error\":\r\n   {\r\n     \"message\":\"Unsupported post request.\",\r\n     \"type\": \"GraphMethodException\",\r\n     \"code\":100\r\n   }\r\n}<\/pre>\n<p>Die Erkl&auml;rung ist allerdings einfach: Wir haben die Anfrage als <b>POST<\/b>-Anfrage formuliert und nicht als <b>GET<\/b>. Also f&uuml;gen wir zur folgenden Zeile noch <b>GET <\/b>als letzten Parameter hinzu:<\/p>\n<pre>HTTPRequest strURL, strResponse, \"GET\"<\/pre>\n<p>Nun erhalten wir das gew&uuml;nschte Ergebnis, also genau das JSON-Dokument, das auch der Webbrowser angezeigt hat:<\/p>\n<pre>{\"data\":[{\"installed\":1,\"basic_info\":1\r\n,\"read_stream\":1,\"status_update\":1,\r\n\"photo_upload\":1,\"video_upload\":1,\r\n\"create_note\":1,\"share_item\":1,\r\n\"publish_stream\":1,\"publish_actions\":1\r\n}],\"paging\":{\"next\":\"https:\\\/\\\/graph.\r\nfacebook.com\\\/100000445458715\\\/\r\npermissionsaccess_token=CAACF7ZC\r\nbcxZBkBAGZCWYupEWKqZCM7wwuhgIZBwW\r\nO68FuyrZCp1wnOrfZA8FkT6CWQF91W2853Bn7\r\nKssL63ywhSyFc7GRGfD0rmSl5k4HcH6S1M7nZ\r\nCmzuZBd9qasLXe7lSRd77BI4MayRfVTSLIZCrc\r\nJZA&limit=5000&offset=5000\"}}<\/pre>\n<p><b>JSON<\/b><\/p>\n<p>Aber was ist das f&uuml;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&ouml;nnen, erfahren Sie im Beitrag <b>JSON-Dokumente mit VBA parsen <\/b>(<b>www.access-im-unternehmen.de\/893<\/b>). Dort lernen Sie auch eine Funktion namens <b>JSONParsen <\/b>kennen, welche das JSON-Dokument in ein <b>Collection<\/b>-Objekt verwandelt, das mitunter weitere verschachtelte <b>Collection<\/b>-Objekte enth&auml;lt.<\/p>\n<p><b>Statusmeldung erstellen<\/b><\/p>\n<p>Um diese Funktion zu testen, rufen wir eine Facebook-Methode auf, die eine relativ einfache Antwort zur&uuml;ckliefert. Dabei handelt es sich um das Anlegen einer neuen Statusmeldung auf der eigenen Pinnwand. Als Methode geben wir diesmal nicht <b>permissions<\/b>, sondern <b>feed <\/b>an. Au&szlig;erdem ben&ouml;tigen wir einen zus&auml;tzlichen Parameter namens <b>message<\/b>, der den Meldungstext &uuml;bergibt. Die URL sieht beispielsweise so aus:<\/p>\n<pre>https:\/\/graph.facebook.com\/me\/\r\nfeedmessage=Testmeldung&access_token=\r\nCAACF7ZCbcxZBkBAGZCW...<\/pre>\n<p>Die Prozedur, um den Aufruf einfach durchzuf&uuml;hren, finden Sie in Listing 6. Das Ergebnis enth&auml;lt lediglich den Namen des Elements (<b>id<\/b>) und den Wert (die ID der neuen Statusmeldung):<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>StatusErstellenEinfach()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMessage<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>colResponse<span style=\"color:blue;\"> As <\/span>Collection\r\n     strToken = DLookup(\"Token\", \"tblOptionen\")\r\n     strMessage = \"Testmeldung\"\r\n     strURL = \"https:\/\/graph.facebook.com\/me\/feedaccess_token=\" & strToken _\r\n         & \"&message=\" & strMessage\r\n     HTTPRequest strURL, strResponse, \"POST\"\r\n     <span style=\"color:blue;\">Debug.Print<\/span> strResponse\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 6: Erstellen einer einfachen Statusmeldung<\/span><\/b><\/p>\n<pre>{\"id\":\"100000445458715_645112295513613\"}<\/pre>\n<p>Rufen wir die Prozedur direkt danach erneut mit den gleichen Werten auf, erhalten wir diese Antwort:<\/p>\n<pre>{\"error\":{\"message\":\"(#506) Duplicate \r\nstatus message\",\"type\":\"OAuthException\",\r\n\"code\":506,\"error_data\":\r\n{\"kError\":1455006}}}<\/pre>\n<p>Im Falle eines Fehlers landen Fehlerbeschreibung und weitere Informationen ebenfalls in einem JSON-Dokument. In diesem Fall tritt ein Fehler auf, weil die gleiche Meldung gleich zweimal hintereinander aufgegeben wurde.<\/p>\n<p><b>JSON parsen<\/b><\/p>\n<p>Wie aber verarbeiten wir diese Antworten nun Zun&auml;chst einmal parsen wir diese mit der Funktion <b>JSONParsen <\/b>und schreiben das Ergebnis in ein <b>Collection<\/b>-Objekt:<\/p>\n<pre><span style=\"color:blue;\">Set<\/span> colResponse = JSONParsen(strResponse)<\/pre>\n<p>Danach k&ouml;nnen wir mit der entsprechenden Syntax auf die Elemente zugreifen. Im Falle der <b>id <\/b>sieht dies so aus:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> colResponse!id<\/pre>\n<p><b>id <\/b>ist das einzige Element und kann somit &uuml;ber die Ausrufezeichen-Syntax ausgelesen werden. Tritt ein Fehler auf, ermitteln Sie die einzelnen Elemente wie folgt:<\/p>\n<ul>\n<li><b>colResponse!error!message <\/b>liefert <b>(#506) Duplicate status message<\/b>,<\/li>\n<li><b>colResponse!error!type <\/b>liefert <b>OAuthException<\/b>,<\/li>\n<li><b>colResponse!error!code <\/b>liefert <b>506 <\/b>und<\/li>\n<li><b>colResponse!error!error_data!kError <\/b>liefert den Wert <b>1455006<\/b>.<\/li>\n<\/ul>\n<p>Auf diese Weise greifen Sie auf einfache Elemente zu, bei Auflistungen kommt noch die Klammer-Syntax hinzu &#8211; dazu sp&auml;ter mehr.<\/p>\n<p><b>Formular f&uuml;r neue Statusmeldung<\/b><\/p>\n<p>Nun wollen wir ein kleines Formular entwerfen, mit dem Sie eine Statusmeldung eingeben und an Facebook schicken k&ouml;nnen. Dieses enth&auml;lt lediglich ein Textfeld und eine Schaltfl&auml;che zum Absenden der Meldung &#8211; s. Bild 8. Der Code, der durch das Anklicken der Schaltfl&auml;che ausgel&ouml;st wird, sieht wie in Listing 7 aus. Und jetzt speichern wir den Status und das Ergebnis in einer Tabelle der Datenbank, oder Nein! Man muss ja nicht alles, was man von Access aus erschafft, direkt in der Datenbank speichern.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_008.png\" alt=\"Statusmeldung absenden\" width=\"270\" height=\"167,2516\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 8: Statusmeldung absenden<\/span><\/b><\/p>\n<p>In diesem Fall allerdings mit gutem Grund: Sie k&ouml;nnen das Posting ja &uuml;ber die Benutzeroberfl&auml;che von Facebook wieder entfernen. Die Datenbank w&uuml;rde dann Informationen enthalten, die gar nicht mehr existieren &#8211; also sparen wir uns das Speichern frisch erzeugter Statusmeldungen.<\/p>\n<p><b>Vorherige Statusmeldungen ermitteln<\/b><\/p>\n<p>Nun wollen wir auch kontrollieren, was wir dort auf Facebook ver&ouml;ffentlicht haben. Das k&ouml;nnen Sie nat&uuml;rlich &uuml;ber die Weboberfl&auml;che von Facebook erledigen. Viel interessanter ist es f&uuml;r uns allerdings, per API auf unsere Statusmeldungen zuzugreifen.<\/p>\n<p>Die reine URL sieht so aus:<\/p>\n<pre>https:\/\/graph.facebook.com\/me\/\r\nfeedaccess_token=\r\nCAACF7ZCbcxZBkBAGZCWY...<\/pre>\n<p>Wir greifen also wie schon beim Erstellen der Statusmeldung wieder auf den Feed zu. Diesmal liefern wir aber keine neue Statusmeldung, sondern wollen lediglich Daten abfragen. Das Ergebnis ist bereits so umfangreich, dass wir es hier aus Platzgr&uuml;nden nicht abbilden k&ouml;nnen. Uns interessieren aber auch ohnehin nur wenige Daten &#8211; und zwar die ID eines Eintrags und die Meldung.<\/p>\n<p>Diese Aufgabe &uuml;bernimmt die Prozedur aus Listing 8. Die Prozedur liest wiede-rum den Token aus der Tabelle <b>tblOptionen <\/b>ein und stellt dann die URL f&uuml;r den Request zusammen. Hier handelt es sich wieder um einen <b>GET<\/b>-Request, denn wir wollen ja nur Daten einlesen, aber nicht schreiben &#8211; deshalb hat der dritte Parameter der Funktion <b>HTTPRequest <\/b>den Wert <b>GET<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Sub <\/span>StatusmeldungenEinlesen()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>colFeed<span style=\"color:blue;\"> As <\/span>Collection\r\n     <span style=\"color:blue;\">Dim <\/span>strID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strMessage<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>l<span style=\"color:blue;\"> As Long<\/span>\r\n     strToken = DLookup(\"Token\", \"tblOptionen\")\r\n     strURL = \"https:\/\/graph.facebook.com\/me\/feedaccess_token=\" & strToken\r\n     <span style=\"color:blue;\">If <\/span>HTTPRequest(strURL, strResponse, \"GET\") = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Set<\/span> colFeed = JSONParsen(strResponse)\r\n         For l = 1 To colFeed!Data.Count\r\n             <span style=\"color:blue;\">With<\/span> colFeed\r\n                 strID = colFeed!Data(l)!id\r\n                 On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n                 strMessage = \"#Keine Meldung.\"\r\n                 strMessage = GetElement(!Data(l)!message)\r\n                 <span style=\"color:blue;\">On Error GoTo<\/span> 0\r\n             End <span style=\"color:blue;\">With<\/span>\r\n             <span style=\"color:blue;\">Debug.Print<\/span> strID, strMessage\r\n         <span style=\"color:blue;\">Next<\/span> l\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & JSONParsen(strResponse)!Error!message\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 8: Text und ID der vorherigen Statusmeldungen einlesen<\/span><\/b><\/p>\n<p>Die Prozedur liest das Ergebnis dann mit der Funktion <b>JSONParsen <\/b>in ein <b>Collection<\/b>-Objekt ein. Dieses bietet nun erstmalig die M&ouml;glichkeit, &uuml;ber den Index auf die Elemente der <b>Collection<\/b>-Auflistung zuzugreifen statt nur auf einzelne, verschachtelte Elemente.<\/p>\n<p>Das JSON-Dokument enth&auml;lt unterhalb des Elements <b>data<\/b> einige Elemente, die jeweils einer Statusmeldung samt weiteren Daten entsprechen. Dementsprechend k&ouml;nnen wir in einer <b>For&#8230;Next<\/b>-Schleife &uuml;ber die Werte <b>1 <\/b>bis zur Anzahl der in <b>data <\/b>enthaltenen Elemente alle Statusmeldungen f&uuml;r die Variable <b>l<\/b> abarbeiten.<\/p>\n<p>Das Element <b>colFeed!data(1) <\/b>entspricht also dem ersten Element mit einer Statusmeldung. Dieses Element selbst hat keinen Wert, sondern enth&auml;lt wiederum Attribute mit Werten &#8211; zum Beispiel <b>id <\/b>und <b>message<\/b>. Auf diese greift die Prozedur dann etwa mit <b>colFeed!data(1)!id <\/b>oder mit <b>colFeed!da-ta(1)!message <\/b>zu.<\/p>\n<p>Nun enth&auml;lt <b>id <\/b>immer einen Wert, aber man kann auch Statusmeldungen ohne eine Meldung absetzen &#8211; zum Beispiel, indem Sie einfach ein Bild posten, aber keinen Text hinzuf&uuml;gen. In diesem Fall existiert das Element <b>message<\/b> nicht, was beim Versuch, dieses auszulesen, einen Fehler ausl&ouml;sen w&uuml;rde.<\/p>\n<p>Also rahmen wir diese Anweisung in ein <b>On Error Resume Next <\/b>und <b>On Error Goto 0 <\/b>ein, um die Fehlerbehandlung tempor&auml;r auszuschalten. Vorher f&uuml;llen wir <b>strMessage <\/b>vorsichtshalber mit dem Platzhaltertext <b>#Keine Meldung<\/b>.<\/p>\n<p>Auf diese Weise durchl&auml;uft die Prozedur alle Eintr&auml;ge und gibt diese im Direktfenster aus. Statt der Zeile<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> strID, strMessage<\/pre>\n<p>k&ouml;nnen Sie nat&uuml;rlich beliebige andere Dinge mit den Informationen einer Statusmeldung erledigen &#8211; beispielsweise k&ouml;nnen Sie diese in einer Wertliste zur Anzeige in einem Listenfeld zusammenf&uuml;hren und dort zu l&ouml;schende Beitr&auml;ge ausw&auml;hlen.<\/p>\n<p><b>Listenfeld mit Statusmeldungen<\/b><\/p>\n<p>Machen wir das doch gleich: Das Formular <b>frmStatusmeldungen <\/b>enth&auml;lt eine Schaltfl&auml;che, die eine Prozedur &auml;hnlich der Prozedur <b>StatusmeldungenEinlesen <\/b>aufruft.<\/p>\n<p>Einziger Unterschied: Die Werte f&uuml;r <b>id <\/b>und <b>message <\/b>werden nicht einfach zum Direktfenster geschickt, sondern in einer semikolonseparierten String-Variablen zusammengef&uuml;hrt.<\/p>\n<p>Von dort aus landen sie in der Eigenschaft <b>Datensatzherkunft <\/b>des Listenfeldes <b>lstLetzteMeldungen<\/b>. Dieses ist so eingestellt, dass es das Feld <b>id <\/b>in der ersten und <b>message <\/b>in der zweiten Spalte anzeigt, wobei die erste Spalte jedoch die Breite <b>0cm <\/b>erh&auml;lt und somit unsichtbar ist.<\/p>\n<p>Das Ergebnis sieht etwa wie in Bild 9 aus. Dort findet sich auch eine Schaltfl&auml;che namens <b>cmdLoeschen<\/b>, die wir gleich mit dem Code zum L&ouml;schen der aktuell im Listenfeld ausgew&auml;hlten Statusmeldung f&uuml;llen.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_009.png\" alt=\"Liste der zuletzt eingegangenen Statusmeldungen\" width=\"395\" height=\"344,9512\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 9: Liste der zuletzt eingegangenen Statusmeldungen<\/span><\/b><\/p>\n<p><b>Statusmeldung wieder l&ouml;schen<\/b><\/p>\n<p>Wenn Sie beim Experimentieren mit den hier vorgestellten Techniken einige sinnlose Statusmeldungen auf Ihrer Timeline hinterlassen haben, sollten Sie diese auch schnell wieder verschwinden lassen k&ouml;nnen.<\/p>\n<p>Dies erledigen Sie, indem Sie im Formular <b>frmStatusmeldungen <\/b>den zu l&ouml;schenden Eintrag markieren und dann auf die Schaltfl&auml;che <b>cmdLoeschen <\/b>klicken.<\/p>\n<p>Diese Prozedur aus Listing 9 setzt zun&auml;chst eine URL wie die Folgende zusammen, wobei die <b>ID <\/b>aus der ersten Spalte des Listenfeldes ausgelesen wird:<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdLoeschen_Click()\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strID<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     strToken = DLookup(\"Token\", \"tblOptionen\")\r\n     strID = Me!lstLetzteMeldungen\r\n     strURL = \"https:\/\/graph.facebook.com\/\"\r\n     strURL = strURL & strID & \"method=delete&access_token=\" & strToken\r\n     <span style=\"color:blue;\">If <\/span>HTTPRequest(strURL, strResponse) = <span style=\"color:blue;\">True<\/span><span style=\"color:blue;\"> Then<\/span>\r\n         cmdLetzteMeldungenEinlesen_Click\r\n         <span style=\"color:blue;\">Debug.Print<\/span> strResponse\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 9: L&ouml;schen einer Statusmeldung per Mausklick<\/span><\/b><\/p>\n<pre>https:\/\/graph.facebook.com\/100000445458\r\n715_645112295513613method=delete&\r\naccess_token=CAACF7ZCbcxZBkBAGZC...<\/pre>\n<p>Die URL setzt sich diesmal etwas anders zusammen. Nach der Adresse der Facebook-API folgt die ID der betroffenen Statusmeldung, dann ein Parameter namens <b>method <\/b>mit dem Wert <b>delete <\/b>und schlie&szlig;lich wieder der <b>access_token<\/b>.<\/p>\n<p>Auch das Ergebnis unterscheidet sich von den &uuml;brigen &#8211; zumindest, wenn kein Fehler auftritt. Facebook liefert dann n&auml;mlich kein JSON-Dokument zur&uuml;ck, sondern ganz lapidar den Wert <b>true<\/b>.<\/p>\n<p>Damit haben wir nun einige Grundtechniken erfasst &#8211; damit k&ouml;nnen Sie eine Auflistung der neuesten Statusmeldung ermitteln, neue Statusmeldungen erstellen sowie vorhandene Statusmeldungen l&ouml;schen.<\/p>\n<p>Facebook bietet noch viele weitere M&ouml;glichkeiten &#8211; Sie k&ouml;nnen Ihre Freunde und deren Eigenschaften einlesen, die Kommentare und Likes f&uuml;r Ihre Postings ermitteln und vieles mehr.<\/p>\n<p>Wir wollen uns allerdings noch ein wenig mehr mit dem Ver&ouml;ffentlichungen eigener Statusmeldungen besch&auml;ftigen &#8211; dort gibt es immerhin noch einige weitere M&ouml;glichkeiten wie das Bereitstellen von Bildern.<\/p>\n<p><b>Statusmeldung mit Bild erstellen<\/b><\/p>\n<p>Facebook ist vor allem deshalb so beliebt, weil man mal eben vom Smartphone aus ein frisch geschossenes Bild hochladen und ver&ouml;ffentlichen kann. Dies gelingt auch mit der Facebook-API. Voraussetzung ist, dass wir den Inhalt einer auf der Festplatte liegenden Bilddatei in eine Zeichenkette umwandeln.<\/p>\n<p>Dies erledigen wir mit einer kleinen Hilfsfunktion, die wie in Listing 10 aussieht. Sie erwartet den Pfad zu einer Bilddatei, die f&uuml;r den lesenden Zugriff ge&ouml;ffnet wird. Die Bilddatei wird in das Byte-Array <b>arr() <\/b>eingelesen und von dort aus in eine Unicode-Zeichenkette umgewandelt und als Funktionswert zur&uuml;ckgegeben.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BildAlsString(strDatei<span style=\"color:blue;\"> As String<\/span>)<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>intFile<span style=\"color:blue;\"> As Integer<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>arr()<span style=\"color:blue;\"> As Byte<\/span>\r\n     intFile = FreeFile\r\n     Open strDatei For Binary Access Read<span style=\"color:blue;\"> As <\/span>intFile\r\n     <span style=\"color:blue;\">If <\/span>LOF(intFile) &gt; 0<span style=\"color:blue;\"> Then<\/span>\r\n         ReDim arr(0 To LOF(intFile) - 1)<span style=\"color:blue;\"> As Byte<\/span>\r\n         Get intFile, , arr\r\n         BildAlsString = StrConv(arr, vbUnicode)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n     Close intFile\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 10: Einlesen eines Bildes in eine String-Variable<\/span><\/b><\/p>\n<p>Die Funktion <b>BildAlsString <\/b>nutzen wir wiederum von der Routine <b>BildVer-oeffentlichen <\/b>aus, die sich um den kompletten Vorgang zum Hochladen des Bildes k&uuml;mmert (s. Listing 11). Die Routine hei&szlig;t <b>BildVeroeffentlichen <\/b>und erwartet zwei Parameter &#8211; den Namen der hochzuladenden Bilddatei inklusive Pfadangabe sowie den als Bild&uuml;berschrift zu verwendenden Text. Die Routine ermittelt wie gewohnt den Token und f&uuml;llt die Variable <b>strURL <\/b>mit der Zieladresse. Um ein Bild hochzuladen, f&uuml;gen Sie zur URL den Ausdruck <b>\/photos<\/b> hinzu. Die Zeichenkette, die wir mit der bereits erw&auml;hnten Funktion <b>BildAlsString <\/b>ermitteln, speichern wir in der Variablen <b>strBild<\/b>.<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>BildVeroeffentlichen(strDatei<span style=\"color:blue;\"> As String<\/span>, strText<span style=\"color:blue;\"> As String<\/span>) _\r\n        <span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strURL<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBild<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strPost<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strBoundary<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strToken<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>strResponse<span style=\"color:blue;\"> As String<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>bytPost()<span style=\"color:blue;\"> As Byte<\/span>\r\n     strToken = DLookup(\"Token\", \"tblOptionen\")\r\n     strURL = \"https:\/\/graph.facebook.com\/me\/photos\"\r\n     strBild = BildAlsString(strDatei)\r\n     strBoundary = \"1234567890\"\r\n     strPost = strPost & \"--\" & strBoundary & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"Content-disposition: application\/x-www-form-urlencoded; \" _\r\n         & \"name=\"\"access_token\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & strToken & <span style=\"color:blue;\">vbCrLf<\/span> & \"--\" _\r\n         & strBoundary & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strPost = strPost & \"--\" & strBoundary & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"Content-disposition: application\/x-www-form-urlencoded; \" _\r\n         & \"name=\"\"name\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & strText & <span style=\"color:blue;\">vbCrLf<\/span> & \"--\" _\r\n         & strBoundary & <span style=\"color:blue;\">vbCrLf<\/span>\r\n     strPost = strPost & \"Content-Disposition: form-data; \" _\r\n         & \"name=\"\"source\"\"; filename=\"\"\" & strDatei & \"\"\"\" & <span style=\"color:blue;\">vbCrLf<\/span> _\r\n         & \"Content-Type: application\/octet-stream\" & <span style=\"color:blue;\">vbCrLf<\/span> & <span style=\"color:blue;\">vbCrLf<\/span> & strBild _\r\n         & <span style=\"color:blue;\">vbCrLf<\/span> & \"--\" & strBoundary & \"--\"\r\n     bytPost = StrConv(strPost, vbFromUnicode)\r\n     If HTTPRequest(strURL, strResponse, \"POST\", \"multipart\/form-data; boundary=\" _\r\n             & strBoundary, bytPost) = <span style=\"color:blue;\">True<\/span> Then\r\n         BildVeroeffentlichen = <span style=\"color:blue;\">True<\/span>\r\n     <span style=\"color:blue;\">Else<\/span>\r\n         <span style=\"color:blue;\">MsgBox<\/span> \"Fehler: \" & JSONParsen(strResponse)!Error!message\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 11: Bild bei Facebook hochladen<\/span><\/b><\/p>\n<p>Dann geht es weiter, und zwar mit einer entscheidenden &auml;nderung gegen&uuml;ber den bisherigen Anfragen an die Amazon-API: Wir formulieren nicht die kompletten Parameter innerhalb der gesendeten URL, sondern wir nutzen den Body der HTTP-Anfrage, um die Informationen zu &uuml;bermitteln.<\/p>\n<p>Da der Body verschiedene Elemente enth&auml;lt (den Token, den Namen, den Dateinamen und die Datei selbst), m&uuml;ssen wir die einzelnen Elemente voneinander trennen. Dies erledigen wir mit einem Trennzeichen, das aus zwei Minuszeichen und einer einheitlichen Zeichenfolge besteht, in diesem Fall <b>123456789<\/b>.<\/p>\n<p>Die folgenden Zeilen setzen die zu &uuml;bertragenden Informationen wie in Listing 12 zusammen. Schlie&szlig;lich wandelt die Funktion den kompletten String inklusive der Bilddaten wieder in ein Byte-Array um, das dann an Facebook geschickt wird. Die dazu verwendete Funktion <b>HTTPRequest <\/b>haben wir dazu gegen&uuml;ber der weiter oben verwendeten gleichnamigen Funktion etwas erweitert &#8211; ohne den vorherigen Funktionsumfang zu beschneiden. Diese Variante nimmt nun auch noch die beiden Parameter <b>strContenttype <\/b>und <b>varbinary <\/b>entgegen.<\/p>\n<pre>--1234567890\r\nContent-Disposition: application\/x-www-form-urlencoded; name=\"access_token\"\r\nCAACF7ZCbcxZBkBAGZCWYupEWKqZC...\r\n--1234567890\r\nContent-Disposition: application\/x-www-form-urlencoded; name=\"name\"\r\nNoch ein Beispielbild\r\n--1234567890\r\nContent-Disposition: form-data; name=\"source\"; \r\n    filename=\"C:\\Daten\\Fachartikel\\AccessImUnternehmen\\2013\\04\\Facebook\\pic002.png\"\r\nContent-Type: application\/octet-stream\r\n&#137;PNG...\r\n...Bilddaten<\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 12: Inhalt des Requestheaders<\/span><\/b><\/p>\n<p>Durch die &uuml;bergabe eines Wertes wie <b>multipart\/form-data; boundary=1234567890 <\/b>teilen wir der Zielseite mit, dass die HTTP-Anfrage einen mehrteiligen Body enth&auml;lt, dessen Element durch die Zeichenfolge <b>1234567890 <\/b>getrennt wird. <b>varBinary  <\/b>nimmt den eigentlichen Body entgegen, der dann als Parameter den <b>send<\/b>-Methode an den Server geschickt wird (s. Listing 13).<\/p>\n<pre><span style=\"color:blue;\">Public Function <\/span>HTTPRequest(strURL<span style=\"color:blue;\"> As String<\/span>, strResponse<span style=\"color:blue;\"> As String<\/span>, _\r\n         <span style=\"color:blue;\">Optional<\/span> strMethod<span style=\"color:blue;\"> As String<\/span> = \"POST\", _\r\n         <span style=\"color:blue;\">Optional<\/span> strContenttype<span style=\"color:blue;\"> As String<\/span> = \"application\/x-www-form-urlencoded\", _\r\n         <span style=\"color:blue;\">Optional<\/span> varBinary<span style=\"color:blue;\"> As Variant<\/span>)<span style=\"color:blue;\"> As Boolean<\/span>\r\n     <span style=\"color:blue;\">Dim <\/span>objHTTP<span style=\"color:blue;\"> As <\/span>ServerXMLHTTP\r\n     <span style=\"color:blue;\">Set<\/span> objHTTP = CreateObject(\"MSXML2.ServerXMLHTTP\")\r\n     <span style=\"color:blue;\">With<\/span> objHTTP\r\n         .Open strMethod, strURL, <span style=\"color:blue;\">False<\/span>\r\n         .setRequestHeader \"Content-Type\", strContenttype\r\n         <span style=\"color:blue;\">If <\/span>IsMissing(varBinary)<span style=\"color:blue;\"> Then<\/span>\r\n             .send\r\n         <span style=\"color:blue;\">Else<\/span>\r\n             .send varBinary\r\n         <span style=\"color:blue;\">End If<\/span>\r\n         strResponse = objHTTP.responseText\r\n         <span style=\"color:blue;\">If <\/span>.status = 200<span style=\"color:blue;\"> Then<\/span>\r\n             HTTPRequest = <span style=\"color:blue;\">True<\/span>\r\n         <span style=\"color:blue;\">End If<\/span>\r\n     End <span style=\"color:blue;\">With<\/span>\r\n<span style=\"color:blue;\">End Function<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 13: Neue HTTPRequest-Variante mit RequestHeader-Unterst&uuml;tzung<\/span><\/b><\/p>\n<p>Folgender Aufruf schickt beispielsweise die Bilddatei <b>pic002.png <\/b>aus dem aktuellen Datenbankverzeichnis auf den Webserver, wobei gleich noch der Titel des Bildes mit &uuml;bergeben wird:<\/p>\n<pre>BildVeroeffentlichen CurrentProject.Path & \"\\pic002.png\", \"Noch ein Beispielbild\"<\/pre>\n<p><b>Formular f&uuml;r den Bildupload<\/b><\/p>\n<p>Um den Upload von Bildern etwas komfortabler zu gestalten, bauen wir auch hierf&uuml;r noch ein kleines Formular. Damit geben Sie den Bildtext in ein Textfeld ein und w&auml;hlen die hochzuladende Datei ganz einfach mit einem Dateiauswahl-Dialog aus (s. Listing 14). Der Dateiname wird dann im Textfeld unten im Formular angezeigt und kann jederzeit ge&auml;ndert werden.<\/p>\n<pre><span style=\"color:blue;\">Private Sub <\/span>cmdDateiauswahl_Click()\r\n     Me!txtDateiname = OpenFileName(CurrentProject.Path, \"Bild ausw&auml;hlen\", _\r\n         \"Bilder (*.png;*.jpg;*.gif)|Alle Dateien (*.*)\")\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p><b><span style=\"color:darkgrey;\">Listing 14: &ouml;ffnen des Dateiauswahl-Dialogs<\/span><\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che mit der Beschriftung <b>Absenden<\/b> l&auml;dt das Bild dann auf den eigenen Account (s. Bild 10). Dies l&ouml;st die Prozedur aus Listing 15 aus.<\/p>\n<p class=\"image\"><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2013_04\/pic_895_010.png\" alt=\"Formular zum Hochladen von Bildern\" width=\"395\" height=\"194,8311\" \/><\/p>\n<p><b><span style=\"color:darkgrey;\">Bild 10: Formular zum Hochladen von Bildern<\/span><\/b><\/p>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Mit den Beispielen aus diesem Beitrag haben wir nur an der Oberfl&auml;che der M&ouml;glichkeiten des Zugriffs auf Facebook-Daten &uuml;ber die API gekratzt. Sie k&ouml;nnen noch viel mehr damit anstellen &#8211; beispielsweise die von Ihren Freunden bereitgestellten Informationen auslesen, Alben f&uuml;r Fotos erstellen und die Fotos direkt in diesen Alben speichern.<\/p>\n<p>Oder Sie erstellen Veranstaltungen auf Basis der in einer Access-Datenbank verwalteten Termine und lesen die Informationen &uuml;ber angemeldete Teilnehmer direkt in eine Datenbank ein.<\/p>\n<p>Schauen Sie sich die Beispiele dieses Beitrags einmal an und spielen Sie damit herum &#8211; dabei werden Sie automatisch auf neue Ideen kommen. Teilen Sie uns diese ruhig mit &#8211; gegebenenfalls kommen wir ja in einer Fortsetzung dieses Beitrags darauf zur&uuml;ck und beschreiben den einen oder anderen konkreten Anwendungsfall.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>Facebook.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{A7CE7DFE-66CB-48AE-8C40-5631E8F12813}\/aiu_895.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 &#8211; und Zeit, sich einmal mit der Programmierschnittstelle von Facebook zu besch&auml;ftigen. Was viele n&auml;mlich nicht wissen: Es gibt durchaus Alternativen zum Browser f&uuml;r den Zugriff auf Facebook. Was auch hier und da n&ouml;tig ist &#8211; nicht &uuml;berall bietet die Benutzeroberfl&auml;che die M&ouml;glichkeiten, die sich die Benutzer erhoffen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662013,66042013,44000026],"tags":[],"class_list":["post-55000895","post","type-post","status-publish","format-standard","hentry","category-662013","category-66042013","category-Interaktiv"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Facebook mit VBA programmieren - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Facebook mit VBA programmieren\" \/>\n<meta property=\"og:description\" content=\"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&auml;ftigen. Was viele n&auml;mlich nicht wissen: Es gibt durchaus Alternativen zum Browser f&uuml;r den Zugriff auf Facebook. Was auch hier und da n&ouml;tig ist - nicht &uuml;berall bietet die Benutzeroberfl&auml;che die M&ouml;glichkeiten, die sich die Benutzer erhoffen.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:29:42+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"26\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Facebook mit VBA programmieren\",\"datePublished\":\"2020-05-22T21:29:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/\"},\"wordCount\":4122,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/04fa07729ed744bab221fe5c5bd13136\",\"articleSection\":[\"2013\",\"4\\\/2013\",\"Interaktiv\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/\",\"name\":\"Facebook mit VBA programmieren - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/04fa07729ed744bab221fe5c5bd13136\",\"datePublished\":\"2020-05-22T21:29:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/04fa07729ed744bab221fe5c5bd13136\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/04fa07729ed744bab221fe5c5bd13136\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Facebook_mit_VBA_programmieren\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Facebook mit VBA programmieren\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Facebook mit VBA programmieren - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/","og_locale":"de_DE","og_type":"article","og_title":"Facebook mit VBA programmieren","og_description":"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&auml;ftigen. Was viele n&auml;mlich nicht wissen: Es gibt durchaus Alternativen zum Browser f&uuml;r den Zugriff auf Facebook. Was auch hier und da n&ouml;tig ist - nicht &uuml;berall bietet die Benutzeroberfl&auml;che die M&ouml;glichkeiten, die sich die Benutzer erhoffen.","og_url":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:29:42+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"26\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Facebook mit VBA programmieren","datePublished":"2020-05-22T21:29:42+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/"},"wordCount":4122,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136","articleSection":["2013","4\/2013","Interaktiv"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/","url":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/","name":"Facebook mit VBA programmieren - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136","datePublished":"2020-05-22T21:29:42+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/04fa07729ed744bab221fe5c5bd13136"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Facebook_mit_VBA_programmieren\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Facebook mit VBA programmieren"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000895","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000895"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000895\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000895"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000895"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000895"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}