18
Okt
2010
admin

Erste Schritte mit der Facebook Graph-API

Vorbereitungen
Was wir als erstes brauchen, um mit der Facebook API zu arbeiten, ist die Facebook PHP SDK. Die SDK liegt auf github bereit und kann auf verschiedene Arten von dort heruntergeladen werden.

Download über Git (Beispiel für die Konsole unter Linux):

root@abouttheweb:~# git-clone git://github.com/facebook/php-sdk.git

Download über CURL (Beispiel für die Konsole unter Linux):

root@abouttheweb:~# curl -L http://github.com/facebook/php-sdk/tarball/master | tar xvz

Alternativ kann die Facebook PHP SDK direkt über den Download-Button heruntergeladen werden.

Nach dem Herunterladen interessiert uns erst mal nur die Datei facebook.php aus dem Unterverzeichnis src. Diese Datei kopieren wir nun in das Verzeichnis unseres Webservers, in dem später unsere Anwendung liegen soll (z.B. /srv/www/htdocs/first-steps/). Sinnvoller Weise erstellen wir für diese Datei das Verzeichnis library und legen die Datei facebook.php darunter ab. Zusätzlich legen wir im Wurzelverzeichnis die Datei index.php an. Damit ergibt sich folgende Struktur in unserem Anwendungsverzeichnis:

Die Anwendung
Natürlich müssen wir noch eine Anwendung auf Facebook anlegen. Wie das genau funktioniert, kannst Du hier nachlesen. Ich habe die Anwendung mit folgenden Einstellungen angelegt:

  • Name der Anwendung: ATW - First steps
  • Canvasseite: atw-first-steps
  • Canvas-URL: http://first-steps.abouttheweb.de/

Alle weiteren Einstellungen habe ich beim Standard belassen, womit es also eine iFrame Anwendung werden wird, die später unter http://apps.facebook.com/atw-first-steps/ erreichbar sein wird.

Zugriff auf die Graph-API
Zuerst öffnen wir die Datei index.php in einem Editor. Um mit der Facebook API, bzw. der SDK arbeiten zu können sind folgende Schritte erforderlich:

require_once 'library/facebook.php';

$facebook = new Facebook(array(
  'appId'  => '158216980877573', // Anwendungs ID
  'secret' => '418868cf6403ba880bf3504c6a3908f9', // Anwendungs-Geheimcode
  'cookie' => true, // enable optional cookie support
));

Damit haben wir nun unser Objekt instanziiert und sind in der Lage die API zu nutzen. Als erstes wollen wir uns gerne ein paar Informationen über uns selbst ausgeben lassen. Dazu nutzen wir die Methode api(). Erweitern wir unser Script also folgendermaßen:

try {
  $me = $facebook->api('/me');
  print '<pre>' . print_r($me, true) . '</pre>';
} catch (FacebookApiException $e) {
  print $e;
}

