· Tech watch

Tutoriel pour découvrir Facebook Connect

Annoncé il y a un peu moins d’un an et mis en application depuis six mois, Facebook propose son nouveau concept « Facebook Connect ». Les librairies et l’API sont relativement faciles à utiliser, mais le plus dur est de se repérer dans l’amas de documentation. Cet article a pour but d’expliquer le concept, de recoller les morceaux de documentation, et combler certains manques.


Une simple recherche sur Google de facebook api donne de nombreux points d’entrées a priori intéressants :

Toutes ces pages sont plus ou moins liées, et proposent des liens vers beaucoup d’autres pages contenant des informations plus ou moins redondantes.

On trouve de nombreux exemples html + javascript, mais peu d’exemples coté serveur (php, …), il est souvent nécessaire d’aller à la pêche dans les forums pour trouver des infos supplémentaires, ou le cas échéant, à faire de la rétro-ingénierie sur les bibliothèques fournies.

Bref, un beau petit merdier !

Les bases de Facebook Connect

Facebook propose deux types d’applications : celles qui sont intégrées sur le site de Facebook (« applications Facebook »), et les applications externes qui peuvent se connecter au site de Facebook pour récupérer et/ou envoyer des informations. C’est sur ce dernier type d’application que cet article se penche, c’est le concept Facebook Connect :

Principe

Les intérêts sont multiples :

  • Récupérer des informations sur l’internaute (profil, amis, photos, évènements, …). Cela permet par exemple à l’internaute de ne pas avoir à recréer son carnet d’adresses ou sa galerie photos. Cela permet également pour l’application de récupérer des contacts supplémentaires et cibler son marketing par exemple.
  • Exporter des données vers Facebook (photos, évènements, …). Par exemple, dans le cadre d’une application gérant des critiques de livres, il est possible de publier sur le flux de Facebook un message lors de chaque nouvelle critique. Cela augmente d’une part la visibilité de l’application tierce sur Facebook, et d’autre part la visibilité de l’internaute dans la communauté.
  • Amener facilement dans l’application externe la notion de communauté, grace à la fonction de « friend linking ».
  • Ne gérer qu’une seule authentification (celle de Facebook)
  • Associée à une application Facebook interne, l’application externe peut augmenter de manière importante sa visibilité.

Pour développer un site se connectant à Facebook, le principe est le suivant :

  • Déclarer l’application dans Facebook afin d’une part d’obtenir une clé d’API, et d’autre part afin d’indiquer à Facebook quelques règles sur le comportement (domaines acceptés, redirection suite à une déconnexion, etc…).
  • Mettre sur le serveur hébergeant l’application un fichier spécial, xd_receiver.htm, fourni par Facebook, permettant les échanges entre l’application et Facebook.
  • Développer l’application, en utilisant les balises Facebook (FBML), les libairies javascript, et les autres librairies disponibles (PHP, …)

Déclarer notre application à Facebook

Facebook fournit un tableau de bord pour gérer ses applications, qu’elles soient internes ou externes. Ce tableau de bord est accessible à l’url http://www.facebook.com/developers (il s’agit en fait d’une application Facebook, qu’il faut donc ajouter à son profil).

Même si l’on ne souhaite que créer une application externe, il faut néanmoins créer une application Facebook, qui sera « vide ». Cliquer sur « Créer une application » :

Les autres paramètres de l’onglet « Général » sont optionnels, et parlent d’eux-même.

Ensuite, aller sur l’onglet « Connexion », qui est dédié précisément aux applications externes Facebook Connect :

Les autres champs ne sont pas obligatoires.

La fonction « Friend Linking » n’est pas utilisée dans cet exemple, mais est décrite un peu plus bas.

La section « Template Bundles » n’est pas utilisée non plus dans cet exemple, elle permet de définir des templates pour diffuser des informations sur le profil Facebook de l’internaute.

Fichier d’échange

Il s’agit d’un simple fichier à créer, xd_receiver.htm,sur le serveur. Le contenu de ce fichier est défini sur le wiki Facebook. Il peut être aussi bien positionné à la racine que dans un sous-répertoire. Il s’agit d’un paramètre de configuration des bibliothèques que l’on verra plus tard.

Developper l’application

Utilisation de la librairie JavaScript

