Guía de geolocalización IP en PHP
Obtén el país, la ciudad y las coordenadas aproximadas de una dirección IP en PHP.
Consultar una dirección IP en PHP
La solicitud acepta una dirección IPv4 o IPv6 y pide JSON. Sustituye la dirección del ejemplo por la que necesitas inspeccionar.
<?php
$ip = '8.8.8.8'; // Replace with a validated IPv4 or IPv6 address.
if (!filter_var($ip, FILTER_VALIDATE_IP)) {
throw new InvalidArgumentException('Invalid IP address');
}
$url = 'https://api.ipquery.io/' . rawurlencode($ip) . '?format=json';
$handle = curl_init($url);
curl_setopt_array($handle, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_CONNECTTIMEOUT => 3,
CURLOPT_TIMEOUT => 8,
]);
$body = curl_exec($handle);
$status = curl_getinfo($handle, CURLINFO_HTTP_CODE);
if ($body === false) {
$error = curl_error($handle);
throw new RuntimeException('IP lookup failed: ' . $error);
}
if ($status !== 200) {
throw new RuntimeException('IPQuery returned HTTP ' . $status);
}
$data = json_decode($body, true, 512, JSON_THROW_ON_ERROR);
if (($data['ip'] ?? null) !== $ip || !isset($data['location']) || !is_array($data['location'])) {
throw new RuntimeException('Unexpected IPQuery response');
}
$location = $data['location'];
$countryCode = strtoupper(trim((string) ($location['country_code'] ?? '')));
$city = trim((string) ($location['city'] ?? ''));
echo 'Country code: ' . ($countryCode ?: 'Unknown') . PHP_EOL;
echo 'City: ' . ($city ?: 'Unknown') . PHP_EOL;
// Coordinates describe an approximate network location, not the user.
$latitude = $location['latitude'] ?? null;
$longitude = $location['longitude'] ?? null;
if (preg_match('/^[A-Z]{2}$/', $countryCode) &&
!in_array($countryCode, ['XX', 'ZZ'], true) &&
is_numeric($latitude) && is_numeric($longitude)) {
printf('Approximate coordinates: %.5f, %.5f%s', $latitude, $longitude, PHP_EOL);
}Requiere PHP con la extensión cURL. El tiempo de espera de conexión es de tres segundos y el límite total de la solicitud es de ocho segundos.
Leer los campos de ubicación
location.country_code es el código de país de dos letras; location.country es el nombre del país. location.city puede estar vacío aunque se conozca el país. Conserva los valores vacíos como desconocidos.
location.latitude y location.longitude son coordenadas aproximadas de la ubicación de la red. Comprueba que haya una etiqueta de ubicación válida antes de mostrarlas; las coordenadas numéricas por sí solas no establecen una ubicación. No identifican un dispositivo ni a una persona.
Para obtener la dirección desde la que se realiza la solicitud, llama a https://api.ipquery.io/?format=json. Una solicitud desde un servidor devuelve la IP con la que ese servidor se conecta; una solicitud desde un navegador devuelve la dirección visible de su conexión.
Precisión y seguridad
La geolocalización IP es una estimación de la ubicación de la red, no de un dispositivo. Las VPN, los proxies, las redes móviles y las pasarelas de los operadores pueden situar la dirección lejos del usuario. Trata los valores ausentes como desconocidos en lugar de rellenarlos con una suposición.
Si tu aplicación lee X-Forwarded-For, confía en él solo cuando lo proporcione un proxy que controles. Las cabeceras proporcionadas por el cliente pueden falsificarse. Valida las direcciones antes de realizar consultas y gestiona los tiempos de espera y los errores HTTP por separado de los resultados correctos.
Referencia de la API