Kategorien
Webdesign

Herr der Nutzerdaten – Facebook-Anwendungen mit PHP, Teil 2

Nutzerdaten sind über Facebook-Anwendungen einfach auszwerten. Den Werbetreibenden freut’s – vielleicht auch den Verfassungsschutz. Den Nutzern selbst ist oftmals gar nicht klar, was mit ihren teils sensiblen Daten passieren kann. Umso verantwortungsvoller sollten Entwickler von Facebook-Anwendungen mit Nutzerdaten umgehen.

Als Anwendungsentwickler für Facebook sind die Nutzerdaten ein großer Anreiz: Damit kann man zum einen natürlich gezielt werben – zum anderen kann man mit den Daten auch Schindluder betreiben. Der verantwortliche Umgang mit den Nutzerdaten ist wichtig, doch leider gibt ein Nutzer, nach dem Hinzufügen einer Anwendung in gewisser Hinsicht die Hoheit über die eigenen Daten auf.

Viel zu wenige Nutzer editieren die Optionen zur Privatssphäre, welche Facebook bereitstellt. Deshalb ist es ein leichtes, über minimalistische Anwendungen an Daten zu gelangen. Dieser Teil der Reihe zur Anwendungsentwicklung für Facebook mit PHP zeigt die Wege auf, mit denen es Facebook einem Anwendungsentwickler erlaubt, Nutzerdaten abzufragen und zum Beispiel in die eigene Datenbank zu überführen.

Die Integrität der eigenen Daten im Netz ist wichtig – gerade auf Facebook sind Nutzer bereit, sehr viel private Informationen an Dritte weiterzugeben. Es scheint, dass vielen Nutzern nicht bewusst ist, auf was für Daten Anwendungen nach einer Authentifizierung durch den Nutzer zurückgreifen können. Grundsätzlich bietet Facebook den Anwendungsentwicklern mehrere Möglichkeiten, an die Nutzerdaten zu gelangen.

Direkter Zugriff über vordefinierte API Funktionen

Die PHP Client Library beinhaltet eine Reihe an Funktionen, mit denen Sie auf einen vordefinierten Satz von Daten zugreifen können. Diese Funktionen stellen zum größten Teil Wrapper dar für einfache SQL-Anfragen an die Facebook-Datenbank. Sie können auch direkt selbst Anfragen als SQL-Selects durchführen.

Dafür gibt es eine Facebook-eigene Query Sprache, die FQL – Facebook Query Language, die eine Teilmenge von SQL ist. Zunächst wollen wir uns Abfragen über die API-Wrapper-Funktionen anschauen.

Die zentrale Funktion ist „users.getInfo“. Über sie kann fast das komplette Profil ausgelesen werden (welches der Nutzer anderen zugänglich macht), sofern die Abfrage mit Verwendung eines Sessionkeys erfolgt. Falls nicht, so können Sie lediglich Information, wie den Namen und das Profilbild abrufen.

<?php
// die Facebook PHP Client-Library einfügen
include_once 'php/facebook.php';
// Ihr API Schlüssel
$api_key = '';
$secret  = '';
// eine Objektinstanz erzeugen
$facebook = new Facebook($api_key, $secret);
//wird verwendet, sodass die Seite den Facebook Look hat - also mit Tabnavigation
$facebook->require_frame();
//Fordert den Nutzer auf, der Applikation den Zugriff zu gewähren
$user = $facebook->require_login();
?>
<p>Hallo <fb:name uid='<?php echo $user?>' capitalize="true" firstnameonly="true" useyou="false" linked="true"/>, dies ist eine minimalistische Facebook Anwendung, die mit der PHP Clientlibrary realisiert wurde - mal schauen, wie weit wir hiermit noch kommen. In der Zwischenzeit kannst du hier doch ein Kommentar hinterlassen...</p>

<fb:comments xid="commentsBox" canpost="true" candelete="false" returnurl="http://apps.facebook.com/cook-off">

<fb:title>Kommentare</fb:title>

</fb:comments>

<p>Oh, siehe da, wir wollen noch ein wenig herumspielen und mal schauen, auf welche Daten wir nun Zugriff haben...</p>

<?php

$userDetails = $facebook->api_client->users_getInfo($user, array ("last_name", "first_name", "name", "pic", "birthday","current_location","hometown_location", "status", "political", "work_history"));