Structure typique d’une page utilisant la librairie JavaScript :

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
<head> ... </head>
<body>

 ...
 <fb:login-button></fb:login-button>
 ...

 <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>

 <script type="text/javascript">
 FB.init(xxxxxxx, '/xd_receiver.htm') ;
 ...
 </script>

</body>
</html><script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script><script type="text/javascript">// < ![CDATA[
FB.init(xxxxxxx, '/xd_receiver.htm');     ...
// ]]></script>

Les points notables :

  • Si l’on souhaite utiliser des balises Facebook (<fb:xxx>), il faut ajouter dans la balise <html> le namespace xmlns:fb= »http://www.facebook.com/2008/fbml« 
  • Ajouter dans le la librairie JS : <script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>. Ne doit pas être placée dans le <header> car génère du code.
  • Les balises Facebook peuvent être ajoutées après la librairie, et avant le FB.init. C’est l’appel à FB.init() qui va (entre autres) déclencher le rendu de ces balises.
  • Avant de pouvoir appeler l’API, il faut d’abord initialiser l’application avecFB.init(api_key, channel_path). Le paramètre api_key est la clé d’API que l’on a obtenu lors de la création de l’application. Le channel_path est le chemin du fichier xd_receiver.htm, (en relatif ou en absolu).

Le wiki est plutôt bien documenté sur l’utilisation de la librairie javascript, et regorge d’exemples, la suite de l’article se focalise donc plus sur l’utilisation de la partie PHP. Quelques exemples pour utiliser la librairie javascript :

Utilisation de la librairie PHP

Cela devient un peu plus freestyle, car mal documenté.

Facebook propose une API RESTful dont la documentation succincte est disponible ici :http://wiki.developers.facebook.com….

Pour bien comprendre son utilisation (URL, paramètres, enchainement des appels, …), pas d’autre solution que d’analyser le code d’une librairie cliente officielle telle que la librairie PHP. Et si on a la chance de développer un site dans un langage bénéficiant d’une telle librairie, autant l’utiliser directement !

Donc commencer par télécharger la librairie PHP, et la dézipper. Les librairies utiles sont dans le répertoire facebook-platform/php. Il y a deux fichiers interessants :

  • facebook.php : contient la classe principale Facebook. Il s’agit du point d’entrée, cette classe se charge d’initialiser la connexion, et d’instancier un client REST (cf. ci-dessous).
  • facebookapi_php5_restlib.php : contient la classe FacebookRestClient fournissant toutes les méthodes nécessaires pour aller appeler l’API REST de Facebook. Par exemple, l’API propose une fonction « facebook.friends.get » pour obtenir la liste des amis d’une personne. La classe FacebookRestClient fournit une méthode friends_get() qui appelle l’API en formatant correctement les paramètres, et qui désérialise/analyse la réponse pour fournir les valeurs de retour.

Exemple d’utilisation :

<?php
// Librairie PHP officielle
require_once('facebook-platform/php/facebook.php') ;
// Initialisation
// Le SECRET_CODE est obtenu lors de la création de l'application
$facebook = new Facebook(API_KEY, SECRET_CODE) ;
// si l'internaute est authentifié, retourne son identifiant
// sinon, redirige vers une page d'authentification facebook, puis retourne sur cette page
$user_id = $facebook->require_login() ;
// pour recuperer a tout moment l'identifiant de l'internaute :
// $user_id = $facebook->user ;
// pour appeler l'API Facebook :
// $facebook->api_client->... (se référer au code source facebookapi_php5_restlib.php)

L’exemple ci-dessus détecte si l’internaute est authentifié, et le cas échéant, le redirige vers Facebook pour s’authentifier. Néanmoins, on souhaite fréquemment détecter si l’internaute est authentifié, sans pour autant le rediriger de force vers Facebook le cas échéant. Pour cela, il suffit simplement de tester la valeur $facebook->user :

<?php
// Librairie PHP officielle
require_once('facebook-platform/php/facebook.php') ;
// Initialisation
$facebook = new Facebook("api_key", "secret_code") ;
// Authentifié ?
if ($facebook->user == NULL) {
 // non authentifié
} else {
 // authentifié
}

Exemple de code affichant la liste des amis :

