¿Cómo obtener el País según una determinada IP?
Pregunta
¿Alguien conoce una forma sencilla de recuperar el país de una dirección IP determinada?¿Preferiblemente en formato ISO_3166-1?
Solución
Mucha gente (incluida mi empresa) parece utilizar MaxMind GeoIP.
Tienen una versión gratuita. geolite que no es tan precisa como la versión paga, pero si solo buscas algo simple, puede ser suficiente.
Otros consejos
Hay dos enfoques:usando un servicio de Internet y usando algún tipo de lista local (quizás envuelta en una biblioteca).Lo que quieras dependerá de lo que estés construyendo.
Para servicios:
- http://www.hostip.info/use.html (como lo menciona Marca)
- http://www.team-cymru.org/Services/ip-to-asn.html
Para listas:
- http://www.maxmind.com/app/geoip_country (como lo menciona Orión)
Puedes crear el tuyo propio descargando las listas de los RIR:
- ftp.arin.net/pub/stats/arin/delegated-arin-latest
- ftp.ripe.net/ripe/stats/delegated-ripencc-latest
- ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-latest
- ftp.apnic.net/pub/stats/apnic/delegated-apnic-latest
ftp.lacnic.net/pub/stats/lacnic/delegado-lacnic-latest
El formato está documentado. en este LÉAME
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.Utilizan datos gratuitos de MaxMind.Los datos se actualizan cada mes y es una excelente alternativa gratuita con una precisión decente.
No sé qué tan preciso es ese sitio hostip.info.Acabo de visitar ese sitio y me informó que mi país es Canadá.Estoy en los EE. UU. y el ISP que utiliza mi oficina solo opera desde los EE. UU.Le permite corregir sus suposiciones, pero si está utilizando este servicio para rastrear a los visitantes del sitio web por país, no tendrá forma de saber si los datos son correctos.Por supuesto, soy sólo un dato.Descargué la base de datos GeoLite Country, que es solo un archivo .csv, y mi dirección IP se identificó correctamente como EE. UU.
Otro beneficio de la línea de productos MaxMind (de pago o gratuitos) es que usted tiene los datos, no incurre en el impacto de rendimiento que supone realizar una llamada de servicio web a otro sistema.
El más preciso es Digital Elements NetAcuity... no es gratuito, pero obtienes lo que pagas la mayor parte del tiempo...Elemento digital
google devuelve la ubicación del cliente (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 utilizar la solución proporcionada para esta pregunta.
Pero devuelve un código de país de 2 dígitos.
Prueba este código php
<?php $ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json[localTimeZone];?>
Puedes utilizar 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 necesita agregar /país a la URL:
$ curl ipinfo.io/8.8.8.8/country
US
Aquí hay una función PHP genérica que podrías 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 la IP 8.8.8.8 en estos ejemplos, pero si desea detalles sobre la IP del usuario, simplemente páselos. $_SERVER['REMOTE_ADDR']
en cambio.Más detalles están disponibles en http://ipinfo.io/developers
use la función ipToCountry($ip) de http://www.mmtutorialvault.com/php-ip-to-country-function/
puede utilizar API de servicios web que hacen este trabajo como:
see example of service: http://ip-api.com and usage: http://whatmyip.info
Ver ipdata.co lo que le proporciona varios puntos de datos de una dirección IP.
La API es bastante rápida, con 10 puntos finales globales, cada uno capaz de manejar >800 millones de llamadas diarias.
Aquí hay un ejemplo de rizo;
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": "https://ipdata.co/flags/pl.png",
"emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
"time_zone": "Europe/Warsaw",
"is_eu": true,
"suspicious_factors": {
"is_tor": false
}
}⏎
Puedes probar gratis Base de datos IP2Location LITE
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 MySQL
<?php
// Replace this MYSQL server variables with actual configuration
$mysql_server = "mysql_server.com";
$mysql_user_name = "UserName";
$mysql_user_pass = "Password";
// Retrieve visitor IP address from server variable REMOTE_ADDR
$ipaddress = $_SERVER["REMOTE_ADDR"];
// Convert IP address to IP number for querying database
$ipno = Dot2LongIP($ipaddress);
// Connect to the database server
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or die("Could not connect to MySQL database");
// Connect to the IP2Location database
mysql_select_db("ip2location") or die("Could not select database");
// SQL query string to match the recordset that the IP number fall between the valid range
$query = "SELECT * FROM ip2location_db1 WHERE $ipno <= ip_to LIMIT 1";
// Execute SQL query
$result = mysql_query($query) or die("IP2Location Query Failed");
// Retrieve the recordset (only one)
$row = mysql_fetch_object($result);
// Keep the country information into two different variables
$country_code = $row->country_code;
$country_name = $row->country_name;
echo "Country_code: " . $country_code . "<br/>";
echo "Country_name: " . $country_name . "<br />";
// 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);
}
}
?>