2010-04-04 26 views
17

¿Cuáles son las técnicas de detección de ubicación para direcciones IP?
sé que mirar el
$_SERVER['HTTP_ACCEPT_LANGUAGE'] (no precisa pero sobre todo útil para detectar la ubicación, por ejemplo, si los usuarios de un rango de IP establecen francesa a su navegador, entonces significa que este rango) pertenece a Francia
y
gethostbyaddr($_SERVER['REMOTE_ADDR']) (para buscar nombres de dominio de nivel superior)
entonces puede haber a whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
veces:
$HTTP_USER_AGENT (cadena de agente de usuario de Firefox tiene código de idioma, no es exacta, pero sobre todo se pueden utilizar para detectar la ubicación)
Técnicas de detección de ubicación para direcciones IP

También sé cómo obtener la zona horaria pero no funciona en los nuevos navegadores. Además hay css issue que detecta el historial del visitante, se puede usar para ver qué páginas de google y wikipedia visitó (google.co.uk, google.com.tr)

¿Pero qué pasa con las ciudades?

+1

múltiples duplicados, incluyendo http://stackoverflow.com/questions/283016/know-a-good-ip-address -geolocation-service y http://stackoverflow.com/questions/2244989/need-a-client-side-api-for-determing-geo-location-of-ip-addresses – skaffman

+3

No, piden servicios, pregunto cómo esos servicios han detectado las ubicaciones. – ilhan

Respuesta

7

No puede hacer esto sin una base de datos que asigne direcciones IP a ciudades/países/proveedores. Existen ofertas comerciales como ip2location que puede usar. AFAIK no existe una alternativa gratuita, ya que mantener una base de datos IP así es mucho trabajo. alternativa libre: GeoIP2

Actualización: Hay varias cosas que le permiten crear una base de datos tal, si usted invierte tiempo suficiente:

  1. Utilice las bases de datos proporcionadas por regional and local registries para encontrar el propietario de un IP .
  2. Muchos ISP usan un esquema de nombres que le permite ubicar al usuario. A veces puede incluso leer el nombre de la ciudad en texto sin formato si realiza una búsqueda DNS inversa. A veces es más críptico. Por ejemplo, actualmente tengo p5dcf6c4a.dip.t-dialin.net, y no tengo idea de que el esquema de nombres sea ...
  3. Use un traceroute. Si no puede identificar la ubicación de un usuario, aún se pueden encontrar a cabo la ubicación de su enlace ascendente
+0

Sí, los conozco, pero quiero aprender cómo hacen su propia base de datos. – ilhan

2

hay bases de datos (algunos de ellos son gratis) que pueden utilizarse para convertir IP en las ciudades :

por ejemplo: http://www.maxmind.com/app/geolitecity

+0

Lo sé, es muy útil para los países grandes, pero no es exacto para Bulgaria. Todos mis visitantes son del sudeste de Bulgaria, pero los muestra como si fueran del centro oeste (ciudad capital). – ilhan

0

Una forma en que se compilan estas bases de datos es a partir de información whois. Por ejemplo, para determinar la ubicación de 69.59.196.211:

fmark @ home: ~ $ host 69.59.196.211 211.196.59.69.in-addr.arpa nombre de dominio puntero stackoverflow.com. fmark @ home: ~ $ stackoverflow.com whois

Whois Server versión 2.0

nombres de dominio en el .com y .net dominios ahora puede ser registrado en el muchos diferentes registradores en competencia.

<SNIP> 

> Registrado: stackoverflow.com LLC
410 Clayton Ave El Cerrito, California 94530 Estados Unidos

<SNIP> 

Obviamente, esto es no enormemente precisas técnicas, de modo más sofisticados supuestamente se usan.

4

Si busca una cierta copia - solución de pasta, i foudn este código:

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; 

} 

Espero que esto ayude a alguien.

+1

http://api.hostip.info parece no estar disponible más – shenkwen

1

En lugar de utilizar una API de terceros, le sugiero que utilice un registro IP alojado. Este post se explica más

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

Básicamente están usando ciudad país IP registro de la base de MaxMind [http://dev.maxmind.com/geoip/geoip2/geolite2/] con pocas modificaciones. Después de que una consulta de ejemplo

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

Si la funcionalidad de geolocalización, no es un requisito grande para su proyecto, puede utilizar algo tan simple como esto:

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

Hay que tener en cuenta que freegeoip tiene un límite de 10k solicitud/hora.

0

U puede utilizar esta función

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

Llame a la función

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

¿Cómo se transfiere una dirección IP a esta función que no sea su dirección IP actual? Estoy grabando la dirección IP cuando alguien ingresa datos en un formulario, solo quiero verificar que los usuarios que ingresan spam o basura –

+0

@KimWilson vea mi respuesta a continuación – Jonathan

0

La mayor parte de las bases de datos existentes utilizan una agregación de datos de los registros internacionales de ARIN, AFRINIC, ANIC etc, así como de usuario lugares enviados. Las técnicas más sofisticadas incluyen Topología y Geolocalización de Restricciones.

Ejecuto mi propia API https://ipdata.co que proporciona varios puntos de datos, incluyendo, el país, la ciudad, la región, lat/long y otros.

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

Puede asignar una dirección IP a su ubicación (ciudad, país, código postal), zona horaria, etc., ya sea con una base de datos o una API (base de datos alojada).

He aquí un ejemplo del uso de una API

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

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

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

más aquí: Location from IP address

Cuestiones relacionadas