Facebook – RSS-Feed exportieren für TYPO3

Ich bin kein Experte in der alltäglichen Benutzung von Facebook.
Deshalb muss ich vorab vor eventuellen Fehlern in der Verwendung von Begrifflichkeiten warnen.

Zur Sache:
Facebook bietet bereits seit einiger Zeit einen RSS-Feed für jede Page an.
Allerdings gibt es, zumindest was meine Recherchen ergaben, keine granulare Einstellung des RSS-Feeds durch diverse Parameter.
Um zum Beispiel die Anzahl der Feeds, den Zeitraum oder Ähnliches einstellen zu können.

In diesem Fall muss man auf die Graph-API von Facebook zurückgreifen.
Diese Erkenntnisse war für mich in einem Projekt anfänglich sehr ernüchternd, da ja bereits alles über den RSS-Feed so wunderbar funktionierte.
Bis eben zu dem Zeitpunkt an dem eine bestimmte Anzahl oder ein bestimmtes Datum erreicht bzw. überschritten wurde und ältere Einträge nicht mehr angezeigt wurden.

Die Graph-API bietet dafür allerdings die Möglichkeit sehr granular auf alle Einträge zuzugreifen.
Nach einem anfangs sehr zähen Kampf auf Grund der, wie ich finde, miserablen Dokumentation von Facebook, bin ich zu folgender Lösung gekommen:

  1. Erstellt euch irgendeine App unter developers.facebook.com. Ihr müsst lediglich Administrator der gewünschten Seite sein.
  2. Notiert euch AppId, AppSecret und die ClientId
  3. Nimmt folgende Klasse:
    class tx_sschfeedme_facebook {
    
        /**
         *
         * @var string
         */
        protected $clientId;
        /**
         *
         * @var string
         */
        protected $appId;
        /**
         *
         * @var string
         */
        protected $appSecret;
        /**
         *
         * @var string
         */
        protected $grantType;
        /**
         *
         * @var string
         */
        protected $accessToken = NULL;
        /**
         *
         * @var facebook
         */
        protected $facebookApi = NULL;
    
        /**
         * @var string
         */
        const CLIENT_CREDENTIALS = 'client_credentials';
    
        /**
         * @var string
         */
        const GRANT_ACCESS_URL = 'https://graph.facebook.com/oauth/access_token';
    
        /**
         * @var string
         */
        const FEED_URL = 'https://graph.facebook.com/%s/feed';
    
        /**
         * Initialize the facebook object
         * @param string $clientId
         * @param string $appId
         * @param string $grantType
         */
        public function __construct($clientId, $appId, $appSecret, $grantType = self::CLIENT_CREDENTIALS) {
            $this->setAppId($appId);
            $this->setAppSecret($appSecret);
            $this->setClientId($clientId);
            $this->setGrantType($grantType);
        }
    
        /**
         *
         * @return string
         */
        public function getClientId() {
            return $this->clientId;
        }
    
        /**
         *
         * @param string $clientId
         */
        public function setClientId($clientId) {
            $this->clientId = $clientId;
        }
    
        /**
         *
         * @return string
         */
        public function getAppId() {
            return $this->appId;
        }
    
        /**
         *
         * @param string $appId
         */
        public function setAppId($appId) {
            $this->appId = $appId;
        }
    
        /**
         *
         * @return string
         */
        public function getGrantType() {
            return $this->grantType;
        }
    
        /**
         *
         * @param string $grantType
         */
        public function setGrantType($grantType) {
            $this->grantType = $grantType;
        }
    
        /**
         *
         * @return string
         */
        public function getAppSecret() {
            return $this->appSecret;
        }
    
        /**
         *
         * @param string $appSecret
         */
        public function setAppSecret($appSecret) {
            $this->appSecret = $appSecret;
        }
    
        /**
         * Get the access token, we need it to have the credentials for upcoming requests.
         * @return string
         */
        public function getAccessToken() {
            if (NULL === $this->accessToken) {
                $params = array('client_id' => $this->getAppId(), 'grant_type' => $this->getGrantType(), 'client_secret' => $this->getAppSecret());
                $accessToken = $this->getResult(self::GRANT_ACCESS_URL, $params);
                $accessToken = substr($accessToken, strpos($accessToken, "=") + 1, strlen($accessToken));
                $this->accessToken = $accessToken;
            }
            return $this->accessToken;
        }
    
        /**
         * Get the feed for the application
         * @param integer $offset
         * @param integer $limit
         * @return string
         */
        public function getFeed($offset = 0, $limit = 100, $since = NULL, $until = NULL) {
            $params = array('date_format' => 'U', 'limit' => $limit, 'offset' => $offset, 'access_token' => $this->getAccessToken());
    
            if (NULL !== $since) {
                $params['since'] = $since;
            }
            if (NULL !== $until) {
                $params['until'] = $until;
            }
    
            $feedUrl = sprintf(self::FEED_URL, $this->getClientId());
            return $this->getResult($feedUrl, $params);
        }
    
        /**
         * Get the result for the request
         * @param string $url
         * @param array $params
         * @return mixed
         */
        public function getResult($url, $params = array()) {
            if (!empty($params)) {
                $url .= "?" . http_build_query($params);
            }        
            return t3lib_div::getURL($url);
    
        }
    
    }
    

    Und folgenden Aufruf (wir machen das Alles innerhalb von TYPO3):

    $facebook = t3lib_div::makeInstance('tx_sschfeedme_facebook', 'yourClientId', 'yourAppId', 'yourAppSecret');
    $feedsFromGraph = $facebook->getFeed($offset, $limit, $sinceAsUnixTimeStamp, $untilAsUnixTimeStamp);
    

    Vermutlich hätte man auch das Facebook-SDK unter https://github.com/facebook/php-sdk/ verwenden können.

    Das Ergebnis ist ein JSON-encodierter String.
    Wenn man, wie ich, daraus dann noch einen RSS-Feed basteln muss, benutzt man am Besten meine Erweiterung ssch_feed_me.
    Diese bietet eine OO-Schnittstelle zum Erstellen von RSS-Feeds in allen gängigen Formaten.

