2010-09-06 176 views
76

Idealmente estoy tratando de armar un script PHP que pueda consultar desde cualquier navegador web y devuelve el país de la dirección IP que accedió al script PHP.Obtener el país de la dirección IP con PHP

¿Es posible o hay una solución mejor?

+4

Nota obligatoria: IP-to-location no es un método confiable de identificación de origen debido a varios proxies, VPNs y otros horrores. De acuerdo con las direcciones IP, estoy en este momento en Texas, Noruega, República Checa y Japón. – Piskvor

+0

Pagar mi servicio https://ipdata.co para esto, proporciona una cantidad de puntos de datos que incluyen país, latitud/longitud, ciudad, región. – Jonathan

+0

IPLocate.io proporciona una API gratuita: ['https://www.iplocate.io/api/lookup/8.8.8.8'](https://www.iplocate.io/api/lookup/8.8.8.8) - Descargo de responsabilidad: ejecuto este servicio. – ttarik

Respuesta

4

Observe las funciones de GeoIP en "Otras extensiones básicas". http://php.net/manual/en/book.geoip.php

+5

No están * realmente * incorporados. http://www.php.net/manual/en/geoip.requirements.php –

+0

Me encuentro corregido. –

+4

Corrígelo, entonces. –

82

Hay API fácil y gratuito que puede utilizar, como los que:

que se mira el más digno de confianza depende de usted :)

lo contrario, hay secuencias de comandos que se basan en bases de datos locales en su servidor. Sin embargo, los datos de la base de datos deben actualizarse regularmente. Echa un vistazo a éste:

HTH!

Editar: Y, por supuesto, dependiendo de su proyecto es posible que desee mirar a HTML5 Location características. Todavía no puedes usarlos en Internet Explorer (IE9 lo admitirá, aún queda mucho camino por recorrer), pero en caso de que tu audiencia esté principalmente en dispositivos móviles o usando Safari/Firefox, definitivamente vale la pena mirarlo.

Una vez que tenga las coordenadas, puede revertir las geocodificaciones a un código de país. Una vez más hay API como ésta:

Actualizar, abril de 2013
Hoy yo recomendaría usar Geocoder, una biblioteca PHP que hace es muy fácil geocodificar direcciones IP, así como datos de direcciones postales.

*** Actualización, septiembre de 2016
Dado que la política de privacidad de Google ha cambiado, no puede usar la API de geolocalización HTML5 si su servidor no tiene certificado HTPPS o si el usuario no permite verificar su ubicación. Entonces ahora puede usar la IP del usuario y registrarse en PHP u obtener un certificado HTTPS.

+0

Creo que algo cambió en esta API desde que se publicó la respuesta, ahora recibo el siguiente error: "El proveedor de GoogleMaps no admite direcciones IP, solo direcciones de calles". –

+0

https://ipdata.co pertenece a esa lista :) – Jonathan

24

Puede descargar ip-mesas de MaxMind:

http://www.maxmind.com/app/geolite

importación CSV en su base de datos (asegúrese de crear un índice para ip_long_from + ip_long_to). A continuación, puede hacer:

$iplong = ip2long($_SERVER['REMOTE_ADDR']); 

// should use mysqli with prepared statements etc, but just an example 
mysql_query(" 
    SELECT country 
    FROM ip_table 
    WHERE $iplong BETWEEN ip_long_from AND ip_long_to 
    LIMIT 1 
"); 
+1

Esto, es una excelente manera de obtener el país desde una dirección IP. – Devator

+0

no entiendo cómo las personas obtienen los nombres de ciudades/países localizados, ya que geolite ofrece solo un par de idiomas – user151496

+0

Lo más sorprendente es que agregar índices para las columnas "de" y "a" hizo que la consulta tardara 10 veces más . Mantener la base de datos sin indexar funcionó mejor para mí, junto con LIMIT 1. Tal vez porque los datos están ordenados en el CSV. Imagínate. –

0

utilizar el widget www.feedsalive.com, para obtener la información de campo & última información de la página también.

46

Existen diversas API web que lo harán por usted. He aquí un ejemplo usando mi servicio, http://ipinfo.io:

$ip = $_SERVER['REMOTE_ADDR']; 
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}")); 
echo $details->country; // -> "US" 

API Web son una solución rápida y fácil agradable, pero si usted tiene que hacer una gran cantidad de operaciones de búsqueda y luego tener una IP -> Base de datos del país en su propia máquina es una mejor solución. MaxMind ofrece un free database que puede usar con varias bibliotecas PHP, incluido GeoIP.

+0

Me abstendría de implementar ipinfo.io en un entorno de producción. Acabo de fijar un retraso importante en nuestros scripts, a una función que llama a ipinfo.io para detalles de IP. Asegúrese de probar a fondo su elección de proveedor :) – Tiago

+0

Eso puede haber sido cierto en el pasado, pero ahora están alojados en varios proveedores y en varias ciudades para la máxima disponibilidad y capacidad de respuesta - https://twitter.com/ipinfoio/status/ 458100167439159296 –

1

Encontré esta publicación de blog muy útil. Me salvó el día. http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

Básicamente necesita instalar la tabla de la base de datos IP y luego hacer la consulta de MySQL para la dirección IP de la ubicación.

