Géolocalisation à partir d'une adresse IP

Olivier Duffez (admin)
Membre du personnel
Je cherche des outils gratuits en ligne pour géolocaliser une adresse IP.
L'idéal serait un script PHP qui à partir d'une adresse IP me donne latitude + longitude et/ou pays/région/ville

Si vous connaissez ce genre d'outils, ou même des outils approchés, je suis preneur ;-)

Merci d'avance
Olivier
 
WRInaute discret
salut

sur maxmind.com tu as gratos la géolocalisation ip-> pays..pour les villes et autre..tout est payant partout
 
WRInaute occasionnel
j'avais vu un logiciel java qui faisait des traceroute avec rendu graphique sur une mappe monde de toutes les nodes....a priori il doit faloir interroger le RIPE pour obtenir les infos géographiques d'un IP , et je pense que ça se limite pas mal au pays ou a la "grande" ville ou se trouve le fournisseur d'acces.

en tout cas j'essaye de retrouver la bete :)
 
Olivier Duffez (admin)
Membre du personnel
merci je vais aller voir

et si je me limite aux adresses IP des serveurs web, il y a sans doute des scripts ou outils gratuits basés sur les enregistrements de noms de domaine ou sur d'autres fonctions liées aux serveurs ?

Olivier
 
Olivier Duffez (admin)
Membre du personnel
fredsoft a dit:
WebRankInfo a dit:
tout me semble payant sur maxmind...

http://www.maxmind.com/download/geoip/d ... oIP.dat.gz gratos la

sinon les outils complet comme tu le souhaite..en gratuit faut pas réver..il y a des gens qui bossent derreire...on est sorti des business plans a rentabilité dans 50 ans..alors tout service ce paye..surtout ces services la..
y'en a qui sont gratuits... mais c'est plus dur à trouver :-(
la différence avec ce qui est souvent proposé, c'est que je ne m'intéresse pas à l'adresse IP des internautes, mais celle d'un serveur web. et donc je peux sans doute utiliser d'autres services, basés sur le whois.
par exemple http://www.youngzsoft.net/ip2location/i ... 46.226.133 récupère des infos intéressantes, et j'aimerais faire pareil.
pour RIPE il y a http://www.ripe.net/db/whois/whois.html mais c'est un formulaire en ligne
si vous en connaissez...

Olivier
 
WRInaute occasionnel
WRI juste pour te dire, qu'actuellement un seul outil de mesure gère bien la géolocalisation (xiti) mais cette fonction n'est accessible qu'après paiement.

Pour en arriver là (géolocalisation niveaux des villes je crois), ils ont croisé pas moins de 6 bases de données, alors si tu arrives à trouver un outil gratuit qui fait cela, prévient moi tout de suite je suis preneur
;)
 
Olivier Duffez (admin)
Membre du personnel
je répète yep que ce que je cherche n'est pas vraiment comparable car je ne veux pas localiser des internautes mais des serveurs, et je veux donc passer par les bases de données de whois.

je pourrais peut-être faire un outil basé sur la commande whois de linux, mais le pb est que le format des données renvoyées n'est pas toujours le meme...
 
WRInaute occasionnel
Serait-ce pour étudier le rapport entre l'IP du serveur qui héberge un site et la langue de site (toujours dans le but d'améliorer son positionnement) ?
 
Nouveau WRInaute
Salut a tous, je viens de tombé sur ce forum en cherchant justement des informations sur la géolocalisation basée sur Ip.

Alors voila ce que j'ais à dire :

Pour ce qui est de la localisation d'une ip à amsterdam au lieu d'en france, cela est du au fait que la requète whois a été passé sur l'arin avant ripe, l'arin renvois un résultat érroné sur ce bloc d'ip, il ne s'agit donc pas d'un problème de mise a jours, d'ailleur il y a plusieur outils de localisation qui sont basé sur le même principe car il renvois la même erreur.

Pour ce qui est de la requète whois, il n'est pas nécessaire de passer par un formulaire Web, une requète TCP sur par exemple whois.ripe.net:43 est suffisant, on récupère les données dans un format standards (trés simple a parser). Essayer avec un telnet par example.

Le gros problème avec les requètes whois c'est que les bases de données ne contiennent que trés peu de précision, pour le ripe (Réseau IP Européen) il n'y a pas plus que le code pays semble t'il.

