Récupérer des fans de page facebook

Récupérer des fans de page facebook - PHP - Programmation

Marsh Posté le 10-11-2009 à 12:58:39    

Actuellement, il n'existe aucun outil ou application pour extraire les noms des fans d'une "page" facebook.
J'ai donc décider de faire ma version en php (trop galère en C  :D )
 
J'utilise file_get_contents() avec un contexte, pour choisir les options d'entête.
 
Je veux faire croire à Facebook que je veux charger la lightbox listant les fans 100 par 100 comme si j'étais sur un navigateur classique.
Le but étant de récupérer le code html/javascript de la liste pour en extraire les noms des fans.
 
J'ai analysé avec wireshark les entêtes et cookies envoyé par mon navigateur quand il fait la requète de façon classique.
 
J'ai ensuite analysé la réponse de facebook. Les entêtes reçues sont correctes (200 OK).
Par contre je ne reçois pas du code html comme prévu, mais une bouillie de caratères pas vraiment lisible.
 
 

//Entêtes envoyées
 
Host: www.facebook.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; fr; rv:1.9.0.15) Gecko/2009101601 Firefox/3.0.15 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-SVN-Rev: 199440
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
Referer: http://www.facebook.com/home.php
Content-Length: 167
Cookie:plein de truc que je vous dis pas =D
Pragma: no-cache
Cache-Control: no-cache
 
//Body de la requête POST
 
edge_type=fan&page=1&limit=100&class=FanManager&node_id=110534460377&post_form_id=0fb5daac8db470a1c972ff2efb84eeea&fb_dtsg=pkPRc&post_form_id_source=AsyncRequest&__a=1
 
 
//Réponse de Facebook
 
’ÄVÓ¦ÈnJ”ÓòßçÜ"k±DfØ¢^>Õ`Æ™¾/«u]w9w»ªjëüñÿ~üý,«ëª>{d?hÿ߇f½fõÝÙ£³³Žò4Û,êüf›W¥F}µù«Ë¼=ºbÅ&{pvÃ-Ïý~Öl²:ÍË«Š~ˆƒÄ‰mßè‡ÿ^œmóm‘ë‡|]•Öû ?ãµ×uvâõv{óèòáåï_¿Î®Ø"›WÕ—Ù¢Z_>¼©««¼Èf7×7?çËŸ$ÇÿÁ“?mVk0Ù4sÁ?Ýä £xž}™]ÍËrVfÛˇ;×
/:¶]>Äo%Û4‰œdöùfNu¶®v›Ó¹·uƒ_¼¥<®Wú
×wiõßT÷­ä›”-×9í‡ñsÁ6[Aì>µ`e:ÏÒyQ-¾døŠè³<8c úÖ?f¿mqø§—mgÉ&_•YmákXggo¶5ÛfMÓµOàÓkö%ë^"¨§?!Žè„v„qxB¼Š¢ä{ž¯.ò-dmý«*®¤ˆË¦(þ‹¤6[¶Í³ïinŸt“×U“m·Ùl•[#õ×Â]üŽ<Û²‘%š§¬`…õºúšiwï@0¯›¯Œÿû½‹dÄsìí†x";ì0ñC!IPâyÂê
×某Ò2¥ü‰ÙŽ?ñóT…=èø±sù0HpãäS?r|£t6IÕsè@×—R%ÕÇe™Yïs¨ýQ"eøø 7•ýò|^³rA;Æš¹�ò `ë<öV8õ|×6Bíjh'Q9®´r’ „ú&_³¬°ÞT×Ý(Áîù1’é4?¦ã
!»$äЇ%ë4qϹWÈQä&IœH}
Yen a une pleine page, mais je fais court.


On dirait une image, mais je ne parviens pas à l'ouvrir.
 
Le procédé fonctionne en ruby dans ce tuto : http://adamloving.com/internet-pro [...] -page-fans
J'ai essayé ca fonctionne.
 
Voici le code de ma page php :
 
L'utilisateur copie/colle les entêtes qu'il a captées avec wireshark.
 

