Apakah ada yang tahu cara sederhana untuk mengambil negara untuk Alamat IP tertentu? Sebaiknya di ISO_3166-1 format?
Ada dua pendekatan: menggunakan layanan Internet dan menggunakan beberapa jenis dari daftar lokal (mungkin dibungkus di perpustakaan). Apa yang anda inginkan akan tergantung pada apa yang anda sedang membangun.
Untuk layanan:
Untuk daftar:
Format didokumentasikan di README ini
Banyak orang (termasuk perusahaan saya) tampaknya menggunakan MaxMind GeoIP.
Mereka memiliki versi gratis GeoLite yang tidak akurat seperti versi berbayar, tetapi jika anda're hanya setelah sesuatu yang sederhana, mungkin akan cukup baik.
ipinfodb menyediakan database gratis dan API untuk IP untuk negara dan sebaliknya. Mereka menggunakan data gratis dari MaxMind. Data akan diperbarui setiap bulan, dan itu's gratis alternatif dengan layak akurasi.
Saya don't tahu bagaimana akurat yang hostip.info lokasi hotel ini. Aku hanya mengunjungi situs tersebut, dan melaporkan bahwa negara saya adalah Kanada. I'm di AS dan ISP yang kantor saya menggunakan hanya beroperasi dari KAMI. Hal ini memungkinkan anda untuk memperbaiki itu's menebak, tetapi jika anda menggunakan layanan ini untuk melacak situs web vistors oleh negara, anda'll tidak memiliki cara untuk mengetahui apakah data tersebut sudah benar. Tentu saja, aku'm hanya satu titik data. Saya download GeoLite Negara database, yang hanya .file csv, dan alamat IP saya telah diidentifikasi dengan benar sebagai KITA.
Manfaat lain dari MaxMind lini produk (berbayar atau gratis) adalah bahwa anda memiliki data, anda don't dikenakan kinerja memukul membuat web service panggilan ke sistem lain.
Anda dapat menggunakan solusi yang disediakan untuk pertanyaan.
Tapi itu kembali 2 digit kode negara.
Anda dapat menggunakan layanan saya, http://ipinfo.io untuk ini. API kembali sejumlah besar rincian yang berbeda tentang sebuah alamat IP:
$ curl ipinfo.io/8.8.8.8
{
"ip": "8.8.8.8",
"hostname": "google-public-dns-a.google.com",
"loc": "37.385999999999996,-122.0838",
"org": "AS15169 Google Inc.",
"city": "Mountain View",
"region": "CA",
"country": "US",
"phone": 650
}
Jika anda're hanya setelah kode negara anda hanya perlu menambahkan /negara ke URL:
$ curl ipinfo.io/8.8.8.8/country
US
Berikut ini's generik fungsi PHP yang bisa anda gunakan:
function ip_details($ip) {
$json = file_get_contents("http://ipinfo.io/{$ip}");
$details = json_decode($json);
return $details;
}
$details = ip_details("8.8.8.8");
echo $details->city; // => Mountain View
echo $details->country; // => US
echo $details->org; // => AS15169 Google Inc.
echo $details->hostname; // => google-public-dns-a.google.com
I've digunakan IP 8.8.8.8 dalam contoh ini, tetapi jika anda ingin rincian untuk pengguna's IP hanya lulus dalam $_SERVER['REMOTE_ADDR']
sebagai gantinya. Rincian lebih lanjut tersedia di http://ipinfo.io/developers
anda dapat menggunakan layanan web API's yang melakukan pekerjaan ini seperti:
see example of service: http://ip-api.com and usage: http://whatmyip.info
Anda dapat mencoba gratis IP2Location LITE database
Untuk membuat tabel di MySQL
CREATE DATABASE ip2location;
USE ip2location;
CREATE TABLE `ip2location_db1`(
`ip_from` INT(10) UNSIGNED,
`ip_to` INT(10) UNSIGNED,
`country_code` CHAR(2),
`country_name` VARCHAR(64),
INDEX `idx_ip_to` (`ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Untuk mengimpor data
LOAD DATA LOCAL
INFILE 'IP2LOCATION-LITE-DB1.CSV'
INTO TABLE
`ip2location_db1`
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
IGNORE 0 LINES;
Kode PHP untuk query MySQL
<?php
// Replace this MYSQL server variables with actual configuration
$mysql_server = "mysql_server.com";
$mysql_user_name = "UserName";
$mysql_user_pass = "Password";
// Retrieve visitor IP address from server variable REMOTE_ADDR
$ipaddress = $_SERVER["REMOTE_ADDR"];
// Convert IP address to IP number for querying database
$ipno = Dot2LongIP($ipaddress);
// Connect to the database server
$link = mysql_connect($mysql_server, $mysql_user_name, $mysql_user_pass) or die("Could not connect to MySQL database");
// Connect to the IP2Location database
mysql_select_db("ip2location") or die("Could not select database");
// SQL query string to match the recordset that the IP number fall between the valid range
$query = "SELECT * FROM ip2location_db1 WHERE $ipno <= ip_to LIMIT 1";
// Execute SQL query
$result = mysql_query($query) or die("IP2Location Query Failed");
// Retrieve the recordset (only one)
$row = mysql_fetch_object($result);
// Keep the country information into two different variables
$country_code = $row->country_code;
$country_name = $row->country_name;
echo "Country_code: " . $country_code . "<br/>";
echo "Country_name: " . $country_name . "<br />";
// Free recordset and close database connection
mysql_free_result($result);
mysql_close($link);
// Function to convert IP address (xxx.xxx.xxx.xxx) to IP number (0 to 256^4-1)
function Dot2LongIP ($IPaddr) {
if ($IPaddr == "")
{
return 0;
} else {
$ips = explode(".", $IPaddr);
return ($ips[3] + $ips[2] * 256 + $ips[1] * 256 * 256 + $ips[0] * 256 * 256 * 256);
}
}
?>
Lihat ipdata.co yang memberikan anda beberapa poin data dari sebuah alamat ip.
API cukup cepat, dengan 10 global endpoint masing-masing mampu menangani >800M panggilan sehari-hari.
Berikut ini's curl contoh;
curl https://api.ipdata.co/78.8.53.5
{
"ip": "78.8.53.5",
"city": "G\u0142og\u00f3w",
"region": "Lower Silesia",
"region_code": "DS",
"country_name": "Poland",
"country_code": "PL",
"continent_name": "Europe",
"continent_code": "EU",
"latitude": 51.6461,
"longitude": 16.1678,
"asn": "AS12741",
"organisation": "Netia SA",
"postal": "67-200",
"currency": "PLN",
"currency_symbol": "z\u0142",
"calling_code": "48",
"flag": "https://ipdata.co/flags/pl.png",
"emoji_flag": "\ud83c\uddf5\ud83c\uddf1",
"time_zone": "Europe/Warsaw",
"is_eu": true,
"suspicious_factors": {
"is_tor": false
}
}⏎