Руководство по IP-геолокации в PHP
Получите страну, город и приблизительные координаты для одного IP-адреса в PHP.
Поиск IP-адреса в PHP
Запрос принимает один адрес IPv4 или IPv6 и запрашивает JSON. Замените адрес из примера на тот, который нужно исследовать.
<?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);
}Требуется PHP с расширением cURL. Тайм-аут подключения составляет три секунды, а ограничение общей длительности запроса восемь секунд.
Чтение полей местоположения
location.country_code содержит двухбуквенный код страны; location.country содержит название страны. location.city может быть пустым, даже если страна известна. Считайте пустое значение неизвестным.
location.latitude и location.longitude содержат приблизительные координаты местоположения сети. Перед их отображением проверьте наличие пригодного названия местоположения; одни числовые координаты не подтверждают местоположение. Они не идентифицируют устройство или человека.
Чтобы получить адрес, с которого выполняется запрос, вызовите https://api.ipquery.io/?format=json. Запрос с сервера возвращает IP, с которого сервер устанавливает соединение; запрос из браузера возвращает видимый извне адрес его соединения.
Точность и безопасность
IP-геолокация оценивает местоположение сети, а не устройства. VPN, прокси, мобильные сети и шлюзы операторов могут приводить к определению адреса далеко от пользователя. Считайте отсутствующие значения неизвестными, а не заполняйте их догадками.
Если приложение читает X-Forwarded-For, доверяйте ему только тогда, когда его передаёт контролируемый вами прокси. Заголовки, переданные клиентом, можно подделать. Проверяйте адреса перед выполнением запросов и обрабатывайте тайм-ауты и ошибки HTTP отдельно от успешного результата.
Справочник API