2010-04-04 13 views
17

Jakie są techniki wykrywania lokalizacji dla adresów IP?
wiem spojrzeć na
$_SERVER['HTTP_ACCEPT_LANGUAGE'] (nie dokładne, ale przede wszystkim przydatna do wykrywania położenia, na przykład jeśli użytkownicy zakres adresów IP jest ustawiony Francuzów do swojej przeglądarce oznacza to, że w tym zakresie) należy do Francji
i
gethostbyaddr($_SERVER['REMOTE_ADDR']) (patrzeć krajowa domena najwyższego poziomu)
następnie mogą być whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
czasami:
$HTTP_USER_AGENT (ciąg agenta użytkownika Firefoksa zawiera kod języka, a nie dokładny, ale przede wszystkim może być stosowana do wykrywania położenia)
Techniki wykrywania lokalizacji dla adresów IP

Również wiem, jak uzyskać strefę czasową, ale nie działa ona w nowych przeglądarkach. Ponadto istnieje css issue, który wykrywa historię odwiedzającego, może być używany do sprawdzenia, jakie strony google i wikipedia odwiedził (google.co.uk, google.com.tr).

A co z miastami?

+1

wielu duplikatów, łącznie http://stackoverflow.com/questions/283016/know-a-good-ip-address -geolocation-service i http://stackoverflow.com/questions/2244989/need-a-client-side-api-for-determing-geo-location-of-ip-addresses – skaffman

+3

Nie, oni proszą o usługi, pytam jak te usługi wykryły lokalizacje. – ilhan

Odpowiedz

7

Nie można tego zrobić bez bazy danych, która mapuje adresy IP do miast/krajów/dostawców. Dostępne są oferty komercyjne, takie jak ip2location, z których można skorzystać. AFAIK nie ma żadnej darmowej alternatywy, ponieważ utrzymywanie takiej bazy danych IP wymaga sporo pracy. darmowa alternatywa: GeoIP2

Aktualizacja: Jest kilka rzeczy, które pozwalają na stworzenie takiego db, jeśli inwestują wystarczająco dużo czasu:

  1. obsługi baz danych dostarczonych przez regional and local registries znaleźć właściciela adresu IP użytkownika .
  2. Wielu dostawców usług internetowych używa schematu nazewnictwa, który umożliwia zlokalizowanie użytkownika. Czasami można odczytać nazwę miasta w postaci zwykłego tekstu, jeśli wykonano odwrotne wyszukiwanie DNS. Czasami jest bardziej tajemniczy. Na przykład mam obecnie p5dcf6c4a.dip.t-dialin.net, a ja nie mam pomysłu, że schemat nazewnictwa jest ...
  3. Użyj traceroute. Jeżeli nie można określić lokalizację użytkownika, nadal można dowiedzieć się lokalizację jego uplink
+0

Tak, znam je, ale chcę się dowiedzieć, jak tworzą własną bazę danych. – ilhan

2

Istnieją bazy danych (niektóre z nich są bezpłatne), który może być użyty do konwersji adresów IP do miast :

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

+0

Wiem o tym, jest to bardzo przydatne w dużych krajach, ale nie jest ono dokładne dla Bułgarii. Wszyscy moi goście są z południowo-wschodniej Bułgarii, ale pokazuje im, jakby byli z centralnego zachodu (stolicy). – ilhan

0

Jednym ze sposobów, w jaki te bazy danych są kompilowane jest z whois informacji. Na przykład, aby określić położenie 69.59.196.211:

fmark @ home: ~ $ host 69.59.196.211 211.196.59.69.in-addr.arpa Domain Name wskaźnik stackoverflow.com. fmark @ home: ~ $ whois stackoverflow.com

Whois Server w wersji 2.0

nazw domen .com i .NET domeny może teraz zostać zarejestrowana wielu konkurujących rejestratorów.

<SNIP> 

> Rejestrujący: stackoverflow.com LLC
410 Clayton Ave El Cerrito, California 94530 Stany Zjednoczone

<SNIP> 

Oczywiście nie jest to niezwykle dokładne, więc bardziej wyrafinowane techniki są rzekomo używane.

4

Jeśli szukasz jakiegoś Copy - rozwiązanie pasty, i znależć ten kod:

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 helps kogoś.

+1

http://api.hostip.info prawdopodobnie nie jest już dostępny – shenkwen

1

Zamiast korzystać z API innej firmy, sugerowałbym używanie własnego hostowanego rekordu IP. Ten post wyjaśni Ci więcej

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

Zasadniczo są one za pomocą Kraj Miasto rekord bazy MaxMind za IP [http://dev.maxmind.com/geoip/geoip2/geolite2/] z kilkoma modyfikacjami. Po tym kwerenda próbka

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

Jeśli funkcja geolokalizacji nie jest wielkim wymaganiem dla swojego projektu, można użyć coś tak prostego jak to:

$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; 

Trzeba wziąć pod uwagę, że freegeoip ma limit 10 tys. żądań na godzinę.

0

U można używać tej funkcji

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

wywołać funkcję

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

W jaki sposób przekazujesz adres IP do tej funkcji innej niż twój obecny adres IP? Zapisuję adres IP, gdy ktoś wprowadza dane w formularzu, chcę tylko zweryfikować użytkowników, którzy wprowadzają spam lub śmieci –

+0

@KimWilson zobacz moją odpowiedź poniżej – Jonathan

0

Większość z istniejących baz danych zastosowania agregacji danych z międzynarodowych rejestrach ARIN, AFRINIC, ANIC etc jak użytkownik przesłane lokalizacje. Bardziej zaawansowane techniki obejmują geologię topologii i ograniczeń.

Używam własnego interfejsu API https://ipdata.co, który udostępnia kilka punktów danych, w tym kraj, miasto, region, szerokość/długość i inne.

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

Można mapować adres IP do swojej lokalizacji (miasto, kraj, kod pocztowy), strefy czasowej itd. Albo z bazy danych lub bazy danych API (gospodarzem).

Oto przykład użycia API

curl https://ipapi.co/city/ 
> Mountain View 

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

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

więcej tutaj: Location from IP address

Powiązane problemy