有没有人知道检索给定IP地址的国家/地区的简单方法?最好是ISO_3166-1格式?
答案 0 :(得分:38)
有两种方法:使用Internet服务并使用某种本地列表(可能包含在库中)。你想要的将取决于你正在建设什么。
对于服务:
列表:
您可以通过从RIR下载列表来推广自己:
答案 1 :(得分:36)
很多人(包括我的公司)似乎都在使用MaxMind GeoIP。
他们有一个免费版本GeoLite,它不如付费版本准确,但如果你只是简单的事情,它可能已经足够了。
答案 2 :(得分:10)
这是一个使用公共API的免费服务: http://www.hostip.info/use.html
答案 3 :(得分:8)
ipinfodb为国家/地区提供免费的数据库和API,反之亦然。他们使用MaxMind的免费数据。数据每个月都会更新,这是一个很好的免费替代方案,具有良好的准确性。
答案 4 :(得分:5)
我不知道hostip.info网站有多准确。我刚刚访问该网站,并报告说我的国家是加拿大。我在美国和我办公室使用的ISP只在美国运营。它确实允许您更正它的猜测,但如果您使用此服务按国家/地区跟踪网站访问者,您将无法知道数据是否正确。当然,我只是一个数据点。我下载了GeoLite国家数据库,它只是一个.csv文件,我的IP地址被正确识别为美国。
MaxMind产品系列(付费或免费)的另一个好处是您拥有数据,不会因为向另一个系统调用Web服务而受到性能影响。
答案 5 :(得分:2)
最准确的是Digital Elements NetAcuity ...不是免费的,但是大部分时间都可以获得你付出的代价...... Digital Element
答案 6 :(得分:2)
google's clientlocation返回(my example)
latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
答案 7 :(得分:2)
您可以使用为this question提供的解决方案。
但它会返回2位数的国家/地区代码。
答案 8 :(得分:2)
试试这个PHP代码
<?php $ip = $_SERVER['REMOTE_ADDR'];
$json = file_get_contents("http://api.easyjquery.com/ips/?ip=".$ip."&full=true");
$json = json_decode($json,true);
$timezone = $json[localTimeZone];?>
答案 9 :(得分:2)
您可以使用我的服务http://ipinfo.io。 API返回有关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
}
如果您只是在国家/地区代码之后,您只需要在网址中添加/ country:
$ curl ipinfo.io/8.8.8.8/country
US
这是您可以使用的通用PHP函数:
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
我在这些示例中使用了IP 8.8.8.8,但如果您想要用户IP的详细信息,请转而使用$_SERVER['REMOTE_ADDR']
。有关详细信息,请访问http://ipinfo.io/developers
答案 10 :(得分:1)
使用http://www.mmtutorialvault.com/php-ip-to-country-function/
中的函数ipToCountry($ ip)答案 11 :(得分:1)
您可以使用Web服务API执行此操作,如:
see example of service: http://ip-api.com and usage: http://whatmyip.info
答案 12 :(得分:0)
请参阅ipdata.co,其中提供了来自IP地址的几个数据点。
API速度非常快,每个终端有10个终端可以处理每天800万次的呼叫。
这是一个卷曲的例子;
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
}
}⏎
答案 13 :(得分:0)
您可以尝试免费IP2Location LITE database
在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;
导入数据
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;
用于查询MySQL的PHP代码
<?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);
}
}
?>
答案 14 :(得分:-1)
您可以尝试使用https://astroip.co,它是我建立的新的Geolocation API,它将地理数据与其他有用的数据点(例如货币,时区,ASN数据和安全性)一起公开。
这是json响应的示例:
curl https://api.astroip.co/70.163.7.1
{
"status_code": 200,
"geo": {
"is_metric": false,
"is_eu": false,
"longitude": -77.0924,
"latitude": 38.7591,
"country_geo_id": 6252001,
"zip_code": "22306",
"city": "Alexandria",
"region_code": "VA",
"region_name": "Virginia",
"continent_code": "NA",
"continent_name": "North America",
"capital": "Washington",
"country_name": "United States",
"country_code": "US"
},
"asn": {
"route": "70.160.0.0/14",
"type": "isp",
"domain": "cox.net",
"organization": "ASN-CXA-ALL-CCI-22773-RDC",
"asn": "AS22773"
},
"currency": {
"native_name": "US Dollar",
"code": "USD",
"name": "US Dollar",
"symbol": "$"
},
"timezone": {
"is_dst": false,
"gmt_offset": -18000,
"date_time": "2020-12-05T17:04:48-05:00",
"microsoft_name": "Eastern Standard Time",
"iana_name": "America/New_York"
},
"security": {
"is_crawler": false,
"is_proxy": false,
"is_tor": false,
"tor_insights": null,
"proxy_insights": null,
"crawler_insights": null
},
"error": null,
"ip_type": "ipv4",
"ip": "70.163.7.1"
}