Récupération de contenu des pages et groupes Facebook avec l’API Graph et Curl

Mise en Situation :

J’étais en train de travailler sur quelques sites clients et quelques un de mes propres sites et je me suis dit qu’il fallait que je trouve du contenu pour enrichir mes pages. Quelque chose qui change dans le temps pour apporter un peu de fraîcheur à mes pages. Ma réflexion habituelle m’oriente vers l’utilisation des flux Twitter. J’ai d’ailleurs déjà rédigé un petit tuto pour appeler une API avec cURL. Ceci dit, je devais trouver autre chose. Puis j’ai pensé aux groupes et aux pages Facebook. Il y en a de toute sorte et dans tous les domaines. Bingo, j’allais scraper Facebook.

Explications :

L’API de l’Open Graph de Facebook permet de tout faire sur Facebook mais il faut comprendre la façon dont cela fonctionne. Il y a également un Facebook SDK Server-side mais nous ne l’utiliserons pas. Les requêtes dont nous avons besoin sont relativement simples.

Comme Facebook ne fait rien simplement (non, en fait c’est pour des raisons de sécurité), afin de pouvoir interroger le Graph, vous devez passer par une application qui a les droits pour le faire. Je n’entre pas dans les détails mais il y a une trentaine d’autorisations diverses.

L’application Facebook va avoir besoin d’un ticket (ou jeton, token en anglais). C’est comme au cinéma, pour accéder à la salle, il faut un ticket. Mais le ticket n’est valable que 2 heures sur Facebook. Il faudra donc générer un token plus long. Facebook a tout prévu, vous pouvez générer un token ayant une durée de vie de 60 jours. Je précise au passage que vous ne pouvez plus générer de token valable à vie comme c’était le cas avant.

Voici une illustration pour visualiser les aller-retours entre votre site et Facebook dans le cas ou vous avez intégré un bouton qui vous permet de vous connecter à Facebook :

facebook login php app

Je ne comprends toujours rien !

Entrons dans le vif du sujet. Pour commencer vous devez créer une application qui vous donnera les droits d’accéder aux pages et groupes. Rendez vous dans un premier temps sur le Facebook Developer pour créer votre application :

creer application facebook

Vous devez lier votre application à un domaine. Ce domaine vous servira à certifier que vous êtes bien le proprio de l’application mais aussi parce que l’application a besoin d’une callback url pour envoyer un certain code dont nous aurons besoin plus tard. Voici ce que j’ai :

config app fb

Dans Paramètres > Autorisations, vous devez avoir ceci :

 

app autorisation

La prochaine étape consister à cibler un groupe dans votre thématique. Vous devez avoir un lien avec ce groupe pour pouvoir en récupérer le contenu si le groupe est « fermé ». En mode ouvert, vous pouvez scraper son contenu sans l’intégrer. Je vais faire mon test sur un groupe en immobilier dont je vais devoir récupérer l’id (ou le nom) dans l’url :

application id

Sur le site que vous avez défini dans les paramètres de l’application un peu plus tôt, créer un dossier et placez y ces deux fichiers :

  • token.txt (vide) : il permettra de stocker le token valable pendant 60 jours. Vous pouvez adapter le code pour le stocker en base de donnée par exemple
  • un fichier fb.php : le nom du fichier n’a pas d’importance mais il faudra adapter le callback_url présent dans le fichier :
<?php
// [params]
    $app_id = "43144xxxxxxxxx"; // id de l'application
    $app_secret = "32ee2bf01xxxxxxx"; // code secret de l'application
    $group_id = "276042532504145"; // id ou nom du groupe à scraper (cf url du groupe) ou d'une page
    $callback_url = "http://www.calliweb.com/res/apifb/fb.php"; // url de retour
// [/params]

