¿Cómo obtener el país según una determinada IP?

¿Alguien sabe de una manera simple de recuperar el país para una dirección IP dada? Preferiblemente en formato ISO_3166-1?

Mucha gente (incluida mi empresa) parece usar MaxMind GeoIP.

Tienen una versión gratuita de GeoLite que no es tan precisa como la versión de pago, pero si buscas algo simple, puede ser suficiente.

Hay dos enfoques: usar un servicio de Internet y usar algún tipo de lista local (tal vez envuelto en una biblioteca). Lo que quieras dependerá de lo que estás construyendo.

Para los servicios:

Para listas:

Aquí hay un buen servicio gratuito con una API pública: http://www.hostip.info/use.html

ipinfodb proporciona una base de datos gratuita y API para IP a país y viceversa. Usan datos gratuitos de MaxMind. Los datos se actualizan todos los meses, y es una gran alternativa gratuita con una precisión decente.

No sé qué tan preciso es ese sitio hostip.info. Acabo de visitar ese sitio e informó que mi país es Canadá. Estoy en EE. UU. Y el ISP que mi oficina usa solo opera desde los EE. UU. Le permite corregirlo, pero si usa este servicio para rastrear visitantes de sitios web por país, no tendrá forma de saber si los datos son correctos. Por supuesto, solo soy un punto de datos. Descargué la base de datos GeoLite Country, que es solo un archivo .csv, y mi dirección IP se identificó correctamente como US.

Otro beneficio de la línea de productos MaxMind (pagada o gratuita) es que usted tiene los datos, no incurre en el impacto en el rendimiento de realizar una llamada de servicio web a otro sistema.

Lo más preciso es Digital Elements NetAcuity … no gratis, pero obtienes lo que pagas la mayor parte del tiempo … Elemento digital

la localización del cliente de google regresa ( mi ejemplo )

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude); location = "IP location: " + getFormattedLocation(); document.getElementById("location").innerHTML = location; 

Puede usar la solución provista para esta pregunta .

Pero devuelve un código de país de 2 dígitos.

Prueba este código php

   

Puedes usar mi servicio, http://ipinfo.io , para esto. La API devuelve una gran cantidad de detalles diferentes sobre una dirección IP:

 $ curl ipinfo.io/8.8.8.8 { "ip": "8.8.8.8", "hostname": "google-public-dns-a.google.com", "loc": "37.385999999999996,-122.0838", "org": "AS15169 Google Inc.", "city": "Mountain View", "region": "CA", "country": "US", "phone": 650 } 

Si solo busca el código de país, solo tiene que agregar / país a la URL:

 $ curl ipinfo.io/8.8.8.8/country US 

Aquí hay una función PHP genérica que puede usar:

 function ip_details($ip) { $json = file_get_contents("http://ipinfo.io/{$ip}"); $details = json_decode($json); return $details; } $details = ip_details("8.8.8.8"); echo $details->city; // => Mountain View echo $details->country; // => US echo $details->org; // => AS15169 Google Inc. echo $details->hostname; // => google-public-dns-a.google.com 

He usado el IP 8.8.8.8 en estos ejemplos, pero si desea detalles para la IP del usuario simplemente pase $_SERVER['REMOTE_ADDR'] lugar. Más detalles están disponibles en http://ipinfo.io/developers

use la función ipToCountry ($ ip) desde http://www.mmtutorialvault.com/php-ip-to-country-function/

puede usar las API de servicio web que hacen esto funcionan como:

 see example of service: http://ip-api.com and usage: http://whatmyip.info 

Consulte ipdata.co, que le proporciona varios puntos de datos desde una dirección IP.

La API es bastante rápida, con 10 puntos finales globales, cada uno capaz de manejar llamadas> 800M diariamente.

Aquí hay un ejemplo curl;

 curl https://api.ipdata.co/78.8.53.5 { "ip": "78.8.53.5", "city": "G\u0142og\u00f3w", "region": "Lower Silesia", "region_code": "DS", "country_name": "Poland", "country_code": "PL", "continent_name": "Europe", "continent_code": "EU", "latitude": 51.6461, "longitude": 16.1678, "asn": "AS12741", "organisation": "Netia SA", "postal": "67-200", "currency": "PLN", "currency_symbol": "z\u0142", "calling_code": "48", "flag": "http://sofes.miximages.com/country/pl.png", "emoji_flag": "\ud83c\uddf5\ud83c\uddf1", "time_zone": "Europe/Warsaw", "is_eu": true, "suspicious_factors": { "is_tor": false } }⏎ 

Puede probar la base de datos IPLLocation LITE gratuita

Para crear la tabla en MySQL

 CREATE DATABASE ip2location; USE ip2location; CREATE TABLE `ip2location_db1`( `ip_from` INT(10) UNSIGNED, `ip_to` INT(10) UNSIGNED, `country_code` CHAR(2), `country_name` VARCHAR(64), INDEX `idx_ip_to` (`ip_to`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 

Para importar los datos

 LOAD DATA LOCAL INFILE 'IP2LOCATION-LITE-DB1.CSV' INTO TABLE `ip2location_db1` FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' IGNORE 0 LINES; 

Código PHP para consultar el MySQL

 country_code; $country_name = $row->country_name; echo "Country_code: " . $country_code . "
"; echo "Country_name: " . $country_name . "
"; // Free recordset and close database connection mysql_free_result($result); mysql_close($link); // Function to convert IP address (xxx.xxx.xxx.xxx) to IP number (0 to 256^4-1) function Dot2LongIP ($IPaddr) { if ($IPaddr == "") { return 0; } else { $ips = explode(".", $IPaddr); return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256); } } ?>