<?php
// Librairie PHP officielle
require_once('facebook-platform/php/facebook.php') ;
// Initialisation
$facebook = new Facebook("api_key", "secret_code") ;
// si l'internaute est authentifié, retourne son identifiant
// sinon, redirige vers une page d'authentification facebook, puis retourne sur cette page
$user_id = $facebook->require_login() ;
// recupere les identifiants des amis
$friends_uid = $facebook->api_client->friends_get() ;
// recupere les infos utiles des amis
$friends_data = $facebook->api_client->users_getInfo($friends_uid, array('uid', 'first_name', 'last_name')) ;
var_dump($friends_data) ;

Note 1 : dans certains cas, l’appel à $facebook->api_client->friends_get() (ou l’appel à d’autres méthodes) peut provoquer une erreur. C’est un effet de bord qui peut arriver lorsque l’internaute n’est pas « tout à fait » déconnecté, lorsque ses cookies ne sont nettoyés qu’à moitié. Il est donc recommandé de fiabiliser les appels à ces méthodes en ajoutant un try/catch.

Note 2 : la liste des informations que l’on peut obtenir sur les utilisateurs est décrite ici. Une restriction importante : il n’est pas possible d’obtenir l’adresse email ! Le seul contournement qu’offre l’API Facebook est un mécanisme pour envoyer des emails aux utilisateurs souhaités.

Note 3 : la fonction $facebook->require_login redirige l’utilisateur vers Facebook, le risque est donc de ’perdre’ l’internaute. Pour l’authentification, je préfère utiliser la version JavaScript (<fb:login-button>) qui ne fait qu’ajouter une fenetre popup pour s’authentifier.

Liens utiles :

Alléger le serveur en mixant PHP, JavaScript et FBML

Tout développement côté serveur peut engendrer une charge importante, parfois le serveur a peu d’intérêt à connaître certaines informations. D’où l’intérêt d’utiliser les balises Facebook (FBML) et les librairies javascript. Et inversement, trop utiliser les librairies JS plombent les performances côté internaute, et nuisent à l’accessibilité. Tout l’art est donc de trouver le juste milieu.

Par exemple, pour afficher la liste des amis et leur photo, le serveur peut se charger de récupérer les identifiants, et le navigateur de l’internaute se charger de récupérer les photos :

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml">
<head></head>
<body>
<?php
// Librairie PHP officielle
require_once('facebook-platform/php/facebook.php') ;
// Initialisation
$facebook = new Facebook("api_key", "secret_code") ;
// recupere les identifiants des amis
$user_id = $facebook->require_login() ;
$friends_uid = $facebook->api_client->friends_get() ; ?>
< !-- affiche les photos des amis -->
<?php foreach($friends_uid as $uid) : ?>
 <fb:profile-pic uid="<?php echo $uid ; ?>" linked="true"></fb:profile-pic>
<?php endforeach ; ?>
< !-- necessaire pour le rendu FBML -->
<script src="http://static.ak.connect.facebook.com/js/api_lib/v0.4/FeatureLoader.js.php" type="text/javascript"></script>
<script type="text/javascript">
 FB.init("api_key", 'xd_receiver.htm') ;
</script>
</body>
</html>

Note : dans le cas d’une application Facebook Connect, il faut utiliser la forme « <fb:xxx></fb:xxx> » à la place de « <fb:xxx />« .

Liens utiles :

Quelques notions supplémentaires

Développement local

En phase de développement, il est nettement plus productif de développer en local sur son poste, puis ensuite, une fois l’application validée, d’exporter le code source vers le serveur définitif. Il est tout à fait possible de développer des applications Facebook Connect en local, en suivant ces consignes :

L’URL que l’on a fourni lors de la création de l’application Facebook doit exister, et doit être accessible par Facebook (même s’il n’y a rien).

Le fichier xd_receiver.htm doit être sur le serveur définitif, car Facebook essaiera de le charger.

L’URL utilisée pour le développement local doit être sur le même domaine que celui déclaré lors de la création de l’application. En clair : si le domaine déclaré est ‘site.fr’, alors ajouter dans le fichier hosts local l’entrée :
127.0.0.1 local.site.fr

Et créer dans le serveur web un hôte virtuel basé sur le nom de domaine local.site.fr.

Friend linking

Comme on l’a vu dans l’exemple un peu plus haut, il est facile d’obtenir la liste des amis d’un internautes. Cependant, comment savoir si parmi cette liste, certains ont un compte sur notre application ? On peut éventuellement se baser sur le prénom et le nom, mais ce n’est pas une méthode sûre en raison des risques d’homonymie et de la manière dont les utilisateurs ont saisi leur profil (par exemple ‘Frederic’ sur le profil Facebook, et ‘Fred’ sur notre application).

La fonction « friend linking » (activée lors de la création de l’application) permet précisément de faire ce lien, afin de recréer les communautés au sein de notre application.

Librairies clientes

Liste des librairies clientes (PHP, ActionScript, …)

Facebook Query Language

Facebook propose un language de requêtage pour rechercher des utilisateurs, photos, évènements, … Il s’agit
du Facebook Query Language (FQL).

Ces requêtes peuvent être par exemple appelées via JavaScript avec FB.ApiClient.Fql_query($query) ou PHP avec la fonction $facebook->api_client->fql_query($query).

Exemples de sites utilisant Facebook Connect

Ce n’est que depuis très peu de temps que l’on commence à trouver des sites de grande audience exploitant Facebook Connect. On peut par exemple citer :

  • L’Equipe qui a mis son nouveau site en ligne le 19 mai et proposant une barre Facebook pour chatter avec les autres internautes.
  • Digg qui publie dans le fil des actualités Facebook les nouvelles pages bookmarquées par l’internaute
  • Joost, Vimeo, et CBS utilisent Facebook Connect pour le partage des vidéos.

13 commentaires

  1. Merci pour cet excellent article, qui en plus de permettre d’y voir plus clair sur les fonctionnalités de Facebook, permet de savoir vers où se diriger pour entrer dans le détail.

  2. benjamin935

    Et le blog de Clever age, quand est ce qu’il va intéger facebook connect ?

  3. Bonjour, y a-t-il une fonction ou une balise permettant de savoir si nos amis sont en ligne ou non ? (Comme pour le chat intègré de facebook).
    Merci.

  4. Merci pour ce tutoriel parce que j’avais du mal avec l’API facebook. Maintenant ça va un peu mieux.

  5. laurentg2008

    Merci et bravo pour ce tutoriel
    tous les livres us traitent de l’api php et j’avais du mal avec l’api JavaScript!

  6. Bonjour
    merci pour le tutoriel, il est bien clair, mais j’ai un problème.
    je n’arrive pas à récupéré les identifiants des amis où les infos de user, il me retourne un array vide, que je puisse faire?
    merci.

  7. Bonjour,
    J’ai voulu utiliser votre tutoriel mais je butte sur une erreur retournée par FaceBook au moment d’utiliser la fonction friends_get()

    –> Fatal error: Call to a member function friends_get() on a non-object in /homepages/4/d168444385/htdocs/facebook/index.php on line 51

    Cette fonction est-elle encore utilisée ?

    Merci de votre aide.

  8. Bonjour,

    Je cherche depuis un moment sur le net comment permettre a un utilisateur (de mon site) de se connecter (c’est fait) ensuite de pouvoir choisir une photo dans ses albums et ensuite uploader la photo (c’est la que je bloque).
    Merci d’avance pour ton aide.

  9. je voudrais savoir ou je pourrais télécharger la librairie facebookapi_php5_restlib.php

    Merci de votre réponse !

  10. pareil que le message précédant ! par quoi faut il remplacer api_client ??? merci !

  11. Bonjour, j’aimerais utiliser facebook connect sur mon site, mais je voudrais aussi que les utilisateur n’ayant pas de compte facebook puisse laisser un commentaire sans s’inscrire sur facebook auparavant. Quelqu’un connait une solution ?

    Cordialement,

    Francois

  12. très bon article.

    Je me lance pour transformer http://www.magdales.com en application facebook friendly, mais je trouvais la doc trop abscont pour y parvenir.
    Bref, merci pour ce tutorial qui permet de synthétiser l’ensemble des connaissances à savoir !

    kéké

  13. Merci pour ce tutoriel :)

    Pour le compléter voici un tutoriel dont je me suis servie pour le mettre sur mon forum.

    Si d’autre personnes sont chez Forumactif et en on besoin je vous le fourni :)

    http://forum.forumactif.com/t280609-facebook-connect

    Bonne journée à vous tous :)

Les commentaires sont désormais fermés.