Php - Exporter les fans d'une page facebook dans un .csv

ARCHIVE

J’ai eu besoin d’exporter une liste de fans d’une page facebook (dont j’étais administrateur). Je n’ai pas trouvé d’application ni de script me permettant de le faire simplement. Sur google, j’ai trouvé un script python, qui, cependant, ne fonctionnait pas :(
Je suis donc parti de deux sources trouvées sur le net :

http://www.paulds.fr/2010/04/retrouver-le-createur-dune-fanpage-sur-facebook http://ctolsen.posterous.com/python-script-export-a-list-of-facebook-fans

Les 2 scripts avaient un point commun : ils utilisaient le cookie que facebook enregistre sur votre poste. A partir de là… Je vous laisse découvrir la suite ;-)

La base

Nous allons utiliser curl, pour envoyer/récupèrer les informations à/de Facebook.
Nous allons avoir besoin de 2 éléments : votre cookie, et l’id de votre page. Pour retrouver l’id de votre page, rien de plus simple : regarder la source de votre page et cherchez l’adresse du flux rss. Elle se termine par un numéro, c’est l’id de votre page.
Pour le cookie, vous pouvez fouiller dans les préférences de votre navigateur. Vous trouverez plusieurs valeurs, concaténez-les, afin d’obtenir quelque chose du genre :

datr=xxxxxxxx; lu=xxxxx; locale=fr_FR; cur_max_lag=xx; x-referer=xxxxxxxx; c_user=xxxxxx; sct=xxxxx; sid=xx; xs=xxxxxx; presence=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;

(ou utilisez l’extension firefox “tamper data” qui vous permettra de retrouver cette chaîne prête à l’emploi :) )

Notez bien cette chaîne, nous la mettrons dans une variable, dans le script php.
Nous aurons également besoin de 2 valeurs, correspondant à des champs “hidden” dan s le code source de votre fanpage. Il s’agit de post_form_id et de fb_dtsg . Un simple affichage de la source de la page et un ctrl-f (rechercher) vous permettra de trouver ces valeurs.

Le script

// Le script est lent. Donc, pour éviter les mauvaises surprises, on laisse le script tourner autant que nécessaire.  
set_time_limit(0);  

// L'id de votre page, que vous avez récupéré comme expliqué ci-dessus.  
$pid = 'id_de_votre_page';  

// La valeur de votre cookie :  
$cookie='datr=xxxxxxxx; lu=xxxxx; locale=fr_FR; cur_max_lag=xx; x-referer=xxxxxxxx; c_user=xxxxxx; sct=xxxxx; sid=xx; xs=xxxxxx; presence=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx;';  

// Les valeurs des champs hidden mentionnés ci-dessus :  
$form_id = 'xxxxxxxxxxxx';  
$dtsg = 'xxxxxx';  

// On va parcourir toutes les pages de la liste des fans. J'ai mis "100", c'est totalement arbitraire. Mettez + ou -, l'idée est de parcourir toutes les pages.  
while($p<=100) {
    $url = 'http://www.facebook.com/ajax/social_graph/fetch.php?__a=1';  
    $dstr = 'edge_type=fan&page='.$p.'&limit=5000&p=&node_id='.$pid.'&class=FanManager&post_form_id='.$form_id.'&fb_dtsg='.$dtsg.'&lsd&post_form_id_source=AsyncRequest';   
    // on transforme notre chaine en tableau, prêt à être envoyé en POST  
    $dstr = explode('&', $dstr);  
    
    foreach($dstr as $d) {  
        $d=explode('=', $d);  
        $datas[$d[0]]=$d[1];  
    }  

    // On prépare notre requête curl  
    $ch = curl_init();  
    curl_setopt($ch, CURLOPT_URL, $url);  
    curl_setopt($ch, CURLOPT_POST, 1);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $datas);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);  
    curl_setopt($ch, CURLOPT_COOKIE, $cookie);  
    curl_setopt($ch, CURLOPT_USERAGENT ,'Mozilla/5.0 (Windows; U; Windows NT 5.1; pl; rv:1.9) Gecko/2008052906 Firefox/3.0');  
    $json = curl_exec($ch);  

    // Nous disposons à présent d'une string qui est PRESQUE du json.  
    $json = eregi_replace("for \(;;\);", '', $json);  

    // A présent, notre chaine est du json exploitable.  
    // Si ce n'est pas le cas, c'est surement que la page renvoyée par fb est vide, et que donc nous avons atteint la dernière page.  
    $obj = json_decode($json)or die();  

    // Nous préparons la chaine qui sera enregistrée dans le fichier csv de destination 
    $fichier_csv = '';

    // On parcourir l'objet json, à la recherche de nos précieux utilisateurs.  
    foreach($obj->payload->user_info as $user) {  
        // pour éviter les doublons, on incrémente un tableau, et on vérifie à chaque fois si l'on a pas déjà rencontré cet user_id.  
       if (!$setted[$user->id]) {
            $setted[$user->id]=1;  
            // On affiche notre ligne csv    
            echo utf8_decode($user->title).';'.$user->href."\n";  
            // on incrémente la variable csv  
            $fichier_csv .= utf8_decode($user->title).';'.$user->href."\n";  
        }
    }

    // On ajoute notre csv au fichier csv
    $fans = file_get_contents('fans.csv');  
    $fp = fopen('fans.csv', 'w+');  
    fputs($fp, $fans.$fichier_csv);  
    fclose($fp);  
    // et on passe à la page suivante.  
    $p++;  
}

Au final, on se retrouve avec un joli csv, même si la boucle qui tourne 100 fois  n’est pas d’une propreté exemplaire: elle a le mérite d’être fonctionnelle, surtout. :)

Une question? Une remarque? Un avis? Twittons-en!

When you click on links to various merchants on this site and make a purchase, this can result in this site earning a commission.
Affiliate programs and affiliations include, but are not limited to, the eBay Partner Network and Amazon.