echo "<p>Dein Name ist ".$userDetails[0]['first_name']." und du kommst aus ".$userDetails[0]['hometown_location']['city']." in ".$userDetails[0]['hometown_location']['state'].", zur Zeit lebst du aber in ".$userDetails[0]['current_location']['city'].".</p>";

//mit Hilfe des Variable Dump sehen Sie die Struktur des zurückgelieferten Arrays am Besten

echo "<pre>";

var_dump($userDetails);

echo "</pre>";

?>
Anhand des Variable-Dump können Sie am Besten die Struktur des Arrays erkennen. Im Fall der Fälle, dass ein Nutzer Profilinformationen ausgelassen hat, können Sie etwa mit der Funktion isset() eine Abfrage machen. Eine genaue Auflistung, an was für Profildaten Sie mit Hilfe der Funktion users_getInfo() gelangen, finden Sie in der API- Referenz. Die mögliche Informationsfülle ist erstaunlich – neben den politischen Ansichten, können Sie die Erwerbsgeschichte sowie die Ausbildung eines Nutzers abfragen. Je nach Privatsphäreneinstellungen der Nutzer sind manche Informationen sichtbar und manche nicht.

Insgesamt bietet Ihnen Facebook die Möglichkeit per SELECT auf Informationen aus einer ganzen Reihe von Tabellen zurückzugreifen.

Abfrage per Facebook Query Language

Sie können auch direkt über die Facebook Query Language eine Abfrage an die Datenbanktabelle absetzen – natürlich ebenfalls über eine vordefinierte Funktion, welche die Abfrage absetzt.  Sie erhalten in diesen Abfragen jedoch etwas mehr Flexibilität, da Sie zum Beispiel in einer Abfrage Informationen aus verschiedenen SQL-Tabellen gleichzeitig erhalten können. Dazu gibt es in der API eine eigene Funktion. Diese Möglichkeit haben Sie mit den vordefinierten Wrappern nicht.

Zunächst jedoch dieselbe Abfrage wie oben, diesmal als FQL Query. Der Code dazu ist wie folgt:

<?php
$fql = "SELECT last_name, first_name, name, pic, birthday, current_location, hometown_location, status, political, work_history FROM user WHERE ".$user. " IN (uid)";
$userDetails = $facebook->api_client->fql_query($fql);
echo "<p>Dein Name ist ".$userDetails[0]['first_name']." und du kommst aus ".$userDetails[0]['hometown_location']['city']." in ".$userDetails[0]['hometown_location']['state'].", zur Zeit lebst du aber in ".$userDetails[0]['current_location']['city'].".</p>";
echo "<pre>";
var_dump($userDetails);
echo "</pre>";
?>

Die Syntax ist etwas anders als bei SQL – das wird insbesondere im WHERE-Teil deutlich. Facebook unterstützt für FQL keine Abfragen, der Form SELECT * FROM. Um sich vor Angriffen über SQL Injections zu schützen, wird das FQL – bevor daraus eine eigentliche SQL-Abfrage wird – auf mögliche subversive Versuche überprüft. Die Semantik von FQL ist jedoch dieselbe wie die von SQL.

Um an spezifische Werte zu gelangen, etwa wenn Sie von dem Heimatort die Postleitzahl wissen möchten, so können Sie die SELECTS etwas spezifischer gestalten, indem Sie den Query anpassen: „SELECT last_name, hometown_location.zip FROM user WHERE UID IN (uid)“. Damit müssen Sie keine Information verarbeiten, die redundant ist.

Verschachtelte SELECTs

Im ersten Teil wurde ja bereits angekündigt, dass wir unseren Friend-Selector für das Versenden von Einladungen etwas benutzerfreundlicher machen möchten, indem dieser nur noch Freunde in der Liste anzeigt, welche die Anwendung noch nicht hinzugefügt haben.

Die dazugehörige Auswahl kann mit folgender Zeile bewerkstelligt werden:
SELECT uid FROM user WHERE is_app_user = 0 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = ".$user.")
Hier sieht man auch schön die verschachtelte Natur der Anfragen.

So sieht der fertige Code aus:

 <?php
