Panduan geolokasi IP dengan PHP

Dapatkan negara, kota, dan perkiraan koordinat untuk satu alamat IP dengan PHP.

Mencari alamat IP dengan PHP

Permintaan menerima satu alamat IPv4 atau IPv6 dan meminta JSON. Ganti alamat contoh dengan alamat yang perlu diperiksa.

Permintaan lokasi untuk satu 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);
}

Memerlukan PHP dengan ekstensi cURL. Batas waktu koneksi adalah tiga detik dan batas waktu keseluruhan permintaan adalah delapan detik.

Membaca kolom lokasi

location.country_code adalah kode negara dua huruf; location.country adalah nama negara. location.city dapat kosong meskipun negaranya diketahui. Tetap perlakukan nilai kosong sebagai tidak diketahui.

location.latitude dan location.longitude adalah perkiraan koordinat lokasi jaringan. Pastikan ada nama lokasi yang dapat digunakan sebelum menampilkannya; koordinat numerik saja tidak memastikan suatu lokasi. Koordinat tersebut tidak mengidentifikasi perangkat atau orang.

Untuk mendapatkan alamat asal permintaan, panggil https://api.ipquery.io/?format=json. Permintaan dari server mengembalikan IP yang digunakan server untuk terhubung; permintaan dari browser mengembalikan alamat koneksinya yang terlihat dari luar.

Semua kolom respons

Akurasi dan keamanan

Geolokasi IP merupakan perkiraan lokasi jaringan, bukan lokasi perangkat. VPN, proxy, jaringan seluler, dan gateway operator dapat menempatkan alamat jauh dari pengguna. Perlakukan nilai yang tidak tersedia sebagai tidak diketahui, bukan mengisinya dengan tebakan.

Jika aplikasi membaca X-Forwarded-For, percayai nilainya hanya jika diberikan oleh proxy yang Anda kendalikan. Header yang diberikan klien dapat dipalsukan. Validasi alamat sebelum melakukan permintaan pencarian dan tangani batas waktu serta kesalahan HTTP secara terpisah dari hasil yang berhasil.

Referensi API

Akses daftar lengkap.

Untuk harga atau akses daftar lengkap, kirim email ke contact@ipquery.io.

Daftar terpilih
Rekaman terpilih
Rekaman dalam daftar ini