Localisation par adresse ip en php
carolline
-
76zzz29 -
76zzz29 -
Voici mon petit probleme:
je cherche a connaitre la localisation (grossière genre pays) des personnes qui se connectent à mon site. Je sais que c'est possible car Nedstat propose un tel service et ca a l'air de marcher dans environ 90% des cas. J'essaie de faire ca en php mais je suis ouvert a tout autre langage. Je pense qu'on doit pouvoir tirer des informations de l'adresse ip, mais comment ?
Merci.
je cherche a connaitre la localisation (grossière genre pays) des personnes qui se connectent à mon site. Je sais que c'est possible car Nedstat propose un tel service et ca a l'air de marcher dans environ 90% des cas. J'essaie de faire ca en php mais je suis ouvert a tout autre langage. Je pense qu'on doit pouvoir tirer des informations de l'adresse ip, mais comment ?
Merci.
20 réponses
Résumé de la discussion
Le problème consiste à estimer la localisation géographique approximative des visiteurs d'un site à partir de leur adresse IP, afin d'obtenir le pays ou la ville sans recourir à des outils externes. Pour répondre, plusieurs approches existent côté serveur et via des API externes, gratuites ou payantes, permettant d'obtenir pays, région et ville à partir de l'adresse IP, notamment MaxMind, ipinfodb ou geolocalise-ip. Certaines solutions exigent un appel HTTP vers une API et le traitement de la réponse en PHP ou autre langage, tandis que d'autres proposent une bibliothèque locale, avec des quotas et une précision variable.
-
Le script de m2ok me localise à 20 km de chez moi alors que je vis à moins de 500m de Grenoble !
Enfin bon !
Moi j'ai trouvé (en cherchant et sans réinventer la roue)
http://ipinfodb.com/ip_location_api.php
Ils ont même la gentillesse de mettre tout le code php pour questionner leur site sur les adresses ip
Suffit de se servir !
On peut récupérer dans des variables, le pays, la région, la ville,... -
No comments
<?
$a=array();
// get real ip adress
@detectProxy($a);
$ip_avant = $a['IP'];
//get localisation
$ip2country = @ip2country($ip_avant);
print_r($ip2country );
function ip2country($ipadress)
{
$surl = "https://whatismyipaddress.com/ip-lookup";
$data = "LOOKUPADDRESS=" . $ipadress;
$geolocalisation = do_post_request($surl, $data);
preg_match("#<font class='block-title'>Geo-Location Information<font size=2></B></font></font><P><UL>(.*?)</TABLE>#is", $geolocalisation, $mylocalistion, PREG_OFFSET_CAPTURE);
preg_match("#<TR><TD>Country</TD><TD>(.*?)<#is", $mylocalistion[1][0], $country, PREG_OFFSET_CAPTURE);
preg_match("#<img src=\"(.*?)\"#is", $mylocalistion[1][0], $countryimg, PREG_OFFSET_CAPTURE);
preg_match("#<TR><TD>City</TD><TD>(.*?)</TD>#is", $mylocalistion[1][0], $city, PREG_OFFSET_CAPTURE);
$a = array ("country" => trim($country[1][0]), "city" => trim($city[1][0]), "countryimg" => trim($countryimg[1][0]));
return $a;
}
function do_post_request($url, $data, $optional_headers = null) {
$start = strpos($url,'//')+2;
$end = strpos($url,'/',$start);
$host = substr($url, $start, $end-$start);
$domain = substr($url,$end);
$fp = pfsockopen($host, 80);
if(!$fp) return null;
fputs ($fp,"POST $domain HTTP/1.1\n");
fputs ($fp,"Host: $host\n");
if ($optional_headers) {
fputs($fp, $optional_headers);
}
fputs ($fp,"Content-type: application/x-www-form-urlencoded\n");
fputs ($fp,"Content-length: ".strlen($data)."\n\n");
fputs ($fp,"$data\n\n");
$response = "";
while(!feof($fp)) {
$response .= fgets($fp, 1024);
}
fclose ($fp);
return $response;
}
function detectProxy(&$ar)
{//begin of function
$gotcha=false;
if(array_key_exists('HTTP_X_FORWARDED_FOR',$_SERVER) || array_key_exists('HTTP_PROXY_CONNECTION',$_SERVER) || array_key_exists('HTTP_VIA',$_SERVER))
{$gotcha=TRUE;}
$gotcha = (stristr($_SERVER['REMOTE_HOST'],"proxy") !== FALSE ) ? TRUE : $gotcha ;
if($gotcha)
{
$ar['PORT']= (array_key_exists('REMOTE_PORT',$_SERVER) ? $_SERVER['REMOTE_PORT'] : "unknown");
$ar['HOST']= (array_key_exists('REMOTE_HOST',$_SERVER) ? $_SERVER['REMOTE_HOST'] : "unknown");
$ar['IP']= (array_key_exists('REMOTE_ADDR',$_SERVER) ? $_SERVER['REMOTE_ADDR'] : "unknown");
$ar['FORWARDED_FOR']=(array_key_exists('HTTP_X_FORWARDED_FOR',$_SERVER) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : "unknown");
$ar['INFO']= (array_key_exists('HTTP_VIA',$_SERVER) ? $_SERVER['HTTP_VIA'] : "unknown");
}
else
{
$ar['PORT']= (array_key_exists('REMOTE_PORT',$_SERVER) ? $_SERVER['REMOTE_PORT'] : "unknown");
$ar['HOST']= (array_key_exists('REMOTE_HOST',$_SERVER) ? $_SERVER['REMOTE_HOST'] : "unknown");
$ar['IP' ]= (array_key_exists('REMOTE_ADDR',$_SERVER) ? $_SERVER['REMOTE_ADDR'] : "unknown");
}
return $gotcha;
}//end of function
?> -
Voici le code php permettant de recuperer le pays, la region, la ville, la longitude et la lattitude par l'ip d'un visiteur
Seul probléme on ne peut soumettre que 25 demandes / jour
Cela conviendra au petit site souhaitant permettre une inscription prés-remplie
<?php
$ip=$_SERVER["REMOTE_ADDR"];
// Initialisation de la page vers laquelle on poste
$url = 'http://www.maxmind.com/app/lookup_city';
// Mis en forme des valeurs postees
$post = array(
'ips' => $ip
);
//Mise en place du POST
$postdata = '' ;
foreach( $post as $name => $value ) {
$postdata .= $name . '=' . $value . "&" ;
}
// Creation du tableau d'option
$opts = array( 'http' =>
array (
'method' => 'POST',
'header' => 'Content-type: application/x-www-form-urlencoded',
'content' => $postdata
)
);
// Creation du contexte
$context = stream_context_create($opts);
// Recuperation d une page en methode post
$http_page = file_get_contents($url,false,$context);
// Nettoyage du code recupere
$http_page=eregi_replace("<!DOCTYPE(.+)$ip","",$http_page);
$http_page=eregi_replace("</table>(.+)</html>","",$http_page);
$http_page=str_replace('</font></td>','',$http_page);
$http_page=str_replace('</tr>','',$http_page);
$http_page=explode('<td><font size="-1">',$http_page);
//Recuperation des valeurs dans le tableau
$country_alpha2=$http_page[1];
$country=$http_page[2];
$region=$http_page[4];
$ville=$http_page[5];
$latitude=(float)$http_page[7];
$longitude=(float)$http_page[8];
//Affichage des resultats
echo 'country_alpha2:'.$country_alpha2.'<br>';
echo 'country:'.$country.'<br>';
echo 'region:'.$region.'<br>';
echo 'verif:'.$ville.'<br>';
echo 'latitude:'.$latitude.'<br>';
echo 'longitude:'.$longitude.'<br>';
?> -
J'ai réaliser et utilises un script qui marche très bien.
Il suffit d'indiquer l'IP et le script retourne la ville de provenance du visiteur. Il est facilement maniable en PHP.
<?php $ip = "l'ip à géolocaliser"; $script = "http://********/geoloc/geo.php?IP="; $retour = file_get_contents($script.$ip); echo $retour; ?>
-
bonjour ..
je n'y connais RIEN dans les scripts et autres ..
mais j'ai besoin de localiser précisément l'expéditeur de messages que je reçois régulièrement.
j'ai son Ip et son pays mais pas sa ville ou localisation précise et c'est vraiment urgent...
je suis allée sur ton blog mais c'est trop technique pour moi .. ;o)
peux tu m'aider stp ?
je n'ai pas trouver comment t'adresser un message privé ici pur te donner mon msn ou mon mail ...
Cordialement -
-
-
je l'ai testé ce script . le problème chez moi s'est que file_get_contents ne fonctionne pas sur mon hebergeur ou alors le site d'origine ( http://www.ieducatif.fr/geoloc/....) a placé une restriction . le seul moyen est un iframe et bouh caca les iframes .... mais sinon il me localise bien a la bonne adresse .
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Bonjours ayant lu les réponses (certaines pertinentes d'autre pas ...) j'ai trouvé un tuto en français pour intégrer la géolocalisation à votre site ( ce n'est pas comparable à Google Analytics mais peut faire l'affaire pour des cas bien précis).
Les plus de cette méthode :
- Permet de cibler et d'enregistrer dans une base de données (ou fichier si ça vous fais plaisir !) la ville, le code postal, le pays, la latitude et la longitude du visiteur en manipulant facilement le code que l'on donne.
- très facile d'intégration,
- permet d'être super classe avec une carte du monde en le couplant à Google Maps.
Les moins :
- c'est comme tout, rien n'est facile, il faut avoir des compétences en PHP.
- Il y a deux versions une gratuite limité à une trentaine d'informations,
l'autre est payante.
! IMPORTANT : les ip dynamiques ne peuvent être localiser avec précision, les ip fixe oui avec une précision de 2 à 20 km il me semble
La méthode est bien sur optimal pour l'enregistrement des information d'administration sinon elle sert à rien puisque Google Analytics fait très bien les statistiques visiteurs.
J'ai failli oublier le lien du tuto :)
http://www.siteduzero.com/tutoriel-3-306955-geolocalisez-vos-visiteurs-grace-a-leur-ip.html
Bonne intégration
Skim -
Bonjour,
J'ai été confronté a un problème similaire, je devait situer géographiquement un internaute.
Après une rapide recherche sur le web, j'ai finalement opté pour l'API de google Map.
Le lien suivant explique la technique dans le détail:
http://briancray.com/2009/05/29/find-web-visitors-location-javascript-google-api/
Cette solution implique d'obtenir une AJAX Search API Key disponible gratuitement au lien suivant:
http://code.google.com/intl/fr-FR/apis/ajaxsearch/signup.html-
Bonjour,
Merci beaucoup pour l'info !
Ca fonctionne tres bien, je compte l'utiliser sur mes sites web pour faire de la pub locale ....
Filmip
Http://www.ak1-fun.com -
-
-
-
Bonjour,
Je sais que le post est vieux, mais bon il ressort encore sur GG donc ...
Je pense même que cette réponse est déjà sur CCM, enfin bref il existe une API Web de géolocalisation ip sur https://www.geolocalise-ip.com/ et testé par des potes et moi.
Pas grand chose à dire parce que cela fonctionne bien, si ce n'est la limitation à 50 requêtes par jour en gratuit. -
<?php 002 function getPage($link){ 003 004 if ($fp = fopen($link, 'r')) { 005 $content = ''; 006 007 while ($line = fread($fp, 1024)) { 008 $content .= $line; 009 } 010 } 011 012 return $content; 013 } 014 015 function pingLink($domain){ 016 $file = @fopen($domain,"r"); 017 $status = -1; 018 019 if (!$file) { 020 $status = -1; // Site is down 021 } 022 else { 023 $status = 1; 024 fclose($file); 025 } 026 return $status; 027 028 } 029 030 function checkPage($content){ 031 $links = array(); 032 033 if (strlen($content) > 10){ 034 $startPos = 0; 035 while (strpos($content,'<a ',$startPos)){ 036 $spos = strpos($content,'<a ',$startPos); 037 $tmppos = strpos($content,'>',$spos); 038 $spos = strpos($content,'href',$spos); 039 $spos1 = strpos($content,'"',$spos)+1; 040 $spos2 = strpos($content,"'",$spos)+1; 041 if ($spos2 < $spos1) $spos = $spos2; 042 else $spos = $spos1; 043 044 $epos1 = strpos($content,'"',$spos); 045 $epos2 = strpos($content,"'",$spos); 046 if ($epos2 < $epos1) $epos = $epos2; 047 else $epos = $epos1; 048 049 $startPos = $epos; 050 $link = substr($content,$spos,$epos-$spos); 051 if (strpos($link,'http://') !== false) $links[] = $link; 052 } 053 } 054 055 return $links; 056 } 057 058 ?> 059 060 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "DTD/xhtml1-transitional.dtd"> 061 <html> 062 <head> 063 <title>Micro Link Checker</title> 064 <link href="style/style.css" rel="stylesheet" type="text/css" /> 065 </head> 066 <body> 067 <div id="main"> 068 <div id="caption">LINK STATUS</div> 069 <div id="icon"> </div> 070 <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" name="domain" id="domain"> 071 072 <table width="100%"> 073 <tr><td>URL to check:</td><td><input class="text" name="myurl" type="text" size="45"></td></tr> 074 <tr><td align="center" colspan="2"><br/><input class="text" type="submit" name="submitBtn" value="Check links"></td></tr> 075 </table> 076 </form> 077 <?php 078 if (isset($_POST['submitBtn'])){ 079 $url = isset($_POST['myurl']) ? $_POST['myurl'] : ''; 080 if (!(strpos($url,'http://') === 0) ) $url = 'http://'.$url; 081 082 ?> 083 <div id="caption">RESULT : <?php echo $url; ?></div> 084 <div id="icon2"> </div> 085 <div id="result"> 086 <table width="100%"> 087 <?php 088 $txt = getPage($url); 089 $linkArray = checkPage($txt); 090 foreach ($linkArray as $value) { 091 if (pingLink($value) <= 0){ 092 $status = "INVALID"; 093 } else { 094 $status = "OK"; 095 } 096 echo "<tr><td align='left'>$value</td><td>$status</td></tr>"; 097 sleep(2); 098 @ob_flush(); 099 flush(); 100 } 101 102 ?> 103 </table> 104 </div> 105 <?php 106 } 107 ?> 108 <div> 109 </body>
[Publicité supprimée Modération CCM -
<script language="Javascript" src=" http://map.geoup.com/geoup?template=welcome"></script>
je pense que ça doit marcher essaie le -
bonjour
Je suis alle sur ton site la geolocalisation est bonne pour le pays mais pas pour la ville.
j'au voulu remplir le questionaire mais impossible de terminer, le serveur me demande toujours de mettre un code, que je mets evidement et qu'il trouve a chaque fois inexact.
La ville indique est quand meme a 800 km de chez moi lol
See you soon -
Pour les webmasters qui le désirent, je fournis un script PHP sur mon site Internet http://www.WeLive.fr dans la rubrique Géolocalisation par IP.
Le script PHP vous retourne les informations sous forme de variables PHP : Pays, Drapeau du pays, Région-Département-Code Postal pour la France, Ville.
Celui-ci nécessite une inscription préalable aux fins d'éviter que n'importe qui l'utilise.
A bientôt
WeLive.fr -
Salut,
J'ai utilisé l'API PHP de MaxMind pour gélocaliser une adresse IP. Je l'affiche ensuite sur une carte Yahoo! Maps grâce à une application Adobe Flex. Toutes les étapes de l'installation et les scripts PHP sont présentés:
http://www.flex-tutorial.fr -
Regarde ici tous simplement !!!
http://belkhersite.hebergratuit.com/details.php?Article=11 -
Bonjour,
Avez vous un code complet qui fonctionne?
Mon objectif est de récupérer le nom de la ville dans une variable à partir de la personne qui c'est connecté à mon site.
car je dois rechercher dans ma Base l'association d'echec la plus proche de chez lui.
J'ai 62 ans, et franchement je ne comprends pas pourquoi cela ne fonctionne pas.
Est ce que l'un d'entre vous à une solution simple .
Einstein disait "faites simple simplement mais pas simpliste". -
-
L'outil Google Analytics te permet de faire la géolocalisation par continent, pays, et même ville.
C'est très simple à implémenter (juste un javascript à coller), et ça marche bien, si tu veux pas trop t'embêter je conseille de faire le suivi des visites par une application tierce-partie comme celle là.
A+ -
bonjour j'aimerais avoir sur mon forum a chaque fois que les membres écrive un drapeaux qui s'affiche de leur pays c'est possible ?et comment faire merci
-
bonjour, je voudrai savoir s'il etait possible d'avoir le code du site WeLive juste pour la localisation grace a l'IP. ou un autre code mais aussi precis que ce site au nievau de la ville. je trouve cela tres interessant pour savoir ou lancer une campagne de publicté pour une entreprise. cela serai mi coté administrateur enregistrer dans une bd.
-
-
-
-
Bonjour à toutes et tous,
Pour ma part, j'ai absolument besoin d'un système de géolocalisation très précis ( avec une marge d'erreur inférieure à 100 mètres).
Car dans le cadre de la création de mon site " communautaire" il faut que je puisse indiquer à chaque membres la distance qui les séparent les uns des autres.
Dans cette optique connaissez-vous et utilisez-vous le système mis en place sur le site " adopte un mec"? Et si oui, est il viable et gratuit? Merci pour vos réponses et votre intérêt!- cela demanderais que chacun donne sa localisation luis même et que tu face toi même une base de données énorme qui localiserais chaque ip enregistrée mais la encore on se retrouve face au problème des ip dynamique. un ip ne peut pas être plus précise que le relais ou elle est branché (la boucle local). certaine ip sont anonyme et ne donne comme localisation proxy anonyme (même sans proxy), il existe des plages d'ip qui sont donée a un emplacement géographique (c'est ce qu'utilise la plupart des localisateur ip)
moi j'utilise les plage ip et j'exclue une par une les ip que je sait dynamiques, je remplace les nombre pour qu'ils soit tous complet (exemple 27.18.567.43 (cette ip n'existe pas car elle contient un nombre supérieur a 255) j'utilise une expression régulière en php pour la transformé en 027.018.567.043 puis un $ip=str_replace(".","",$ip);
pour supprimé les point(on a donc 027018567043) et la on en fait un simple nombre ce qui fait 27018567043 (sa a juste supprimé le premier 0 mais il est pas important celui la)
puis je le compare au ip de ma base de données (qui ont aussi été mis au format de simple nombre)et la , il y a plus qu'à faire quelques étape rapide.
// 1 si c'est une ip dynamique, on saute la suite, la on peut riens faire.
// en code c'est juste un
if ($ip=="une ip dynamique" || $ip=="une autre ip dynamique" [et encore avec toute les ip dynamique]) {echo "nous n’avons pas pu vous localisé"}
// 2 sinon se n'est pas une ip dynamique on vérifi les plage de donéeet on la localise
else
{
if( $ip>=(début de plage d'ip) && $ip<=(fin de plage de donée){echo "ville correspondante";
if( $ip>=(début d une autre plage d'ip) && $ip<=(fin de l'autre plage de donée){echo "ville correspondante";
...
}
ma base de donnée est un simple fichier text avec une ip par ligne pour les ip dynamique
et un autre fichier text avec une ip par ligne sur 2 lignes séparé par une ligne vide pour les plages d'ip et pour le if, j'ai fait une boucle PHP qui compte le nombre de retour a la ligne pour connaitre le nombre d'ip enregistrée et la récupérer a chaque fois pour écrire toute les ip dynamique a viré automatiquement. (j'utilise uniquement PHP pour lire du txt, pas besoin de base de données SQL mais rien n’empêche d'en utilisé une)
pour récupérer son ip dans $ip j'utilise sa qui en plus renvoi si on utilise un proxy
$ipproxy="";
$ipprox="";
$proxy=0;
if (isset($_SERVER['HTTP_CLIENT_IP'])){
$ipclient=$_SERVER['HTTP_CLIENT_IP'];
$ipprox=" et vous utilisez un internet partager d'addresse: ";
$ipprox.=$_SERVER['REMOTE_ADDR'];
$proxy=1;
}
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$ipclient=$_SERVER['HTTP_X_FORWARDED_FOR'];
$ipproxy=" et vous utilisez un proxy d'adresse: ";
$ipproxy.=$_SERVER['REMOTE_ADDR'];
$proxy=1;
}
if($proxy==0) {
$ipclient=$_SERVER['REMOTE_ADDR'];
$ipproxy=" et vous utilisez n'utilisez aparement pas de proxy";
}
echo "<p>votre IP est: " ;echo $ipclient;echo $ipprox; echo $ipproxy ;echo "</p>" ;
(source du code de récuperation de l'ip http://76zzz29.freeboxos.fr/login)
ajoutez juste un $ip=$ipclient si vous ne voulez rien changer sinon remplacer l'un par l'autre(places sa avant la localisation) remplacez juste le echo "<p>votre IP est: " ;echo $ipclient;echo $ipprox; echo $ipproxy ;echo "</p>" ;
par le scripte de localisation
-