2010-04-04 5 views
17

Was sind die Standorterkennungstechniken für IP-Adressen?
Ich weiß am
$_SERVER['HTTP_ACCEPT_LANGUAGE'] (nicht genau, aber vor allem nützlich Lage zu erkennen, zum Beispiel, wenn ein Benutzer des IP-Bereichs zu ihrem Browser so einstellen, Französisch, dann bedeutet es, dass dieser Bereich) suchen nach Frankreich
und
gethostbyaddr($_SERVER['REMOTE_ADDR']) gehört (länderspezifische Top-Level-Domain)
dann kann whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
manchmal aussehen:
$HTTP_USER_AGENT (Firefox User-Agent-String hat den Sprachcode, nicht genau, aber meistens kann verwendet werden, um den Ort zu erkennen)
Positionserkennungstechniken für IP-Adressen

Auch ich weiß, wie man die Zeitzone bekommt, aber es funktioniert nicht in den neuen Browsern. Darüber hinaus gibt es css issue, die Besucherhistorie erkennt, kann es verwendet werden, um zu sehen, was Google und Wikipedia Seiten er/sie besucht hat (google.co.uk, google.com.tr)

Aber was ist mit Städten?

+1

mehrere Duplikate, einschließlich http://stackoverflow.com/questions/283016/know-a-good-ip-address -geolocation-service und http://stackoverflow.com/questions/2244989/need-a-client-side-api-for-determining-geo-location-of-ip-adresses – skaffman

+3

Nein, sie fragen nach Dienstleistungen, frage ich wie diese Dienste die Standorte erkannt haben. – ilhan

Antwort

7

Ohne eine Datenbank, die IP-Adressen Städten/Ländern/Anbietern zuordnet, ist dies nicht möglich. Es gibt kommerzielle Angebote wie ip2location, die Sie verwenden könnten. AFAIK gibt es allerdings keine freie Alternative, da die Pflege einer solchen IP-Datenbank ziemlich viel Arbeit kostet. Freie Alternative: GeoIP2

Update: Es gibt mehrere Dinge, die Ihnen erlauben, eine solche db zu erstellen, wenn Sie genügend Zeit investieren:

  1. Verwenden Sie die von regional and local registries bereitgestellt Datenbanken eine IP-Besitzer zu finden .
  2. Viele Internetdienstanbieter verwenden ein Benennungsschema, mit dem Sie den Benutzer finden können. Manchmal können Sie sogar den Namen der Stadt im Klartext lesen, wenn Sie eine Reverse-DNS-Lookup durchführen. Manchmal ist es kryptischer. Zum Beispiel habe ich derzeit p5dcf6c4a.dip.t-dialin.net, und ich habe keine Idee, dass das Namensschema ist ..
  3. Verwenden Sie eine Traceroute. Wenn Sie nicht den Standort eines Benutzers identifizieren können, können Sie immer noch die Lage seiner Uplink herauszufinden
+0

Ja, ich kenne sie, aber ich möchte lernen, wie sie ihre eigene Datenbank erstellen. – ilhan

2

Es gibt Datenbanken (einige von ihnen sind kostenlos), die verwendet werden können, um IP zu konvertieren die in Städte :

zB: http://www.maxmind.com/app/geolitecity

+0

Ich weiß es, es ist sehr nützlich für große Länder, aber es ist nicht korrekt für Bulgarien. Alle meine Besucher kommen aus Süd-Ost-Bulgarien, aber es zeigt sie wie aus dem zentralen Westen (Hauptstadt). – ilhan

0

Eine Möglichkeit, diese Datenbanken zusammengestellt werden aus whois Informationen.

fmark @ home: ~ $ host 69.59.196.211 211.196.59.69.in-addr.arpa Domain Name Zeiger stackoverflow.com zum Beispiel die Lage von 69.59.196.211 zu bestimmen. fmark @ home: ~ $ whois stackoverflow.com

Whois Server Version 2.0

Domain-Namen in der .com- und .net-Domains können nun mit vielen verschiedenen konkurrierenden Registraren registriert werden.

<SNIP> 

> Registrant: stackoverflow.com llc
410 Clayton Ave El Cerrito, Kalifornien 94530 USA

<SNIP> 

Natürlich ist dies nicht sehr groß genau, so anspruchsvollere Techniken werden angeblich benutzt.

4