Code :
  1. <?php
  2. //Isolement des parties importantes
  3. $headers = strstr($_POST['post_entete'],'Host:');
  4. $contenu = strstr($_POST['post_body'],'edge_type');
  5. // Définition des champs du formulaire POST
  6. parse_str($contenu, $result);
  7. $donnees = array();
  8. foreach($result as $key=>$value)
  9. {
  10.     $donnees[$key] = $value;
  11. }
  12. // Création du contenu brut de la requête
  13. $contenu = http_build_query( $donnees );
  14. // Définition du contexte
  15. $options = array( 'http' => array( 'user_agent' => 'Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0',
  16. 'method' => 'POST',
  17. 'content' => $contenu,
  18. 'header' => $headers ) );
  19. // Création du contexte
  20. $contexte = stream_context_create( $options );
  21. echo nl2br($headers);echo '
  22. ';
  23. echo nl2br($contenu);
  24. echo '
  25. ';
  26. // Envoi du formulaire POST
  27. $retour = file_get_contents( 'http://www.facebook.com/ajax/social_graph/fetch.php', false, $contexte );
  28. echo nl2br($retour);
  29. ?>


Pouvez-vous m'aider, merci d'avance :)


Message édité par Pascal le nain le 10-11-2009 à 13:03:55
Reply

Marsh Posté le 10-11-2009 à 12:58:39   

Reply

Marsh Posté le 10-11-2009 à 15:47:12    

c'est vrai que c'est pas top on peu pas récupérer cette info la sous prétexte que le page_id dans la table  page_fan  ne soit pas indexé
 
http://www.socialmeteor.com/wp-con [...] schema.pdf

Reply

Marsh Posté le 12-11-2009 à 01:07:24    

Quelques nouvelles :
 
Ce problème est résolu. J'ai selectionné les headers important et envoyé seulement ceux-là.
Maintenant Facebook me renvoie bien le code javascript avec les noms dedans.
 
Le problème qui se pose maintenant est complexe. Tenez-vous bien.
 
Je parse les headers avec la fonction http_parse_headers() et je les récupère dans un tableau.
La fonction http_parse_headers() est disponible dans une extension PECL et la librairie s'appelle php_http.dll
Elle n'est pas présente de base dans PHP.
 
Une fois le code récupéré, je dois chercher les noms contenus. Pour cela, je fais un explode() sur la chaine, et je récupère un tableau avec les noms suivis du reste du code.


....e}},"547426212":{"id":547426212,"title":"Jean Dupond","href":"http:\/\/www.facebook.com\/jeandupond....
 
devient
 
Jean Dupond","href":"http:\/\/www.facebook.com\/jeandupond....
 


 
Il faut donc maintenant retirer ce qui se trouve après le nom.
 
Pour cela j'utilise la fonction strstr() avec un troisième parametre TRUE pour obtenir la chaine AVANT le repère.
Tout ca dans le but d'isoler

Jean Dupond


 
Le problème est que cette amélioration de la fonction strstr() (le 3ème paramètre) n'existe que depuis PHP 5.3, tandis que la librairie php_http.dll ne fonctionne pas (pas encore ?) pour PHP 5.3
 
Connaissez-vous une solution ?
Un équivalent à strstr() qui fonctionne sur PHP 5.2.x ?
un équivalent à http_parse_headers() qui fonctionne sur PHP 5.3.x ?
 
J'ai pensé tout d'abord aux expression régulière.
Mais l'exécution devient très longue, et puis je ne trouve par de fonction qui me retourne une chaine B coincée entre deux chaines A et C...
 
Une autre solution est de fabriquer sa propre fonction strstr() inversé, d'ailleurs les commentaires du site de PHP en regorgent. S'il n'y a pas d'autres solutions, je ferai ça...
 
Merci d'avoir lu, et d'avance pour votre aide  :hello:


Message édité par Pascal le nain le 12-11-2009 à 01:38:38
Reply

Marsh Posté le 12-11-2009 à 09:39:51    

pourquoi tu fais un explode, c'est du json,  tu devrais faire   json_decode

Reply

Marsh Posté le 12-11-2009 à 09:49:19    

$json = str_replace('for (;;);', '', $response);

 

$users = json_decode($json)->payload->user_info;

 

print_r($users);



Message édité par stealth35 le 12-11-2009 à 09:49:36
Reply

Marsh Posté le 12-11-2009 à 11:37:51    

Oh merci je ne connaissais pas le json =D

Reply

Marsh Posté le 12-11-2009 à 11:50:07    

héhé, tout de suite c'est plus simple. en plus ta direct en Object (tu peu mettre a 'true' le 2eme parametre pour l'avoir en tableau assoc)

Reply

Marsh Posté le 14-11-2009 à 19:13:54    

Voila, fini !  :D  
 
Peux-tu me donner ton avis ? Cela fonctionne chez toi ?
L'interface est-elle explicite ? La démarche est-elle claire ?
 
http://www.over9000project.fr/down [...] ractor.rar
 
Merci d'avance  ;)


Message édité par Pascal le nain le 14-11-2009 à 19:14:28
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed