Une application Facebook avec PHP

PHP Ajouter un commentaire

Facebook est devenu une des grandes plateformes du web, sans être forcément incontournable - à moins d’être un inconditionnel des réseaux sociaux. Cependant, elle peut être intéressante dans le cadre d’une opération de communication pour un client.
Amateurs de morsures de vampires et de bières virtuelles, voici une petite mise en bouche technique sur l’univers de Facebook, au travers d’un exemple d’application.

La première opération est de créer votre application chez Facebook, qui vous donnera alors une clé autorisant le requêtage de la plateforme. Lors de la création de cet espace, vous renseignerez une URL http://apps.facebook.com/monappli/, et FB s’occupe d’appeler les pages sur votre vrai site (par exemple http://www.monsite.com/monappli/). C’est une notion importante : les applications sont hébergées à l’extérieur de Facebook. Afin d’éviter des noeuds au cerveau, je vous recommande chaudement de créer une page index.php et référencée dans votre DirectoryIndex Apache.

Ensuite, un site dédié aux développeurs contient des API PHP4 et PHP5, une documentation et un Wiki. Il y a donc un set de quelques fichiers à récupérer et à installer avec votre futur code.
Facebook repose sur quelques notions clés : les données et les traitements avec la plateforme reposent sur REST (par exemple la récupération de la liste d’amis), et l’affichage mélange HTML/CSS classique et des éléments XML spécifiques sous le nom de FBML.
Lors de l’appel de votre page, le mélange HTML/FBML est récupéré par la plateforme Facebook, interprété et rendu à l’internaute dans son espace.

Les tags FBML sont nombreux, et répondent aux besoins les plus courants : liste d’amis, photos utilisateur, messages d’information, popup de confirmation… se référer au Wiki pour la liste exhaustive.

Mon application est dans l’esprit Facebook, à savoir totalement dénuée d’intérêt sauf à avoir une vocation de tuto. Son principe consiste à envoyer des boulettes en papier virtuelles et à conserver les scores.

Le premier bout de code est du PHP et consiste à initialiser proprement l’applicatif :

include_once('facebook.php');
 
define('FB_API_KEY', 'abcdef0123456789abcd');
define('FB_SECRET_KEY', 'abcdef0123456789abcd');
define('MYSQL_HOST', 'monhost');
define('MYSQL_USER', 'monlogin');
define('MYSQL_PASS', 'monpass');
define('MYSQL_DB', 'mabase');
 
$facebook = new Facebook(FB_API_KEY, FB_SECRET_KEY);
$user = $facebook->require_login();
?>
 
En s'appuyant sur le design existant, on crée deux onglets correspondant aux deux fonctionnalités "Envoyer une boulette" et "Voir les scores" :
 
<fb:tabs>
    <fb:tab-item href="http://apps.facebook.com/boulettebattle/index.php?action=envoyer" title="Envoyer des boulettes" <?php echo (isset($_GET['action']) && $_GET['action'] == 'envoyer' ? 'selected="true"' : '') ?> />
    <fb:tab-item href="http://apps.facebook.com/boulettebattle/index.php?action=topscores" title="Top scores" <?php echo (isset($_GET['action']) && $_GET['action'] == 'topscores' ? 'selected="true"' : '') ?> />
</fb:tabs>

La première fonctionnalité consiste à sélectionner une personne en cliquant dessus ce qui provoquera :

  • l’envoi d’une notification au destinataire lui indiquant qu’il a reçu une boulette
  • l’incrémentation du le score de l’expéditeur

L’interface de sélection est assez triviale avec PHP, puisque la liste d’utilisateur est récupérée sous forme d’un tableau passé dans un foreach :

$friends = $facebook->api_client->friends_get();
$users = $facebook->api_client->users_getInfo($friends, array('uid', 'name'));
<ul class="friendlist">
<?php foreach ($users as $user):?>
<li><a href="http://apps.facebook.com/boulettebattle/index.php?action=envoyer&pid=<?php echo $user['uid']; ?>"><fb:profile-pic uid="<?php echo $user['uid'];?>" size="square" /><?php echo $user['name']; ?></a></li>
<?php endforeach;?>
</ul>

On crée un lien spécial pour passer l’action (envoi de la boulette) et l’ID utilisateur Facebook.

Le premier traitement consiste à appeler une action REST pour la notification, référencée dans l’API cliente, comme le montre le code suivant placé en haut de page après l’initialisation Facebook :

if (isset($_GET['action']) && isset($_GET['pid']) && $_GET['action'] == 'envoyer') {
$cnx = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
 
if (!$cnx) {
$error = 'Cannot connect to MySQL';
break;
}
 
$b = mysql_select_db(MYSQL_DB);
 
if (!$b) {
$error = 'Cannot open DB';
break;
}
 
if (!is_numeric($_GET['pid'])) {
$error = 'Error : bad ID';
break;
}
 
$sql = 'INSERT INTO `works_boulette` (uid_from, uid_to) VALUES (' . (integer)$user . ', ' . (integer)$_GET['pid'] . ')';
mysql_query($sql);
 
// Notification au destinataire
$zeuser = $facebook->api_client->users_getInfo($_GET['pid'], array('name'));
$facebook->api_client->notifications_send(array($_GET['pid']), ' vous a envoye une <a href="http://apps.facebook.com/boulettebattle/">boulette virtuelle</a>', '<fb:notif-subject>Vous avez recu une nouvelle boulette virtuelle</fb:notif-subject>', ' vous a envoye une <a href="http://apps.facebook.com/boulettebattle/">boulette virtuelle</a>');
}

Facebook ne fournit pas de stockage, c’est à vous de gérer votre propre backend SQL. POur cela on va créer un petite base avec une table pour stocker chaque expéditeur et chaque destinataire.

Enfin, il reste à gérer la page d’affichage des top scores. Pour cela une requête SQL va grouper les ID utilisateurs et afficher le nombre de boulettes envoyées :

if (isset($_GET['action']) && $_GET['action'] == 'topscores') {
	$cnx = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
 
	if (!$cnx) {
		$error = 'Cannot connect to MySQL';
		break;
	}
 
	$b = mysql_select_db(MYSQL_DB);
 
	if (!$b) {
		$error = 'Cannot open DB';
		break;
	}
 
	$sql = 'SELECT uid_from AS uid, COUNT(uid_from) AS nb FROM `works_boulette` GROUP BY uid_from ORDER BY nb ASC';
	$rs = mysql_query($sql);
	$topscores = array();
 
	while ($tab = mysql_fetch_assoc($rs)) {
		$topscores[] = $tab;
	}
 
	mysql_close();
}
 
<fb:explanation>
	<fb:message>Top bouletteurs</fb:message>
	Voici les meilleurs lanceurs de boulettes !
</fb:explanation>
<table cellspacing="3">
<?php foreach ($topscores as $topuser): ?>
<tr>
	<td><fb:profile-pic uid="<?php echo $topuser['uid'];?>" size="square" /></td>
	<td><fb:name uid="<?php echo $topuser['uid'];?>" useyou="false" /></td>
	<td class="boulette"><?php echo $topuser['nb']; ?></td>
</tr>
<?php endforeach; ?>
</table>

Le code est téléchargeable ici et l’application Facebook est ici.

6 Réponses to “Une application Facebook avec PHP”

  1. max Says:

    Excellent tuto,avec les sources en plus! merci.
    Petite question?
    Si tu devais afficher les résultat sur la page profil de l’utilisateur, comment ferais-tu?
    merci pour ta réponse.

  2. Christophe Buguet Says:

    Merci pour ton retour.

    Tu as la possibilité de définir du code FBML à utiliser sur le profil utilisateur avec la fonction REST “profile.setFBML”. Elle est documentée ici : http://wiki.developers.facebook.com/index.php/Profile.setFBML. Tu as un exemple d’utilisation ici également : http://developers.facebook.com/step_by_step.php#pushing

  3. bruno Says:

    C’est tellement rare

    merçi

  4. Facebook dev Says:

    Merci votre page est très utile et bien expliquée
    j ai une petite question ? voila,,, plusieurs applications affiche les evenements dans le wall alors que faut il pour qu un envoi de boulette apparait dans le mur
    cordialement MM

  5. Adham Sabri Says:

    Merci beaucoup pour ce tuto

  6. antoine Says:

    bonjour, ca marche nikel enfin quasiment ;)
    en fait j’ai copié ton code dans une de mes applications afin de voir ce que ca donne mais le probleme c’est que une fois que j’ai autorisé l’acces a mes données je suis redirigé vers une page qui me propose d’envoyer des boulettes
    jusque la pas de soucis
    seulement cette page n’est pas encadré par le cadre facebook : vus voyez ce que je veux dire ?

    Help please

Leave a Reply

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS Log in