Encuie il faut être vigilant a récupérer les bonne infos depuis un server whois, une requète avec une ip inconnue du serveur ne renvois pas d'erreur mais une localisation au niveau mondial, il faut alors faire une requete sur un autre server whois (RIPE, ARIN, LACNIC, APNIC, AFNIC)

Pour la localisation au niveau des villes, pour les ip de l'arin il suffit d'une requete whois (d'ou l'erreur plus haut) pour le reste je suppose que le systeme est basé sur un base de données regroupant le central contenant le premier noeud d'interconnection (aprés le dslam, pour l'adsl) qui est obtenu aprés un reverse dns sur l'ip en question (genre xxx.yyy.zzz.com > com = TLD, zzz : ex:wanadoo yyy > noeud, xxx > machine avec l'ip)
Ceci renvois donc à une ville d'un pays que l'on localise a l'aide d'une nouvelle DB ville/coordonnées), maic ce n'est qu'une supposition.

En résumé, pour localiser un server, si on se contente du pays, une requete whois suffit (attention a l'ordre des requete) Sinon... et bien je cherche encore.
Pour la requète whois, un cgi resoud trés vite le problème, sinon je croit que le php support les sockets non ? dans ce cas le problème est réglé.

Voila, Voila, si vous avez des remarques, critiques, précisions... je suis preneur.

++

DeX.
 
Olivier Duffez (admin)
Membre du personnel
merci Dex de partager ces infos avec nous, et bienvenue sur WRI

quand tu parles de l'ordre des requetes whois, sais-tu comment faire pour le faire dans le bon ordre ? ça dépend des cas ?

Olivier
 
Nouveau WRInaute
En fait ça dépend comment tu analyse les réponse du server whois, en principe tu a besoin uiniquement de deux requêtes au maximum si tu fait bien ton prog, j'explique :

L'idéal (d'aprés moi, je suis loin d'être expert) serait de fait ainsi :

Suivant la probabilité de la zone géographique de requete a faire, tu commence par le serveur whois concerné, c'est a dire que si tu suppose que la requete concerne une ip européenne, tu commence par le server de RIPE.
Le server de renvois une réponse, si il est concerné le boulot et terminé.
Mais si ne posséde pas d'informations sur l'ip, en principe il t'indique l'organisme qui lui est concerné.

Pour explique un peu plus clairement, voila un exemple :

Actuellement mon ip est 81.250.27.35, si je fait une requete whois sur ripe j'obtient :

inetnum: 81.250.27.0 - 81.250.27.255
netname: IP2000-ADSL-BAS
descr: BSLIL209 Lille Bloc1
country: FR
admin-c: WITR1-RIPE
tech-c: WITR1-RIPE
status: ASSIGNED PA
remarks: for hacking, spamming or security problems send mail to
remarks: postmaster@wanadoo.fr AND abuse@wanadoo.fr
mnt-by: FT-BRX
changed: gestionip.ft@francetelecom.com 20030910
source: RIPE

ce qui est cohérent (mais pas précis :-( )

En revanche, si je demande à l'arin (whois de l'amérique du nord) j'obtiens :

OrgName: RIPE Network Coordination Centre
OrgID: RIPE
Address: Singel 258
Address: 1016 AB
City: Amsterdam
StateProv:
PostalCode:
Country: NL

ReferralServer: whois://whois.ripe.net:43

c'est la ou ça devient interresant, le server de l'arin nous précise que l'on doit s'adresser a l'arin et il nous donne même le protocole (lol) et l'adresse.

C'est là ou le system utilisé pour créer la base de donnée qui provoque des incohérences est perfectible.

Remarque : En fait amsterdam est le centre ou ce situe le server ripe

On peut également optimiser le system avec un cache mais surtout évité une double réquète en créant un index avec les relations subnets-ip/nic.

J'espère avoir été assez clair, je pense que ça peut aider, si tu a d'otre question ou besoin d'un coup de main...

voila, voila

++

DeX.

PS : vraiment désoler pour toutes les fautes d'orthographes mais je suis un peu débordé et c'est loin d'être inné chez moi :evil:
 
WRInaute impliqué
Moi il me situe en suède...
C'est d'ailleurs le problème de la méthode uniquement par whois : il met tous ceux qui connectent par Tele2 en Suède... (suède que nous saluons au passage, n'est ce pas Thierry.... ;))
 
Nouveau WRInaute
Remi L. a dit:
Moi il me situe en suède...
C'est d'ailleurs le problème de la méthode uniquement par whois : il met tous ceux qui connectent par Tele2 en Suède... (suède que nous saluons au passage, n'est ce pas Thierry.... ;))

Interrésant ça !!! tu pourrais donné ton ip, en masquant le dernier chiffre si tu veut.
 
Nouveau WRInaute
Je crois pouvoir t'aider un peu WebRankInfo... Tu peux consulter la page http://www.dnsstuff.com/ elle contient tout les info que tu cherche mais j'ai un script qui permet d'utiliserle db de www.dnsstuff.com et avoir une des infos synthétique. Le voici tu pourras l'adapter comme bon te semble...Tu m'en donneras des nouvelles... :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>
Enter in IP<br />
<form name="form1" id="form1" method="post" action="">
<input type="text" name="ip" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
<?php
if(isset($_POST['submit'])){
$output = file_get_contents("http://www.dnsstuff.com/tools/netgeo.ch?ip=".$_POST['ip']);
$output = explode("<HR>", $output);
$output = $output[1];
$output = str_replace('</PRE>
<SCRIPT>status = "Done!";
</SCRIPT>', "", $output);

}
?>
<pre>
<?php
if(!empty($output)){
echo $output;
}
?></pre>
<br />
</body>
</html>

Voilà
A+
Bermy
 
Olivier Duffez (admin)
Membre du personnel
Merci Bermy. Une question : cette méthode est-elle autorisée par dnsstuff.com ?

edit : je viens de tester avec mon IP, il me situe en Californie...
 
Nouveau WRInaute
Salut WebRankInfo,
Pour ton info,
cette méthode est-elle autorisée par dnsstuff.com ?

J'ai obtenu ce script à http://forum.powweb.com/showthread.php?t=45029&highlight=dnsstuff.com... Je ne crois pas qu'il soit apprové par dnsstuff.com... Mais je crois qui serait possible d'en demander la permission au webmestre de ce site surtout qu'on peut obtenir une quantité impressionante d'info sur la tracabilité d'un IP, domain,... sur internet et ce gratuitement. J'ai jamais vue autant d'outils pour ce genre d'info réunis sur le même site... Même si tu n'obtiens pas l'autorisation tu pourras essayer d'obtenir des infos sur le comment ils obtiennent leurs résultats et les rassemblent. Si tu obtients des infos, je serais partant de participer à l'élaboration d'un outil permettant une meilleure connaissance de qui fréquente un site et adapter le script d'une plaforme d'un site en fonction des besoins des utilisateurs. Je serais interressé à pouvoir utiliser et offrir un tel outil sur mon site. En passant, j'ai toujours pas obtenu des infos sur mon outil de popularité de liens... Tu pourrais y jeter un coup d'oeil... https://www.webrankinfo.com/forum/t/outil-danalyse-de-la-popularite-sujet-regle.21454/

Merci!
 
WRInaute discret
Bermy a dit:
Je crois pouvoir t'aider un peu WebRankInfo... Tu peux consulter la page http://www.dnsstuff.com/ elle contient tout les info que tu cherche mais j'ai un script qui permet d'utiliserle db de www.dnsstuff.com et avoir une des infos synthétique. Le voici tu pourras l'adapter comme bon te semble...Tu m'en donneras des nouvelles... :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
</head>

<body>
Enter in IP<br />
<form name="form1" id="form1" method="post" action="">
<input type="text" name="ip" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
<?php
if(isset($_POST['submit'])){
$output = file_get_contents("http://www.dnsstuff.com/tools/netgeo.ch?ip=".$_POST['ip']);
$output = explode("<HR>", $output);
$output = $output[1];
$output = str_replace('</PRE>
<SCRIPT>status = "Done!";
</SCRIPT>', "", $output);

}
?>
<pre>
<?php
if(!empty($output)){
echo $output;
}
?></pre>
<br />
</body>
</html>

Voilà
A+
Bermy

Salut
ton code ne marche pas
ta variable $output est la même a chaque fois ce n'est pas normal!
Apres essais erreur php
 
Nouveau WRInaute
Adresses de Whois

je ne sais pas si cela peur étayer la discussion, mais, nous autres, pauvres utilisateurs de Mac, avons l'utilitaire de réseau, petite app. incluant Traceroute, Net Stat ... et tout ce que vous pouvez imaginez...
J'en arrive donc au adresses fournis par Apple pour le Whois:
-whois.nic.ad.jp
-whois.apnic.net
-whois.ripe.net
-whois.nic.mil
-whois.arin.net
-whois.internic.net
-whois.networksolutions.com
En espérant vous avoir aidé, je reste à votre entière disposition...
 
WRInaute impliqué
Je reviens sur l'interrogation directe par whois. Le plus simple est de faire un whois direct sur l'arin, qui va donner le champ 'ReferralServer'.

Il suffit simplement ensuite d'interroger le serveur se trouvant sous ce champ et là on arrive à avoir le bon serveur whois direct, avec les bonnes informations (code pays, provider).

J'avais fait un petit bout de code à ce niveau là, voici une petite démo :
http://phptrust.org/test-ip.php

C'est à optimiser, je vais bientôt m'y repencher dessus :)
 
WRInaute impliqué
Huhu, pour le moment j'ai pas retouché à ça, je le ferai d'ici quelques jours, je suis sur un autre projet pour le moment ;)

Mais la technique est pas très compliquée. Voilà la fonction pour ceux que ça intéresse (pas optimisée, pas commentée => pas bien mais bon ;) ) :

Code:
function Whois($prmIp,$prmReturn = false) {
	$host = "whois.arin.net" ;
	$first = true ;
	$end = true ;
	do {
		$test = new SocketTCP($host,"43") ;
		$test->Connecter() ;
		if (!$prmReturn) echo "<i style='color:green;'>Connexion à $test->host ... </i><br><a style='color:green;'>Connecté à ".date("H:i:s")." ! </a>" ;
		if (!$first) $test->Recevoir() ;
		$first = false ;
		$test->Envoyer($prmIp."\r\n") ;
		$prout = $test->RecevoirParPacket(8192) ;
		if (!$prmReturn) echo "<br><a style='color:blue;'>Lancement de la requête... Ok !</a><br>" ;
		if ($pos = strpos($prout,"ReferralServer:")) {
			$host = substr($prout,($pos+24),(strpos($prout,"\n",$pos+22) - ($pos+24))) ;
			if (strpos($host,":")) {
				$pouet = explode(":",$host) ;
				$host = $pouet[0] ;
				
			}
			$end = false ;
			if (!$prmReturn) echo "<a style='color:red;'>$prmIp n'est pas connue de ce serveur.</a>" ;	
		}

		else {
			if (!$prmReturn) echo "<a style='color:blue;'>Réception des informations relatives à $prmIp en cours ... Ok !</a><br><br>" ;
			
			$pouet = $prout ;
			while ($prout = $test->RecevoirParPacket(8192)) {
				$pouet .= $prout ;
			}
			$end = true ;

			$pouet = str_replace("\n","<br>",$pouet) ;
			$pouet = str_replace("country:","Pays:",$pouet) ;
			$pouet = str_replace("remarks:","Remarques:",$pouet) ;
			$pouet = str_replace("address:","Adresse:",$pouet) ;
			$pouet = str_replace("Route:","Route:",$pouet) ;
			$pouet = str_replace("origin:","Origine:",$pouet) ;
			$pouet = str_replace("descr:","Description:",$pouet) ;
			$pouet = str_replace("status:","Etat:",$pouet) ;
			$pouet = str_replace("ASIGNED","Attribuée",$pouet) ;
			$pouet = str_replace("role:","Rôle:",$pouet) ;
			$pouet = str_replace("source:","Source:",$pouet) ;
			$pouet = str_replace("route:","Route:",$pouet) ;
			$pouet = str_replace("changed:","Changé:",$pouet) ;
			$pouet = str_replace("e-mail:","E-mail:",$pouet) ;
			
			if ($prmReturn) {
				$test->Deconnecter() ;
				return $pouet ;
			}
			else echo $pouet ;
		}
		if (!$prmReturn) echo "<br><a style='color:red;'>Déconnecté !</a><br><br>" ;
		$test->Deconnecter() ;
	} while (!$end) ;
}

Pour la classe SocketTCP, de ma composition, c'est ça :
Code:
class SocketTCP {
	var $SocketId ;

	var $buffer ;
	var $dataBuffer ;
	var $flagOk ;
	var $lastError ;
	var $connecte ;
	var $nbOctetEnvoye ;
	var $nbOctetRecu ;

	var $port ;
	var $host ;
	var $ip ;

	function SocketTCP($prmAdresse,$prmPort,$prmTimeLimit=30) {
		set_time_limit($prmTimeLimit) ;
		$this->host = $prmAdresse ;
		$this->port = $prmPort ;
		$this->connecte = false ;
		$this->flagOk = true ;
	}

	function ChangeAdresse($prmAdresse) {
		$this->host = $prmAdresse ;
	}

	function Connecter() {
		if ($this->flagOk) {
			$this->SocketId = fsockopen($this->host,$this->port) ;
			if ($this->SocketId == false ) {
				$this->flagOk = false ;
				$this->connecte = false ;
			}
			else {
				$this->flagOk = true ;
				$this->connecte = true ;
			}
			return $this->connecte ;
		}
		else {
			$this->connecte = false ;
			return false ;
		}

	}

	function Deconnecter() {
		if ($this->connecte) {
			fclose($this->SocketId) ;
			return true ;
		}
		else return false ;
	}

	function Envoyer($prmMessage) {
		if ($this->connecte) {			
			$this->buffer = fwrite($this->SocketId,$prmMessage) ;
			if ($this->buffer == false ) {
				return false ;
			}	
			else {
				$this->nbOctetEnvoye += $this->buffer ;
				return true ;
			}
		}
	}

	function RecevoirParPacket($prmPacketSize = 2048)  {
		if ($this->connecte) {
			$this->dataBuffer = "" ;
			$this->dataBuffer = fread($this->SocketId,$prmPacketSize) ;
			return $this->dataBuffer ;
		}
		else return false ;

	}

	function Recevoir() {
		if ($this->connecte) {
			$full_text = "" ;
			do {
				$data = "" ;
				$data = $this->RecevoirParPacket(2048);
				$full_text .= $data ;
			} while ($data != 0) ;
			return $full_text ;
		}
		
		else return false ; 
	}
	
} ;

Pas optimisées et commentée non plus :)
 
WRInaute impliqué
Sujet très intéressant.
Je fais des recherches pour obtenir seulement la région française de l'internaute. Et seulement les régions françaises.
J'ai testé les divers web services actuels sans trop de résultats. Peut être que quelqu'un à plus d'informations à ce jour.
 
WRInaute impliqué
narayana a dit:
Sujet très intéressant.
Je fais des recherches pour obtenir seulement la région française de l'internaute. Et seulement les régions françaises.
J'ai testé les divers web services actuels sans trop de résultats. Peut être que quelqu'un à plus d'informations à ce jour.

+1 je veux filtrer les visiteurs PACA et IDF pour un annonceur mais je ne trouve pas
 
WRInaute impliqué
hervedidier a dit:
Peut-etre une piste qui pourrait aider : je crois que OpenAds (ex-phpAdsnew) possède un module permettant la géolocalisation. Mais je n'ai pas testé personnellement pour savoir si les "area code targetting" et "city targetting" marchent en dehors des US.

http://www.openads.org/products/geotargeting.html

En effet, mais pour prendre simplement cette partie du code et pouvoir l'exploiter par la suite, c'est pas du gâteau :evil:

impossible de trouver ce ... de fichier GeoIPRegion.dat
 
WRInaute discret
Bonjour,

Si cela intéresse encore quelqu'un, on a fait un outil en ligne et à distance (pour le moment seulement avec du file_get_contents, donc avec allow_url_fopen = On) : http://www.geolocalise-ip.com/

C'est basé sur la base de données de Maxmind, notre base de données est mise à jour tous les 5 du mois.
Bientôt nous prendrons en compte toutes les villes du monde puisque Geonames founit une base de données sur quasiement toutes les villes du monde (Maxmind l'utilise en partie).

Voilà, il n'y aucune prétention sur le site, on a eue besoin de cet outil pour nos sites e-commerce et on s'est dit que cela serait pas mal d'en faire profiter d'autres :lol:
Par contre pour le moment on a bridé l'intérogation à distance à 50 requêtes par jour.

N'hésitez pas si vous avez des questions, par contre cet outil n'est pas un exploit technique puisque finalement on ne fait qu'utiliser des BDD, mais c'est très long à expliquer, donc ne me demandez pas de vous expliquer ce qu'il a derière on a déjà un petit peu essayé sur le blog.

A +
 
Discussions similaires
Haut