Técnicas de detección de ubicación para direcciones IP

¿Cuáles son las técnicas de detección de ubicación para direcciones IP?
Sé mirar el
$_SERVER['HTTP_ACCEPT_LANGUAGE'] (no es preciso pero sobre todo útil para detectar la ubicación, por ejemplo, si los usuarios de un rango de IP configuran francés en su navegador, significa que este rango) pertenece a Francia
y
gethostbyaddr($_SERVER['REMOTE_ADDR']) (para ver el dominio de nivel superior de código de país)
entonces puede ser para whois gethostbyaddr($_SERVER['REMOTE_ADDR'])
a veces:
$HTTP_USER_AGENT (La cadena del agente de usuario de Firefox tiene un código de idioma, no es preciso, pero puede usarse principalmente para detectar la ubicación)

También sé cómo obtener la zona horaria, pero no funciona en los nuevos navegadores. Además, existe un problema de CSS 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, ¿y las ciudades?

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, sin embargo, no existe una alternativa gratuita, ya que mantener una base de datos de IP así es mucho trabajo. Alternativa libre: GeoIP2

Actualización: hay varias cosas que le permiten crear un archivo db, si invierte suficiente tiempo:

  1. Utilice las bases de datos proporcionadas por los registros regionales y locales para encontrar el propietario de un IP.
  2. Muchos ISP usan un esquema de nombres que le permite ubicar al usuario. En ocasiones, incluso puede 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 es …
  3. Use un traceroute. Si no puede identificar la ubicación de un usuario, aún puede averiguar la ubicación de su enlace ascendente

Si está buscando una solución de copiar y pegar, creo 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  and  preg_match("@(\s)*(.*?)@si",$xml,$match); //assing the city name to the array $ipDetail['city']=$match[2]; //get the country name inside the node  and  preg_match("@(.*?)@si",$xml,$matches); //assign the country name to the $ipDetail array $ipDetail['country']=$matches[1]; //get the country name inside the node  and  preg_match("@(.*?)@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.

Existen bases de datos (algunas de ellas gratuitas) que se pueden usar para convertir direcciones IP en ciudades:

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

En lugar de usar una API de terceros, le sugiero que use un registro IP alojado por usted mismo. Este post te explica más

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

Básicamente están utilizando el registro de la base de datos IP de la ciudad de país de maxmind [ http://dev.maxmind.com/geoip/geoip2/geolite2/%5D con algunas modificaciones. Después de eso, una consulta de muestra

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

U puede usar esta función

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

Llamar a la función

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

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

Aquí hay 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í: Ubicación desde la dirección IP

Una forma de comstackr estas bases de datos es a partir de la 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 puntero del nombre de dominio stackoverflow.com. fmark @ home: ~ $ whois stackoverflow.com

Versión de servidor Whois 2.0

Los nombres de dominio en los dominios .com y .net ahora se pueden registrar con muchos registradores competentes diferentes.

   

> Registrante: stackoverflow.com llc
410 Clayton Ave El Cerrito, California 94530 Estados Unidos

   

Obviamente, esto no es muy preciso, por lo que se usan supuestamente técnicas más sofisticadas.

Si la funcionalidad de geolocalización no es un gran requisito para su proyecto, puede usar 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; 

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

La mayoría de las bases de datos existentes usan una agregación de datos de los registros internacionales ARIN, AFRINIC, ANIC, etc., así como las ubicaciones enviadas por los usuarios. Las técnicas más sofisticadas incluyen Topología y Geolocalización de Restricciones.

Ejecuto mi propia API ipdata.co que proporciona varios puntos de datos, incluidos, el país, la ciudad, la región, latitud / longitud y otros.

Esta respuesta utiliza una clave API de “prueba” que es muy limitada y solo para probar algunas llamadas. Regístrese para obtener su propia clave de API gratuita y obtenga hasta 1500 solicitudes diarias para el desarrollo.

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