Rufen wir unsere Anwendung nun auf (in diesem Fall http://apps.facebook.com/atw-first-steps/), erhalten wir eine Fehlermeldung, die uns sagt, dass wir ein Access Token brauchen, um Informationen abzufragen. Mit dem Access Token wird sichergestellt, dass die Anwendung autorisiert ist, diese Daten zu erhalten.

Um also diese Anfrage erfolgreich zu stellen, benötigen wir als erstes einen gültigen Access Token. Diesen erhalten wir, indem wir den Benutzer an die URL https://graph.facebook.com/oauth/authorize weiterleiten und einige Parameter übergeben:

  • client_id = Anwendungs-ID
  • redirect_uri = Nach der Autorisierung wird der User zu dieser URL weitergeleitet

In diesem Fall könnte das folgende URL sein:

https://graph.facebook.com/oauth/authorize?
        client_id=158216980877573&
        redirect_uri=http://apps.facebook.com/atw-first-steps/

Rufen wir diese Adresse auf, erhalten wir folgenden Dialog:

An dieser Stelle können wir nun also entscheiden, ob die Anwendung das Recht erhalten soll, auf unsere allgemeinen Daten zugreifen zu dürfen.

Nachdem wir zugestimmt haben, dass die Anwendung auf diese Daten zugreifen darf, werden wir an die Adresse aus dem Parameter redirect_uri weitergeleitet (in diesem Beispiel also die URL unserer Anwendung). Sieht man sich die Adresszeile des Browsers an, fällt einem auf, dass ein zusätzlicher Parameter, mit dem Namen code, angehängt wurde. Mit dem Wert des Parameters code können wir nun einen Access Token anfordern. Dazu leiten wir den Benutzer auf die URL https://graph.facebook.com/oauth/access_token weiter und fügen folgende Parameter hinzu:

  • client_id = Anwendungs-ID
  • redirect_uri = Nach der Anforderung wird der User zu dieser URL weitergeleitet
  • client_secret = Anwendungs-Geheimcode
  • code = Der Wert, der uns in der URL mit dem Parameter code mitgeliefert wurde

In diesem Fall wäre das die folgende URL:

https://graph.facebook.com/oauth/access_token?
        client_id=158216980877573&
        redirect_uri=http://apps.facebook.com/atw-first-steps/&
        client_secret=418868cf6403ba880bf3504c6a3908f9&
        code=2.ex_l7Yht4_cNwyBvIrr2UA__.3600.1287417600-100001650030263|FPiMF1msKRV3nbiDgB4iN0LU4Ps

Nun wird uns als Antwort unser Access Token zurückgegeben. Zusätzlich erhalten wir im Parameter expires die Zeit in Sekunden, wie lange unser Token gültig ist.

Wer so tapfer war bis hierhin zu lesen und den Vorgang nachzuvollziehen, wird jetzt eine wesentlich einfachere Methode kennenlernen, um ein Access Token zu erhalten. Ich halte es allerdings für wichtig, den Prozess zum Anfordern eines Tokens zu kennen, auch wenn man ihn in der Form nicht direkt einsetzt. Für die einfachere Methode greifen wir wieder auf die API zu:

if ($facebook->getSession()) {
  try {
    $me = $facebook->api('/me');
    print '<pre>' . print_r($me, true) . '</pre>';
  } catch (FacebookApiException $e) {
    print $e;
  }
} else {
  $params = array(
    'fbconnect' => 0,
    'canvas' => 1,
  );

  $loginUrl = $facebook->getLoginUrl($params);
  print '<script>top.location.href = "' . $loginUrl . '"</script>';
}

Als erstes prüfen wir mit getSession(), ob der Benutzer bereits autorisiert ist, bzw. eine Session besteht. Ist die Session nicht vorhanden, wird mit der Methode getLoginUrl() der Link zum Autorisierungsdialog erzeugt. Man kann getLoginUrl() diverse Parameter in Form eines Arrays übergeben. Für unseren Fall reichen erst mal fbconnect (legt fest, ob es sich um eine Connect Anwendung handelt) und canvas (legt fest, ob es sich um eine Canvas Anwendung handelt) aus. Anschließend wird der Benutzer per JavaScript an die, durch getLoginUrl(), erzeugte URL weitergeleitet. Dort erhalten wir ebenfalls den oben gezeigten Dialog zur Anfrage einer Genehmigung zum Zugriff auf unsere Daten. Bestätigen wir diese Anfrage, werden wir wieder auf die Seite unserer Anwendung geleitet und sehen folgende Ausgabe:

Wir sehen also, dass eine Session existiert und dass der Zugriff auf unsere Daten über die API funktioniert hat. Lassen wir uns nun noch mal zusätzlich anzeigen, welche Daten in unserer Session gespeichert wurden. Dazu ändern wir unser Script leicht ab:

if ($session = $facebook->getSession()) {
  try {
    $me = $facebook->api('/me');
    print '<pre>' . print_r($me, true) . '</pre>';
    print '<pre>' . print_r($session, true) . '</pre>';
  } catch (FacebookApiException $e) {
    print $e;
  }
} else {
  $params = array(
    'fbconnect' => 0,
    'canvas' => 1,
  );

  $loginUrl = $facebook->getLoginUrl($params);
  print '<script>top.location.href = "' . $loginUrl . '"</script>';
}

Wir erhalten folgende Ausgabe:

Wir brauchen wir uns bei dieser Methode also keine Gedanke darum machen, wie wir an ein Access Token kommen. Die Anwendung macht dies automatisch im Hintergrund und nutzt den Access Token, ebenfalls automatisch, um Abfragen durchzuführen. Durch die Generierung der Login URL mittels getLoginUrl(), werden diverse Parameter übergeben, um die wir uns nicht kümmern müssen. Dadurch wird ein Access Token erstellt die Session mit den für uns relevanten Daten gefüllt.

Hier nun noch mal das komplette, ausführlich dokumentierte, Script:

<?php

require 'library/facebook.php';

$facebook = new Facebook(array(
  'appId'  => '158216980877573', // Anwendungs ID
  'secret' => '418868cf6403ba880bf3504c6a3908f9', // Anwendungs-Geheimcode
  'cookie' => true, // enable optional cookie support
));

if ($session = $facebook->getSession()) { // Session vorhanden?
  try {
    $me = $facebook->api('/me'); // Daten üder API abfragen.
    print '<pre>' . print_r($me, true) . '</pre>'; // Ausgabe der persönlichen Daten.
    print '<pre>' . print_r($session, true) . '</pre>'; // Ausgabe der Sessiondaten.
  } catch (FacebookApiException $e) {
    print $e;
  }
} else { // Keine Session vorhanden.
  $params = array(
    'fbconnect' => 0,
    'canvas' => 1,
  );

  $loginUrl = $facebook->getLoginUrl($params); // URL zum Autorisierungsdialog erstellen.
  print '<script>top.location.href = "' . $loginUrl . '"</script>'; // Weiterleitung zum Anfordern der Autorisierung.
}
?>
Hinweis
Du kannst alle Codebeispiele von AboutTheWeb über ein SVN Repository auschecken. Dieses Beispiel findest du unter folgender Adresse:
http://svn.abouttheweb.de/atwtutorials/trunk/first-steps/

Alternativ kannst Du alle Codebeispiele über das AboutTheWeb github Repository auschecken.

Trackback-URL für diesen Beitrag

http://abouttheweb.de/trackback/585

Ähnliche Artikel

Bild des Benutzers Tobias
Tobias
Sa, 12/18/2010 - 15:12

Sehr gut erklärt!

Die "Anfrage auf Genehmigung" kann aber abschrecken, vor allem wenn man gar nicht auf die Daten des Nutzers zugreifen möchte. Wenn ich es richtig verstanden haben, muss - um die API aufzurufen - eine Session vorhanden sein, und die bekommt man nur über die Genehmigung. Sehe ich das richtig?

Es gibt - wie ich gelesen habe - auch die automatische Autorisierung, wo der Nutzer erst Aktiv werden muss (z.B. einen Link klicken) bevor man auf die Allgemeinen Daten zugreifen kann. Es erscheint dabei aber keine Abfrage. Ich habe das schon versucht umzusetzen, habe es aber nicht hinbekommen. Hast Du damit schon Erfahrungen?

Bild des Benutzers admin
admin
Sa, 12/18/2010 - 18:18

Mit der automatische Autorisierung hatte man Zugriff auf die ID des Benutzers und einige wenige weitere Daten. Diese Daten befanden sich in den fb_sig Parametern (var_dump($_GET) beim Aufruf der Anwendung). Dieses Verhalten kann man zurzeit wiederherstellen, indem man in den Anwendungseinstellungen unter Fortgeschritten >> Migrations den Punkt "OAuth 2.0 for Canvas" deaktiviert. Es wird allerdings in naher Zukunft abgestellt und dann wird es nur noch den OAuth 2.0 Dialog zur Autorisierung geben.

Bild des Benutzers Adrian
Adrian
Mi, 12/22/2010 - 01:13

Vielen Dank für dieses super Tutorial!
Eine kurze Frage habe ich aber noch: Nehmen wir mal an, dass ich nur auf die Daten meines Profils zugreifen will. Muss ich dafür wirklich extra eine eigene Anwendung registrieren oder gibt es noch eine andere Facebook-API?
Wäre wirklich nett, wenn du mir da kurz weiterhelfen könntest.

Bild des Benutzers admin
admin
Mi, 12/22/2010 - 02:21

Um auf die Daten von Facebook zuzugreifen, benötigt man immer eine Anwendung. Die einzige Möglichkeit sonst noch an die eigenen Daten zu kommen, besteht darin, sie herunterzuladen. Das kannst du in den Einstellungen Deines Profils machen.

Bild des Benutzers Adrian
Adrian
Mi, 12/22/2010 - 13:23

Ok danke, aber wie machen es dann Dektopclients?

Bild des Benutzers admin
admin
Mi, 12/22/2010 - 13:28

Hast du mal ein Beispiel?

Bild des Benutzers Adrian
Adrian
Mi, 12/22/2010 - 13:41

z.B. Socialite

Bild des Benutzers admin
admin
Mi, 12/22/2010 - 13:48

Ich kenne die App zwar nicht weiter aber ich denke, dass das auch einfach normale API Zugriffe sein werden. Und die Desktop Authentication. Anders geht es im Prinzip auch gar nicht. Letztendlich stammen die Daten ja von den Facebook Servern. Und darauf kann man nur über die, von Facebook definierten, Schnittstellen zugreifen.

Bild des Benutzers Amelie
Amelie
Fr, 01/21/2011 - 20:40

Hallo! Super Tuts hast du. Herzlichen Dank hierfür.
Blicke aber bei dem AccessToken noch nicht so ganz durch.

Ich habe z.B. eine öffentliche Seite, sämtliche Daten können ja ohne FB-Account abgerufen werden. Das heisst, das ganze ist für jeden ersichtlich.
Jetzt wollte ich mir eigentlich meinen Inhalt mittels PHP auf meiner Seite anzeigen lassen. Zu den Alben habe ich z.B. Zugang, zu den Veranstaltung aber nicht.

Ich sehe noch nicht ganz warum ich nun einen AccessToken benötige für etwas, das sowieso jeder sehen kann ohne Authentifizierung etc.
Bzw. will ich ja nicht, dass jeder der z.B. meine Statusmeldungen auf meiner Site sehen kann diese Meldung angezeigt kriegt, damit ich Access habe auf seine Daten (das brauch ich ja auch gar nicht)...

Kannst du mir ein wenig Licht ins Dunkeln bringen!? :)

