Przewodnik po geolokalizacji IP w PHP

Pobierz kraj, miasto i przybliżone współrzędne jednego adresu IP w PHP.

Sprawdzanie adresu IP w PHP

Żądanie przyjmuje jeden adres IPv4 lub IPv6 i żąda odpowiedzi JSON. Zastąp adres z przykładu adresem, który chcesz zbadać.

Żądanie lokalizacji pojedynczego IP
<?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);
}

Wymaga PHP z rozszerzeniem cURL. Limit czasu połączenia wynosi trzy sekundy, a limit całkowitego czasu żądania osiem sekund.

Odczyt pól lokalizacji

location.country_code to dwuliterowy kod kraju; location.country to nazwa kraju. location.city może być puste nawet wtedy, gdy kraj jest znany. Traktuj pustą wartość jako nieznaną.

location.latitude i location.longitude to przybliżone współrzędne lokalizacji sieci. Przed ich wyświetleniem sprawdź, czy dostępna jest użyteczna nazwa lokalizacji; same współrzędne liczbowe nie potwierdzają lokalizacji. Nie identyfikują urządzenia ani osoby.

Aby uzyskać adres, z którego wysyłane jest żądanie, wywołaj https://api.ipquery.io/?format=json. Żądanie z serwera zwraca IP, z którego serwer nawiązuje połączenie; żądanie z przeglądarki zwraca widoczny adres jej połączenia.

Wszystkie pola odpowiedzi

Dokładność i bezpieczeństwo

Geolokalizacja IP jest oszacowaniem lokalizacji sieci, a nie urządzenia. VPN-y, proxy, sieci komórkowe i bramy operatorów mogą powodować przypisanie adresowi lokalizacji odległej od użytkownika. Traktuj brakujące wartości jako nieznane zamiast uzupełniać je domysłami.

Jeśli aplikacja odczytuje X-Forwarded-For, ufaj temu nagłówkowi tylko wtedy, gdy dostarcza go kontrolowany przez Ciebie serwer proxy. Nagłówki przesyłane przez klienta mogą być sfałszowane. Waliduj adresy przed wysłaniem zapytań i obsługuj limity czasu oraz błędy HTTP oddzielnie od poprawnego wyniku.

Dokumentacja referencyjna API

Dostęp do pełnych list.

W sprawie cen lub dostępu do pełnych list napisz na contact@ipquery.io.

Wybrana lista
Wybrane rekordy
Rekordy na tej liście