Présentation
Le service i2c, pour IP 2(to) Country, est un service gratuit créé par Mes-Stats, pour Mes-Stats permettant d’obtenir le pays d’un visiteur à partir de son adresse IP (v4 ou v6) . Vous devez vous munir d’un compte client D-Sites pour pouvoir l’utiliser. Celui-ci se créé dans l’administration, une fois inscrit au site, dans le menu « Compte D-Sites ».
Afin de garantir la qualité du service, le nombre limite de requêtes est de 50 000 requêtes par mois pour le service gratuit. Si vous comptez faire plus de requêtes que cela, vous pouvez souscrire à ces offres dans le manager:
- 100 000 requêtes par mois: 1€ / mois ou 10€ / an
- 500 000 requêtes par mois: 4€ / mois ou 40€ par an
- 1 000 000 requêtes par mois: 7€ / mois ou 70€ par an
- pour plus de requêtes, n’hésitez pas à me contacter
Voir l’article de mise à place des comptes utilisateurs.
Note: en utilisant SOAP, vous avez aussi la possibilité d’utiliser les fonctions complémentaires, et ce même sans compte utilisateur.
SOAP
En plus de la méthode de récupération du pays via une requête GET (HTTP), i2c est accessible en SOAP, Simple Object Access Protocol depuis tous les langages pouvant utiliser SOAP. Parmis lesquels PHP, Perl, Python, C, C++, C#, Ruby…
Le fichier .wsdl est disponible à cette adresse: http://i2c.d-sites.com/i2c.wsdl
Il y a deux méthodes pour récupérer un pays:
- string
getCountryLogin( string $ip, string $username, string $password )
Retourne le pays (code ISO de deux lettres) à partir de l’adresse IP$ipfournie avec le compte utilisateur$username/$passworddéfini dans l’administration - bool
login( string $username, string $password )
Se connecte à l’API
boolgetCountry( string $ip )
Récupère le pays de l’adresse IP. A renouveler autant de fois que nécessaire
voidlogout()
Se déconnecte de l’API – optionnel
Fonctions supplémentaires
getCountries()
Permet de récupérer la liste de tous les pays disponibles sous forme de leur code ISO séparés par des virgulesgetContinents()
Permet de récupérer la liste des continents, séparés par des virgulesgetCountryName($country_code, $langue)
Permet de récupérer le nom réel du pays en fonction de son code ISO dans la langue demandéegetContinent ($country_code)
Retourne le code du continent en fonction du code ISO du paysgetContinentName ($continent_code, $langue)
Retourne le nom réel du continent en fonction de son code dans la langue demandée
Lorsqu’il y a besoin de spécifier la langue, les langues disponibles sont:
fr_FR– Françaisen_US– Englishes_ES– Spanishnl_NL– Dutchde_DE– Germanpt_PT– Portuguese
(par défaut)
Exemple en PHP
<?php $adresse_ip1 = '12.34.56.78'; $adresse_ip2 = '87.98.158.218'; try { $client = new SoapClient('http://i2c.d-sites.com/i2c.wsdl'); $client->login('samuel', 'mon-mot-de-passe'); $country1 = $client->getCountry($adresse_ip1); $country2 = $client->getCountry($adresse_ip2); $country2_name = $client->getCountryName($country2, 'fr_FR'); $client->logout(); } catch (SoapFault $exception) { trigger_error('SOAP Exception: '.$exception, E_USER_ERROR); } echo $country1; // Affiche: us echo $country2_name; // Affiche: France ?>
Note: Si vous avez besoin de récupérer uniquement le pays d’une adresse IP, la fonction getCountryLogin est beaucoup plus rapide.
Note: Au vue des différents tests, si vous avez besoin uniquement de quelques couples IP/Pays, préférez la récupération par HTTP qui sera plus rapide.
HTTP
Le principe est très simple, il vous suffit de demander le contenu de la page suivant et de mettre un argument « ip » dans l’URL avec comme valeur l’adresse IP et deux arguments u (nom d’utilisateur) et p (mot de passe) décrivant le compte utilisateur utilisé.
http://i2c.d-sites.com/get?u={NOM-D’UTILISATEUR}&p={MOT-DE-PASSE}&ip={ADRESSE}
Remplacez {ADRESSE} par l’adresse IP du visiteur. L’adresse IP peut être une adresse IP v4 (xxx.xxx.xxx.xxx où 0 > xxx > 255) ou une adresse IP v6.
Exemple en PHP
Avec PHP, il suffit de récuperer le contenu de la page avec fopen ou file_get_contents par exemple:
<?php $adresse_ip = '87.98.158.218'; $country = file_get_contents('http://i2c.d-sites.com/get?u=samuel&p=mon-mot-de-passe&ip='.$adresse_ip); echo $country; // Affiche: fr ?>
Note importante: Remplacez samuel par le nom d’utilisateur de votre compte client D-Sites créé dans l’administration et mon-mot-de-passe par son mot de passe.
Exemple en Shell
En shell, voici un script qui affiche le pays en fonction de l’IP passée en argument :
#!/bin/sh ACCOUNT_PARAMS="u=samuel&p=mon-mot-de-passe" PATH_GET="http://i2c.mes-stats.fr/get?"$ACCOUNT_PARAMS"&ip="$1; FICHIER="get?ip="$1; wget $PATH_GET -q cat $FICHIER rm $FICHIER
Utilisation
Pour récupérer le pays d’une IP depuis la console, faites:
./getip.sh {ADRESSE}Note: Le script précédent doit être mis dans un fichier appelé « getip.sh » et vous devez être placé dans son dossier parent.
Quid des performances ?
Il y a plutôt intérêt a utiliser les données des sites tel que ip2nation.com en local pour éviter la dépendance non..
Le réel intérêt, c’est que l’implémentation est très simple et ne nécessite que très peu d’outils (pas de base de données, uniquement un accès réseau) et inflige une charge extrêmement minime au serveur (pas de base de données, pas d’espace disque à utiliser…).
En ce qui concerne les performances, voici quelques chiffres:
J’ai depuis chez moi une latence vers le serveur i2c de 50ms, latence extrêmement élevée par rapport à la latence entre hébergeurs Européens. (quelques ms).
Pourtant, voici quelques résultats de « time » sur un wget (depuis chez moi) vers i2c. Avec une IP non cachée – 1ère visite d’un visiteur.
En moyenne 400ms pour une réponse dont l’IP n’est pas cachée sur i2c – pages suivantes pour un même visiteur. Lorsque ça l’est, voici quelques chiffres:
Avec toutes les opérations (connexion au serveur, envoi de la requête – connexion 1Mbits, réception des données) il faut ~250ms pour récupérer la valeur du pays. Les performances sont au rendez-vous.
Ensuite, contrairement à
ip2nation.com, i2c gère les IPv6. Lors de la première demande d’une IPv6, la requête prend un moyenne 1s, ensuite toujours les 250ms. Néanmoins, pour les IPv6, il y a un système d’enregistrement des groupes d’adresses IP – pas encore en production, en qualification pour encore 1 semaine. Par exemple,2001:41d0:2:5030::1fait parti du groupe2001:41d0::/32. Ce groupe correspond au paysfr. Ainsi, toutes les requêtes suivantes pour des IPv6 contenues dans ce groupe seront exécutées en moyenne à 300ms.Note importante: Tous ces résultats comprennent le temps d’envoi de la requête, de réception du contenu et de la requête. Depuis un script PHP sur un serveur OVH, les résultats sont obtenus en moyenne en
0.05seconde.J’espère avoir répondu à la question des performances qui est, pour tout système duquel quelqu’un dépend, très importante.
Samuel.