Un blog sur les logiciels libres

Des articles basés essentiellement sur VirtueMart, Joomla, Talend...

octobre 06 2009

Géolocaliser un utilisateur Facebook depuis PHP via mod_geoip de MaxMind

Tagged Under : , , ,

Cette fois-ci, rien à voir avec des templates Joomla / Virtuemart …;-)

Je souhaitais détecter dans une application Facebook, la localisation géographique de l’internaute. Pour cela je me suis tourné vers l’API de géolocalisation de MaxMind.

Facebook fonctionne comme un proxy. Quand un internaute se connecte sur Facebook pour utiliser une application tierce (quizz….), Facebook se connecte à son tour via HTTP à l’application tierce (qui peut être hébergé n’importe où). De ce fait, lorsque l’on essaye de géolocaliser un internaute en se basant sur l’adresse supposée de l’internaute, autrement dit l’adresse IP stockée dans la variable serveur REMOTE_ADDR, on géolocalise en réalité les serveurs de Facebook.

Heureusement, Facebook met à disposition l’adresse de l’internaute dans la variable serveur « HTTP_X_FB_USER_REMOTE_ADDR ».

Afin que la géolocalisation ne soit pas trop gourmande, j’ai préféré utiliser le module apache de Max Mind, et non la version PHP. Pour que la variable HTTP_X_FB_USER_REMOTE_ADDR soit prise en compte, il faut modifier le code de la façon suivante :

/* (...) */
ap_add_common_vars(r);

/* Récupération de l'adresse IP de l'utilisateur Facebook */

if (apr_table_get(
     r->subprocess_env,
      "HTTP_X_FB_USER_REMOTE_ADDR")) {
    ipaddr_ptr =
     (char *) apr_table_get(
       r->subprocess_env,
       "HTTP_X_FB_USER_REMOTE_ADDR"
       );
}
/* Suite des tests */

else if (apr_table_get(
      r->subprocess_env,
        "HTTP_CLIENT_IP")) {
          ipaddr_ptr = (char *) apr_table_get(
           r>subprocess_env,
           "HTTP_CLIENT_IP"
          );
}
/* (...) */

Pour que la partie de code ajoutée soit prise en compte, et donc que la gélocalisation Facebook fonctionne, il faut rajouter la ligne suivante dans votre configuration Apache.

GeoIPScanProxyHeaders On

Maintenant, la localisation géographique est accessible dans PHP, via ce type d’appel à apache_note :

// affiche la code du pays d'après l'adresse IP
echo apache_note("GEOIP_COUNTRY_CODE");
Artisteer - Joomla Theme Generator