Wie erstelle ich einen Facebook RSS Feed Reader für meinen Blog - Seite 4

7 Den RSS Feed automatisch im Profil aktualisieren

Du wirst vielleicht schon festgestellt haben, dass der RSS Feed im Profil nur aktualisiert wird, wenn Du die Canvas Seite Deiner Anwendung in Facebook besuchst. Das stellt ein Problem dar, da sich die Leute die meiste Zeit auf der Profil-Seite aufhalten. Um den RSS Feed auf der Profil-Seite automatisch zu aktualisieren, müssen wir einen Cron Job dafür auf unserem Server anlegen, der den RSS Feed auf den Facebook Profilen automatisch aktualisiert.

Es gibt zwei verschieden Möglichkeiten Profile zu aktualisieren: direkt und indirekt (siehe http://wiki.developers.facebook.com/index.php/Changing_profile_content). Wenn Dein Inhalt für jeden Benutzer individuell ist, musst Du die direkte Methode verwenden. Ist er für alle Bentuzer gleich, ist es viel einfacher, die indirekte Methode zu verwenden. Da unser RSS Feed für alle Benutzer gleich ist, verwenden wir die indirekte Methode, für die wir einen unbeschränkten Session Key für unsere Anwendung brauchen, damit sich der Cron Job zu jeder Zeit bei Facebook anmelden kann.

Um unseren unbeschränkten Session Key herauszufinden, erstellen wir das Skript get_infinite_key.php, wie auf http://wiki.developers.facebook.com/index.php/Infinite_session_howto gezeigt wird:

vi /var/www/fb/htf_feed_reader/get_infinite_key.php


<?php
require_once('appinclude.php'); // force a login page $facebook->require_frame(); $user = $facebook->require_login(); // Echo the "infinite session key" that everyone keeps talking about. echo $facebook->api_client->session_key; ?>
Melde Dich nun in Deinem Browser in Facebook ab und lösche alle Cookies oder noch besser, verwende einen anderen Browser mit dem Du noch nie auf Facebook warst (mein Standard Browser ist Firefox, slso verwende ich dafür SeaMonkey) und rufe dieses Skript in Deinem Browser auf (z.B. http://fb.howtoforge.com/fb/htf_feed_reader/get_infinite_key.php).

Du wirst dann aufgefordert, Dich bei Facebook anzumelden. Bitte achte darauf, dass Du "Save my login info to avoid logging in to Facebook again to use this application" markierst:


Danach sollte sich eine Seite öffnen, die den unbeschränkten Session Key Deiner Anwendung anzeigt. Schreib ihn bitte irgendwo auf:


Lösche danach  get_infinite_key.php:

rm -f /var/www/fb/htf_feed_reader/get_infinite_key.php

Im Cron Job Skript, das ich hier verwenden werde, nutze ich die Funktion $facebook->api_client->fbml_refreshRefUrl() um die URL aufzurufen, welche die HTML/FBML Seite für die Profil-Seiten ausliefert. Diese URL sollte nichts anderes als den HTML/FBML Code liefern; unser index.php Skript liefert den HTML/FBML Code (for the application's canvas page in Facebook, using the echo $fbml; line) und ändert außerdem die Profile der Benutzer mit der  $facebook->api_client->profile_setFBML() Funktion. Wenn wir diese Funktion in unserem Cron Job Sript verwenden würden, würden wir die Benutzer ID jedes Bentuzers, der unsere App installiert hat, benötigen. Wir haben diese Benutzer IDs allerdings nicht, da wir sie mit unserer App nicht verfolgen und wie bereits erwähnt möchten wir die indirekte Methode verwenden um die Profile zu aktualisieren.

Daher setze ich den Code zum Parsen von RSS und Anzeigen der HTML/FBML in ein separates Skript, rss.php, das ich im index.php und unserem Cron Job Skript, cronjob.php, aufrufen werde. Ich werde außerdem eine Konfigurationsdatei (conf.php) für unsere App erstellen, die alle variablen Einstellungen beinhaltet und die in allen anderen Skripten enthalten ist.

Also lass uns anfangen:

vi /var/www/fb/htf_feed_reader/conf.php


<?php
$appapikey = 'YOUR_API_KEY'; $appsecret = 'YOUR_SECRET'; $infinite_session_key = 'YOUR_INFINITE_SESSION_KEY'; $appcallbackurl = 'http://fb.howtoforge.com/fb/htf_feed_reader/'; $rss_url = 'http://fb.howtoforge.com/fb/htf_feed_reader/rss.php'; $feed = 'http://www.howtoforge.com/node/feed'; $magpie_cache_dir = './magpie_cache'; ?>
$feed ist die URL unseres RSS Feeds und $rss_url ist die URL unserer rss.php Datei (die noch erstellt werden muss). Bitte verwechsle diese beiden nicht.

Da wir nun conf.php verwenden, sieht unsere neue appinclude.php wie folgt aus:

vi /var/www/fb/htf_feed_reader/appinclude.php


<?php
include('conf.php'); require_once 'facebook.php'; $facebook = new Facebook($appapikey, $appsecret); $user = $facebook->require_login(); //catch the exception that gets thrown if the cookie has an invalid session_key in it try { if (!$facebook->api_client->users_isAppAdded()) { $facebook->redirect($facebook->get_add_url()); } } catch (Exception $ex) { //this will clear cookies for your application and redirect them to a login prompt $facebook->set_user(null, null); $facebook->redirect($appcallbackurl); } ?>
index.php sieht wie folgt aus:

vi /var/www/fb/htf_feed_reader/index.php


<?php
include('conf.php'); require_once('appinclude.php'); include('rss.php'); $facebook->api_client->profile_setFBML('<fb:ref url="'.$rss_url.'"/>', $user); $facebook->api_client->fbml_refreshRefUrl($rss_url); ?>
rss.php sieht wie folgt aus (ich habe den RSS Cache für MagpieRSS hier  ausgeschaltet, Du kannst ihn aber anschalten, wenn Du magst):

vi /var/www/fb/htf_feed_reader/rss.php


<?php
include('conf.php'); //define('MAGPIE_CACHE_DIR', $magpie_cache_dir); define('MAGPIE_CACHE_ON', 0); //define('MAGPIE_CACHE_AGE', 600); require_once('rss/rss_fetch.inc'); $rss = @fetch_rss($feed); $fbml = '<fb:header decoration="no_padding">HowtoForge RSS Feed Reader</fb:header><div style="margin:0 10px 0 10px;">'; $fbml .= '<table border="0" width="100%" style="margin: 5px 5px 5px 5px;"><tr><td valign="top" width="80%"><a href="'.$rss->channel['link'].'" style="font-weight: bold;">'.$rss->channel['title'].'</a></td><td valign="top" width="80%"><fb:share-button class="meta"> <meta name="medium" content="blog"/> <meta name="title" content="'.htmlspecialchars(strip_tags($rss->channel['title'])).'"/> <meta name="description" content="'.htmlspecialchars(strip_tags($rss->channel['description'])).'"/> <link rel="target_url" href="'.$rss->channel['link'].'"/> </fb:share-button></td></tr></table>'; foreach ($rss->items as $item) { $fbml .= '<div style="border-bottom: 2px solid #CCCCCC; padding-bottom:5px;"><br><div style="border-bottom: 1px dotted #CCCCCC; border-top: 1px dotted #CCCCCC;"><table border="0" width="100%" style="margin: 5px 5px 5px 5px;"><tr><td valign="top" width="80%"><a href="'.$item['link'].'" style="font-weight: bold;">'.$item['title'].'</a></td><td valign="top" width="80%"><fb:share-button class="meta"> <meta name="medium" content="blog" /> <meta name="title" content="'.htmlspecialchars(strip_tags($item['title'])).'" /> <meta name="description" content="'.htmlspecialchars(strip_tags($item['description'])).'" /> <link rel="target_url" href="'.$item['link'].'" /> </fb:share-button></td></tr></table></div>'; if($item['description']) $fbml .= $item['description']; $fbml .= '</div>'; } $fbml .= '</div>'; echo $fbml; ?>
cronjob.php sieht wie folgt aus:

vi /var/www/fb/htf_feed_reader/cronjob.php


<?php
include('conf.php'); require_once 'facebook.php'; $facebook = new Facebook($appapikey, $appsecret); $facebook->api_client->session_key = $infinite_session_key; // Now you can update FBML pages, update your fb:ref tags, etc. $facebook->api_client->fbml_refreshRefUrl($rss_url); ?>
Nun kannst Du cronjob.php direkt in Deinem Browser öffnen (z.B. http://fb.howtoforge.com/fb/htf_feed_reader/cronjob.php) um zu überprüfen, ob Dein RSS Feed auf Deinem Facebook Profile aktualisiert wird (natürlich muss Dein RSS Feed anders als zuvor sein...).

Wenn alles wie erwartet funktioniert, kannst Du einen Cron Job anlgegen, der cronjob.php alle 30 Minuten (oder so oft wie Du magst) aufruft:

crontab -e


0,30 * * * * /usr/bin/wget -O /dev/null http://fb.howtoforge.com/fb/htf_feed_reader/cronjob.php &> /dev/null
Von nun an werden die Profile der Facebook Benutzer, die Deine RSS Reader Anwendung installiert haben, automatisch aktualisiert.

8 Ein Symbol für Deine Anwendung erstellen

Um ein Symbol (16 x 16px, die Größe wird angepasst wenn es größer sein sollte; Format: gif, png, jpg) für Deine Anwendung zu erstellen, gehe zur "My Applications" Seite in der Developer Application und klicke auf "Edit Settings":


Scrolle danach etwas runter, dorthin wo von "Icon" die Rede ist und klicke auf den "Change your icon" Link:


Wähle Dein Symbol von Deiner Festplatte aus, bestätige, dass Du das Recht hast, das Symbol zu verbreiten und dass es sich nicht um Pornographie handelt und klicke auf "Upload Image":


Danach solltest Du Dein neues Symbol auf der Settings Seite Deiner Anwendung sehen können. Scrolle bis ans Ende der Seite und klicke auf "Save":


Danach findest Du Dein neues Symbol neben allem, was mit Deiner Anwendung zu tun hat:


0 Kommentar(e)

Zum Posten von Kommentaren bitte