// [fonctions]
    function getToken()
    {
        $content = file('token.txt');
        return $content[0];
    }

    function curl_get_file_contents($url)
    {
        $ch = curl_init($url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Host: graph.facebook.com'));
        $json = curl_exec($ch);
        curl_close($ch);
        return $json;
    }

    function getError()
    {
        $json = json_decode(curl_get_file_contents('https://graph.facebook.com/' . $app_id . '/feed?access_token=' . getToken()));
        if ($json->error) {
            if ($json->error->type == "OAuthException") {
                return false;
            } else {
                return true;
            }
        }
    }

// [/fonctions]

// [token] permet de récupérer le token valable 60 jours
    $tmp_token = getToken();
    if ((empty($tmp_token) && !preg_match('/code=/', $_SERVER['REQUEST_URI'])) || (!getError($app_id))) {
        $code = 'https://www.facebook.com/dialog/oauth?client_id=' .
            $app_id . "&redirect_uri=" . urlencode($callback_url) .
            '&scope=user_groups&state=lijecreative';
        echo("<script> top.location.href='" . $code . "'</script>");
    }

    if ((empty($tmp_token) && preg_match('/code=/', $_SERVER['REQUEST_URI'])) || (!getError($app_id))) {
        $token_url = 'https://graph.facebook.com/oauth/access_token?client_id=' .
            $app_id . "&redirect_uri=" . urlencode($callback_url) .
            '&client_secret=' . $app_secret . '&code=' . $_REQUEST["code"];

        $data = curl_get_file_contents($token_url);
        parse_str($data, $params);
        $token_60j = $params['access_token'];
        $fp = fopen('token.txt', 'w');
        fwrite($fp, $token_60j);
        fclose($fp);
    }
// [/token]

// [scrap]
    $json = json_decode(curl_get_file_contents('https://graph.facebook.com/' . $group_id . '/feed?access_token=' . getToken() . '&limit=5&since=' . date('now')));

    foreach ($json->data as $item) {
        if ($item->message != "") {
            $days = abs(floor((strtotime(date('Y-m-dTH:i:s+0000')) - strtotime($item->created_time)) / (60 * 60 * 24)));
            //echo "<a href='http://www.facebook.com/".$item->from->id."' rel='nofollow' target='_blank'>".utf8_decode($item->from->name)."</a> : ";
            echo "@ " . utf8_decode($item->from->name) . " : ";
            echo htmlentities(utf8_decode(substr($item->message, 0, 100))) . "... <small>(<a href='" . $item->actions[0]->link . "' target='_blank'>il y a " . $days . " jour(s)</a>)</small><br />";
        }
    }
// [/scrap]
?>

Si vous avez des problèmes pour recopier ce code, vous pouvez télécharger les fichiers ici.

Résultat :

scrap groupe facebook

Je récupère les 5 premiers résultats (cf ligne 64 du script ‘&limit’) et je n’affiche que les résultats textuels (pas d’image, pas de vidéo, etc.). Je n’affiche aussi que les 100 premiers caractères histoire de ne pas avoir un pavé et je met un lien vers le message.

Comment le script fonctionne ?

Le script va utiliser le token contenu dans le fichier token.txt. Si le token n’est pas présent, le script va le générer. La première fois, il faudra autoriser l’application. Puis Facebook vous redirigera sur votre site. Le script va alors générer automatiquement le token de 60 jours et le stocker dans le fichier txt. Le scrap démarre juste après ça.

Améliorations possibles

J’ai également placé un code au cas ou le token est expiré. Dans mon cas, la fonction getError() retourne false mais vous pouvez y intégrer un code simple pour que le site vous envoi un mail histoire de vous prévenir.

Le script gère déjà le cas ou le token est expiré mais il fait une redirection vers Facebook pour demander un nouveau ticket. Je recommande de créer 2 fichiers : un qui fait les appels vers le Graph de Facebook et qui génère les tokens et un qui affiche les contenus de façon à ne pas perturber le visiteur.

Voilà c’est dit. Au fait, vous utilisez quoi comme autre source de contenu frais ?
Faites m’en part dans les commentaires ;)

AngularJS : scraper les Google Trends
Top 10 des problèmes rencontrés avec Magento

12 Comments on “Récupération de contenu des pages et groupes Facebook avec l’API Graph et Curl”

  1. A noter qu’on peut faire la même chose avec les pages de profil Facebook.
    Avec l’ID de la page, sous la forme http://graph.facebook.com/, on peut récupérer toutes les informations d’un compte Facebook qui sont publiques (et ça fait peur, il y en a beaucoup).

  2. Hello,
    L’idée est excellente, j’avoue que je n’y airait pas du tout pensé, je vais faire un essai pour un de mes sites, j’espère que je vais pas trop galérer avec la partie application…

  3. Article assez technique, mais qui reste quand même intéressant!
    J’avoue que je besoin de relire pour comprendre certains points!

  4. Effectivement l’api de Facebook permet de récupérer le contenu d’une page Fan par exemple, mais également les statistiques d’interactions associées (nombre de Like, Comments, Share) … ce qui peut vous permettre de trier et mesurer les performances de la page, de son community management

    1. J’ai besoin de récupérer les statistiques d’interactions associées (nombre de Like, Comments, Share, vu..) d’un poste sur une page fan Facebook. pouvez-vous m’aider SVP? Merci d’avance.

    1. L’article est assez vieux. Je doute que ça fonctionne toujours mais votre retour m’intéresse. Bons tests !

  5. Bonjour,

    Article très intéressant,

    Est ce qu’on peut récupérer les stats (impression/vue, j’aime, partage, commentaire) d’un post d’un profil utilisateur facebook (autre que page et groupe Facebook) svp?

    Merci par avance,

    Antoine.

  6. Bonjour,

    au top cl’article est clair et trés bien expliqué merci ,
    comment faire pour récupérer du contenu vidéo texte et lien de plusieurs postes ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *