En cours de modification, Facebook a changé la méthode de passage du token.

Dernièrement, enfin ca fait un peu de temps maintenant, Facebook à mis en place sa nouvelle API : Graph. Donc aujourd'hui vous avez deux possibilités pour créer une application Facebook en Flash :

  • avec l'ancien SDK, et donc là vous pouvez continuer à utiliser l'API AS3 Facebook crée par Adobe.
  • avec Graph, d'où le titre de ce billet.

Facebook graph api

J'utilise la méthode de rendu "Iframe".

La première chose à faire est de tester si l'utilisateur qui visite l'application l'a déjà installée ou non. Pour cela, on utilise un bout de code FBML :






Donc là, facebook fait tout pour vous. En gros, si l'utilisateur n'a pas déjà installé l'application, facebook le redirige vers une page où il doit accepter l'application avec différentes permissions supplémentaires (le paramètre scope). Pour la liste des permissions, je vous laisse parcourir la doc.

Je ne conseille pas d'ajouter toutes les permissions nécessaires à votre application sur ce premier écran. Vous pourrez demander plus tard des autorisations supplémentaires. Vous risquez de le faire fuire dans le cas contraire (on y reviendra après)...

Une fois cliquer sur "autoriser", facebook redirige vers votre superbe application.

Grâce aux balises FBML, on ajoute le shockwave dans la page :


Facebook utilise dorénavant le protocole OAuth 2.0, comme Youtube par exemple, pour l'authentification. Si l'utilisateur a bien autorisé l'application (en fait il n'a pas le choix), le flash reçoit alors une FlashVar nommée "session" encodée en JSON. Cet objet contient un "access token" qui va vous permettre d'interroger Facebook via Graph afin de récupérer les données "publiques" de l'utisateur (sinon, il faut demander l'autorisation). Le token est valable 24h.

var o:Object = JSON.decode(loaderInfo.parameters.session);
_token = o.access_token;

Facebook retourne les résultats au format JSON. J'utilise l'as3CoreLib pour le décoder.
On implémente une petite méthode raccourcie qu'on utilisera tout le temps où on passe ce fameux token en paramètre dans l'url :

private function _callGraph(method:String):URLLoader
{
	var urlLoader:URLLoader = new URLLoader();
	urlLoader.load(new URLRequest("https://graph.facebook.com/" + method + "?access_token=" + _token));
	return urlLoader;
}

Puis dès lors qu'on souhaite, par exemple récupérer les données de l'utilisateur "loggué", on utilise la methode "me" (me étant l'utilisateur actuel :

var urlLoader:URLLoader = _callGraph("me");
urlLoader.addEventListener(Event.COMPLETE, _getFriendsComplete);

_callGraph("/me/friends"); // les amis de l'utilisateur actuel
_callgraph("gwenn.guihal"); // mes infos (gwenn.guihal ou 567172079)
_callgraph("gwenn.guihal/friends"); // mes amis

Voici la liste des actions possibles : http://developers.facebook.com/docs/api

L'utilisateur peut restreindre l'accès à son profil, et par exemple empêcher de lister les "likes". Si on en a besoin, on lui demande d'autoriser. Pour cela, on utilise Javascript :
En plus de l'objet session, Facebook nous donne un identifiant LocalConnection.

_fb_local_connection = _loaderInfo.parameters.fb_local_connection;

Grâce à ce dernier, on va pouvoir appeller du JS sur la page Facebook (nos fonctions JS et celles de Facebook). Voici une méthode raccourci :

private function _callJS(method : String,arg:Array = null) : void
{
	if (!_localConnection) // private variable
	{
		_localConnection = new LocalConnection();
	}
	
	_localConnection.send(_fb_local_connection, "callFBJS", method, arg);
}

Donc pour afficher une popup de demande de permissions :

_callJS("Facebook.showPermissionDialog", ['likes,email,publish_stream,...']);

La liste des permissions

Après, tout se trouve dans la doc http://developers.facebook.com/docs/ ou sur Internet.

Encore un truc pas mal, si vous ne l'avez pas déjà deviné : une fois que vous avez un token valide, vous pouvez interroger facebook pendant 24h, via par exemple le navigateur :

https://graph.facebook.com/gwenn.guihal?access_token=_TOKEN_

Et enfin, si vous compilez en Flash 9 et si vous avez des erreurs de flux, compilez en Flash 10.