如何根据特定IP获取国家信息?

61

有没有简单的方法从给定的IP地址中检索国家,最好是以ISO_3166-1格式?


8
不要过度依赖IP地址来判断用户所在的国家/地区:我所在的公司是一家斯堪的纳维亚公司,但我们的办公室却在苏格兰,因此我经常看到用瑞典语写的广告。请注意,这并不代表该广告面向的是瑞典用户。 - AAT
确切地说,如果你仔细想想的话,有很多情况下你可能看起来来自某个地方,但实际上来自另一个地方。这都是因为网络拓扑结构不必遵循政治或地理边界所致。例如,VPN、无线、卫星等等。 - Phluks
15个回答

42

有两种方法:使用互联网服务和使用某种本地列表(可能包装在库中)。您想要的取决于您正在构建什么。

对于服务:

对于列表:


1
我在SO上看到的最有用的答案之一。谢谢! - tzot
你知道RIRs是否也有更详细的信息,例如来自MaxMind的地理位置数据库,作为开放数据可用吗?我查过了,但没有找到。 - Jevado
以防万一... https://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest - fcm

38

很多人(包括我所在公司)似乎使用MaxMind GeoIP。

他们有一个免费版本GeoLite,虽然不如付费版精确,但如果你只需要简单的东西,它可能已经足够了。


2
今天我检查了上面的GeoLite链接,结果显示404。 - pmagunia

11

9

ipinfodb 提供了一个免费的 IP 地址和国家互相转换的数据库和 API。他们使用来自 MaxMind 的免费数据。该数据每月更新一次,是一个具有相当准确度的不错的免费替代品。


比维护自己的数据库要好得多。我刚在一个非常偏远的地方(泰国乌泰他尼)测试了一下,结果非常准确。这是个很好的发现,谢谢! - Jannie Theunissen

6

我不清楚http://hostip.info网站的准确性。我刚访问该网站,它报告说我的国家是加拿大。但我在美国,我的办公室使用的ISP仅在美国运营。它确实允许您更正其猜测,但如果您使用此服务来跟踪网站访问者的国家,则无法确定数据是否正确。当然,我只是一个数据点。我下载了GeoLite国家数据库,它只是一个.csv文件,并且我的IP地址被正确地识别为美国。

MaxMind产品系列(付费或免费)的另一个好处是,您拥有数据,而不会因为调用另一个系统的Web服务而产生性能损耗。


我在英国,但它显示我在巴西里约热内卢 :) - Mike

3

谷歌的客户端定位返回 (我的示例)

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;

3
尝试这段 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];?>

3
您可以使用我的服务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
}

如果您只需要国家代码,您只需在URL后添加/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


3
最准确的是Digital Elements NetAcuity。虽然不是免费的,但大多数情况下你会得到你所付出的价值。

3
您可以使用为这个问题提供的解决方案,但它会返回一个两位数的国家代码。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接