Vielen Dank.

Bild des Benutzers Gor
Gor
Mi, 03/30/2011 - 15:06

Hallo zusammen,

ich habe das gleiche Problem das ich nicht auf die Veranstaltungen zugreifen kann. Nur wenn ich manuell ein AccessToken erstelle.

Grüße

Bild des Benutzers admin
admin
Mi, 03/30/2011 - 15:09

Du hast ein Event erstellt, das du jetzt nicht via API auslesen kannst? Oder verstehe ich das falsch?

Bild des Benutzers Robster
Robster
Di, 05/10/2011 - 12:06

Vielen Dank für dieses super verständlich geschriebene Tutorial. Ich habe zum Thema Access Token in den letzten Stunden viel gelesen und nichts davon wirklich verstanden (auch nicht das, was im eigentlich ganz guten Facebook Buch von O'Reilly dazu gesagt wird). Die Krönung ist aber dein sauber kommentiertes Script, was mir innerhalb von einer Minute die Lösung meines Problems ermöglicht hat.

You made my day!

Bild des Benutzers TobiLei
TobiLei
Mi, 11/09/2011 - 11:24

Hallo,

beim testen des letzten Scriptbeispiels bekomme ich die folgende Fehlermeldung :

Fatal error: Call to undefined method Facebook::getSession() in index.php on line 11

Ich kann leider nicht herausfinden, an was dies liegt...

TobiLei

X
Laden