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?
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?
Observe las funciones de GeoIP en "Otras extensiones básicas". http://php.net/manual/en/book.geoip.php
No están * realmente * incorporados. http://www.php.net/manual/en/geoip.requirements.php –
Me encuentro corregido. –
Corrígelo, entonces. –
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.
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". –
https://ipdata.co pertenece a esa lista :) – Jonathan
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
");
Esto, es una excelente manera de obtener el país desde una dirección IP. – Devator
no entiendo cómo las personas obtienen los nombres de ciudades/países localizados, ya que geolite ofrece solo un par de idiomas – user151496
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. –
utilizar el widget www.feedsalive.com, para obtener la información de campo & última información de la página también.
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.
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
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 –
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
}
¿Por qué se ha rechazado este voto dos veces? –
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
Aquí hay un ejemplo usando http://www.geoplugin.net/json.gp
$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
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.
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
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.
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))
obtendrá el código de país.
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
.
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
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>";
?>
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
}
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.
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.
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
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
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