Freue mich wie immer über Anregungen, Ideen, Verbesserungen, Fragen und und.

Wenn man das Ganze nicht mit TYPO3 macht, sollte man die Methode getResult durch Folgendes ersetzen:

/**
     * Get the result for the request
     * @param string $url
     * @param array $params
     * @return mixed
     */
    public function getResult($url, $params = array()) {
        if (extension_loaded('curl')) {
            if (!empty($params)) {
                $url .= "?" . http_build_query($params);
            }
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, $url);
            curl_setopt($ch, CURLOPT_POST, false);
            curl_setopt($ch, CURLOPT_HEADER, 0);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            $result = curl_exec($ch);
            curl_close($ch);
            return $result;
        }
    }

PS: Es gibt Momente, in denen mir meine Arbeit auf Grund unnötiger Hürden und Zeitdiebstähle die Nerven raubt und die Freude nimmt.
Und dann wird es doch plötzlich wieder hell.

Veröffentlicht von

avatar

Sebastian Schreiber

Ich bin 1980 in Bergisch Gladbach geboren. Nach dem Abitur und Zivildienst habe ich 2000 an der Fachhochschule Lippe & Höxter das Studium der Medienproduktin begonnen und nach längeren Aufenthalten in Valencia und Berlin 2003 das Studium mit dem Abschluss Bachelor of Science in Medienproduktion abgeschlossen. Nach einer Festanstellung kurz nach dem Studium in einer kleinen Webagentur in Köln mit Schwerpunkt TYPO3 bin ich nun seit 2008 freiberuflicher Webentwickler.

Schreibe einen Kommentar

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