<?php 
include 'config.php'; 
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) OR die(mysql_error()); 
mysql_select_db(DB_NAME) OR die(mysql_error()); 
$ip = $_SERVER['REMOTE_ADDR']; 
$long = sprintf('%u', ip2long($ip)); 
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`"; 
$result = mysql_query($sql) OR die(mysql_error()); 
$ip_detail = mysql_fetch_assoc($result); 
if($ip_detail){ 
    echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city']; 
} 
else{ 
    //Something wrong with IP 
} 
+0

¿Por qué se ha rechazado este voto dos veces? –

+0

Bueno, puedo explicarlo primero, porque era mi primera o segunda publicación y el número de palabras no era suficiente, por lo que uno de los moderadores le dio a esta publicación un punto negativo, pero no tengo idea para el segundo. – Webby

1

Aquí es otra API gratuita para solicitudes de geolocalización: http://geoip.nekudo.com

Respuestas están en formato JSON. Además, el código fuente API está disponible en github en caso de que necesite configurar su propia API.

0

Si necesita tener una base de datos buena y actualizada, para tener más rendimiento y no solicitar servicios externos de su sitio web, here hay un buen lugar para descargar bases de datos actualizadas y precisas.

Lo estoy recomendando porque, en mi experiencia, funcionaba perfectamente incluso si incluía la ciudad y el país de mi IP, la mayoría de las otras bases de datos/apis no incluían/​​informaban mi ubicación excepto this service que me indicaba esta base de datos.
(Mi ubicación ip era de "Rasht" Ciudad en "Irán" cuando me estaba poniendo a prueba y el período de investigación: 2.187.21.235 igual a 45815275)

Por lo tanto recomiendo utilizar estos servicios si no está seguro acerca de qué servicio es más precisa:

Base de datos: http://lite.ip2location.com/databases

servicio API: http://ipinfodb.com/ip_location_api.php

4

veo que hay muchas respuestas, pero ninguno de ellos menciona https://freegeoip.net/

Tiene permitido hasta 15,000 queries per hour. Creo que eso es suficiente en la mayoría de los casos. De lo contrario, debe pensar en usar bases de datos locales desde MaxMind GeoIP.

Freegeoip es de código abierto y puede encontrar fuentes en github, impleméntelo localmente y elimine los límites de la consulta.

Además, el servicio proporciona latitud/longitud/zona horaria y otras cosas útiles.

4
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country")) 

obtendrá el código de país.

5

Usted puede obtener el país desde la dirección IP de este Código

echo file_get_contents('https://ipapi.co/8.8.8.8/country/'); 

Respuesta

US 

es un fiddle Aquí location API

. La respuesta es text cuando consulta un campo específico, p. country aquí. No necesita decodificación, simplemente conéctelo a su código.

P.S. Si desea todos los campos, p. https://ipapi.co/8.8.8.8/json/, la respuesta es JSON.

1

Instale y use PHP's GeoIP extension si puede. En Debian Lenny:

sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz 
sudo gunzip GeoLiteCity.dat.gz 
sudo mkdir -v /usr/share/GeoIP 
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat 

sudo apt-get install php5-geoip 
# or sudo apt-get install php-geoip for PHP7 

y luego probarlo en PHP:

$ip = $_SERVER['REMOTE_ADDR']; 
$country = geoip_country_name_by_name($ip); 
echo 'The current user is located in: ' . $country; 

devuelve:

The current user is located in: Cameroon 
0

Usted puede probar los servicios de https://www.geoip-db.com Proporcionan una solución JSON o JSONP-devolución de llamada .

<?php 

    $json = file_get_contents("https://www.geoip-db.com/json"); 
    $data = json_decode($json); 

    print $data->country_code . "<br>"; 
    print $data->country_name . "<br>"; 
    print $data->state . "<br>"; 
    print $data->city . "<br>"; 
    print $data->postal . "<br>"; 
    print $data->latitude . "<br>"; 
    print $data->longitude . "<br>"; 
    print $data->IPv4 . "<br>"; 

?> 
1

Puede utilizar https://ip-api.io/ para obtener el nombre del país, nombre de la ciudad, latitud y longitud. Es compatible con IPv6.

Como bonificación, indicará si la dirección IP es un nodo tor, un proxy público o un spammer.

código PHP:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118')); 
var_dump($result); 

Salida:

{ 
"ip": "64.30.228.118", 
"country_code": "US", 
"country_name": "United States", 
"region_code": "FL", 
"region_name": "Florida", 
"city": "Fort Lauderdale", 
"zip_code": "33309", 
"time_zone": "America/New_York", 
"latitude": 26.1882, 
"longitude": -80.1711, 
"metro_code": 528, 
"suspicious_factors": { 
"is_proxy": false, 
"is_tor_node": false, 
"is_spam": false, 
"is_suspicious": false 
} 
0

corro el servicio en IPLocate.io, que se puede enganchar en forma gratuita con una llamada fácil:

<?php 
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8'); 
$res = json_decode($res); 

echo $res->country; // United States 
echo $res->continent; // North America 
echo $res->latitude; // 37.751 
echo $res->longitude; // -97.822 

var_dump($res); 

El $res objeto contendrá sus campos de geolocalización como country, city, etc.

Consulte el docs para obtener más información.

0

Ipdata.co proporciona una API escalable para hacer esto. ¡Con 10 endpoints globales cada uno capaz de manejar solicitudes de> 800M diariamente!

También le brinda la organización, moneda, zona horaria, código de llamada, marca y datos de estado del nodo de salida Tor desde cualquier dirección IPv4 o IPv6.

en PHP

php > $ip = '8.8.8.8'; 
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}")); 
php > echo $details->region; 
California 
php > echo $details->city; 
Mountain View 
php > echo $details->country_name; 
United States 
php > echo $details->location; 
37.405991,-122.078514 

Negación

que construyeron este servicio.

Cuestiones relacionadas