61

有谁知道从给定 IP 地址检索国家/地区的任何简单方法,最好是 ISO_3166-1 格式?

4

15 回答 15

41

有两种方法:使用 Internet 服务和使用某种本地列表(可能包含在库中)。你想要什么取决于你正在建造什么。

对于服务:

对于列表:

于 2008-09-15T19:45:33.067 回答
38

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

他们有一个免费版本的GeoLite,它不如付费版本准确,但如果你只是追求简单的东西,它可能就足够了。

于 2008-08-04T06:26:22.370 回答
11

这是一个带有公共 API 的不错的免费服务:http: //www.hostip.info/use.html

于 2008-08-04T05:21:59.660 回答
9

ipinfodb为国家/地区的 IP 提供免费的数据库和 API,反之亦然。他们使用 MaxMind 的免费数据。数据每个月都会更新,它是一个很好的免费替代品,准确度不错。

于 2010-01-13T13:13:54.450 回答
6

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

MaxMind 产品线(付费或免费)的另一个好处是您拥有数据,不会因向另一个系统调用 Web 服务而导致性能下降。

于 2008-08-04T14:02:14.493 回答
3

最准确的是Digital Elements NetAcuity。它不是免费的,但您大部分时间都能得到您所支付的费用。

于 2008-09-27T03:04:41.713 回答
3

谷歌的客户端位置返回(我的例子

latlng = new google.maps.LatLng(google.loader.ClientLocation.latitude, google.loader.ClientLocation.longitude);
location = "IP location: " + getFormattedLocation();
document.getElementById("location").innerHTML = location;
于 2010-01-13T13:25:21.400 回答
3

您可以使用为这个问题提供的解决方案。

但它返回一个 2 位数的国家代码。

于 2011-10-19T14:04:01.440 回答
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];?>
于 2012-07-30T08:07:35.403 回答
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
}

如果您只在国家代码之后,您只需将 /country 添加到 URL:

$ 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

于 2014-08-26T04:49:49.810 回答
2

使用来自http://www.mmtutorialvault.com/php-ip-to-country-function/的函数 ipToCountry($ip)

于 2013-06-27T17:54:01.927 回答
2

您可以使用执行此工作的 Web 服务 API,例如:

see example of service: http://ip-api.com and usage: http://whatmyip.info
于 2014-05-26T14:59:31.140 回答
1

请参阅ipdata.co,它为您提供来自 IP 地址的多个数据点。

API 非常快,有 10 个全局端点,每个端点每天能够处理超过 8 亿次调用。

这是一个卷曲示例:

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
    }
}⏎  
于 2018-02-18T19:05:11.513 回答
1

您可以尝试免费的IP2Location LITE 数据库

在 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);
 }
}
?>
于 2018-02-27T05:32:26.040 回答
-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"
}
于 2020-12-05T19:30:21.047 回答