// die Facebook PHP Client-Library einfügen
include_once 'php/facebook.php';
// Ihr API Schlüssel
$api_key = '';
$secret  = '';
// eine Objektinstanz erzeugen
$facebook = new Facebook($api_key, $secret);
//wird verwendet, sodass die Seite den Facebook Look hat - also mit Tabnavigation
$facebook->require_frame();
//Fordert den Nutzer auf, der Applikation den Zugriff zu gewähren
$user = $facebook->require_login();
if(isset($_GET["action"]) && $_GET["action"] == 'step1')
{
?>
<p>Hallo <fb:name uid='<?php echo $user?>' capitalize="true" firstnameonly="true" useyou="false" linked="true"/>, bevor es richtig los geht -- lade doch deine Freunde ein.</p>
<?php
//die UIDs aller Freunde ermitteln, welche die Anwendung bereits hinzugefügt haben
$fql = "SELECT uid FROM user WHERE is_app_user = 1 AND uid IN (SELECT uid2 FROM friend WHERE uid1 = ".$user.")";
$res = $facebook->api_client->fql_query($fql);
//das Ergebnis der Abfrage ist in einem zweidimensionalen Array der Form $res[$i][0]['uid'], wobei $i Zählvariable ist
$friends = "";
//aus dem Ergebnis Array ein String machen, mit Kommatrennung, da wir das als Attribut für unser FBML Element verwenden können
for($i=0; $i<count($res);$i++) {
if($i==0) {
if(!isset($res[0]['uid'])) {
$friends = "";
}
else {
$friends = $res[0]['uid'];
}
}
else {
$friends = $friends.",".$res[$i]['uid'];
}
}
$invitationContent ="<fb:name uid=\"".$user."\" firstnameonly=\"true\" shownetwork=\"false\"/> hat sich im <a
href=\"http://apps.facebook.com/cook-off/\">Webgeek Quiz</a> versucht und dachte, dass du es auch ausprobieren
solltest!\n"."<fb:req-choice url=\"".$facebook->get_add_url()."\" label=\"Put Webgeek on your profile\"/>";
?>
<fb:request-form action="index.php?action=step2" method="post" type="cook-off" content="<?php echo htmlentities($invitationContent,ENT_COMPAT,'UTF-8'); ?>">
<fb:multi-friend-selector actiontext="Hier ist die Liste deiner Freunde, die sich noch nicht probiert haben!" exclude_ids="<?php echo $friends; ?>" /></fb:request-form>
<?php
}
elseif(isset($_GET["action"]) && $_GET["action"] == 'step2')
{
echo "<h1>Sehr gut</h2>";
}
else {
?>
<p>Hallo <fb:name uid='<?php echo $user?>' capitalize="true" firstnameonly="true" useyou="false" linked="true"/>, nimm hier an unserem Quiz teil und finde heraus, ob du ein Geek bist.</p>
<h2><a href="index.php?action=step1">Quiz starten</a></h2>
<?php
}
?>

Wer sich diese paar Zeilen Code anschaut, wird feststellen, dass wir dem Ziel einer Anwendung schon etwas näher gekommen sind. Durch die Query-String Variable $action können wir den Benutzer etwas durch die Anwendung lenken. Der Ablauf ist noch relativ simpel – zunächst, nachdem der Nutzer die Anwendung hinzugefügt hat, bekommt er, nach Klick auf „Quiz starten“ zunächst die Aufforderung zu Gesicht, die Anwendung doch seinen Freunden weiterzuempfehlen. Inwieweit das benutzerfreundlich ist, sei dahingestellt – jedoch wird deutlich, wie sie den Nutzer an die Hand nehmen und so durch den Ablauf der Anwendung durchführen können.

Das lesen Sie in der Fortsetzung

Im nächsten Teil wollen wir die Anwendung fertigstellen. Unter anderem sollen:

  • über Formulare Fragen beantwortet werden,
  • diese werden dann, mitsamt einiger demographischer Daten über den Anwendungsnutzer in der eigenen Datenbank hinterlegt;
  • zudem wird ein einfaches Ranking anhand der bisher abgelegten Quizergebnisse erzeugt, sodass der Nutzer sieht, wie er relativ gesehen, abgeschnitten hat.

(mm)

Von Thiemo Fetzer

Thiemo Fetzer lebt seit 2008 in London und promoviert dort im Fachbereich "Entwicklungsökonomie" an der London School of Economics. Zuvor hat er Wirtschaftswissenschaften, Mathematik und Informatik in Magdeburg und Ulm studiert.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.