Wenn Sie für einige Kopie suchen - Paste Lösung, foudn i diesen Code:

function countryCityFromIP($ipAddr) 
{ 
//function to find country and city from IP address 
//Developed by Roshan Bhattarai http://roshanbh.com.np 

//verify the IP address for the 
ip2long($ipAddr)== -1 || ip2long($ipAddr) === false ? trigger_error("Invalid IP", E_USER_ERROR) : ""; 
$ipDetail=array(); //initialize a blank array 

//get the XML result from hostip.info 
$xml = file_get_contents("http://api.hostip.info/?ip=".$ipAddr); 

//get the city name inside the node <gml:name> and </gml:name> 
preg_match("@<Hostip>(\s)*<gml:name>(.*?)</gml:name>@si",$xml,$match); 

//assing the city name to the array 
$ipDetail['city']=$match[2]; 

//get the country name inside the node <countryName> and </countryName> 
preg_match("@<countryName>(.*?)</countryName>@si",$xml,$matches); 

//assign the country name to the $ipDetail array 
$ipDetail['country']=$matches[1]; 

//get the country name inside the node <countryName> and </countryName> 
preg_match("@<countryAbbrev>(.*?)</countryAbbrev>@si",$xml,$cc_match); 
$ipDetail['country_code']=$cc_match[1]; //assing the country code to array 

//return the array containing city, country and country code 
return $ipDetail; 

} 

Hope this jemand hilft.

+1

http://api.hostip.info scheint nicht mehr verfügbar – shenkwen

1

Anstatt API von Drittanbietern zu verwenden, empfehle ich Ihnen, selbst gehostete IP-Datensätze zu verwenden. Dieser Beitrag erklärt Ihnen mehr

http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

Im Grunde sind sie MaxMinds Land Stadt IP Datenbankeintrag [http://dev.maxmind.com/geoip/geoip2/geolite2/] mit wenigen Modifikationen verwenden. Danach wird eine Beispielabfrage

$ip = $_SERVER['REMOTE_ADDR']; 
$long = sprintf('%u', ip2long($ip)); 
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; 
0

Wenn die Geolocation-Funktionalität keine große Anforderung für Ihr Projekt ist, können Sie etwas so einfach wie diese verwenden:

$geotxt=''; 
$dt=json_decode(@file_get_contents('https://freegeoip.net/json/'.$_SERVER['REMOTE_ADDR'])); 
if ($dt!=null) $geotxt=$dt->country_name.', '.$dt->region_name.', '.$dt->city; 
echo $geotxt; 

Sie haben zu berücksichtigen, die freegeoip hat ein Limit von 10k Anfrage/Stunde.

0

U kann diese Funktion nutzen zu

function ip_info(){ 
      return $data = json_decode(file_get_contents('http://ip-api.com/json/'),true); 
     } 

Rufen Sie die Funktion

$info = ip_info(); 
var_dump($info); 
+0

Wie übergibt man eine IP-Adresse an diese Funktion außer Ihrer aktuellen IP-Adresse? Ich zeichne die IP-Adresse auf, wenn jemand Daten in ein Formular eingibt. Ich möchte nur Benutzer überprüfen, die Spam oder Junk-Nachrichten eingeben. –

+0

@KimWilson siehe meine Antwort unten – Jonathan

0

Die meisten der bestehenden Datenbanken eine Aggregation von Daten aus den internationalen Registern verwenden ARIN, AFRINIC, ANIC usw. sowie Benutzer eingereichte Standorte. Zu den anspruchsvolleren Techniken gehören Topologie und Constraints Geolocation.

Ich meine eigene API https://ipdata.co, die mehrere Datenpunkte einschließlich, das Land, Stadt, Region, lat/lang und andere bietet.

php > $data = json_decode(file_get_contents('https://api.ipdata.co/69.59.196.211'),true); 
php > echo $data['country_name']; 
//United States 
php > echo $data['city']; 
//Albany 
0

Sie können eine IP-Adresse seiner Lage (Stadt, Land, Postleitzahl) Karte, Zeitzone usw. entweder mit einer Datenbank oder einer API (hosted Datenbank).

Hier ist ein Beispiel von

eine API mit
curl https://ipapi.co/city/ 
> Mountain View 

curl https://ipapi.co/country/ 
> US 

curl https://ipapi.co/timezone/ 
> America/Los_Angeles 

hier mehr: Location from IP address