如何根据某个知识产权获得国家?

有谁知道一个简单的方法来检索给定的IP地址的国家?最好采用ISO_3166-1格式?

0
额外 编辑
意见: 2
不要太依赖知识产权告诉你用户所在的国家:因为我为一家斯堪的纳维亚公司工作,尽管我们的办公室在苏格兰,我仍然看到瑞典的广告。
额外 作者 AAT,
确切地说 - 如果你想一想。有很多情况下,你似乎来自某个地方,但实际上来自其他地方。这一切都源于网络拓扑不必确认政治或地理边界的事实。 F.ex. VPN,无线,卫星等。
额外 作者 Phluks,

14 答案

Here's a nice free service with a public API: http://www.hostip.info/use.html

0
额外

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

他们有一个免费版本 GeoLite ,它不像付费版本那么准确,但是如果你只是在简单的事情之后,它可能已经足够好了。

0
额外
上面的GeoLite链接在我今天检查时得到了404。
额外 作者 Parag Magunia,
我们的地理位置api也可以正常工作: ip-api.io
额外 作者 Andrey E,
额外 作者 Manoj,

我不知道hostip.info网站有多准确。我刚刚浏览了该网站,报道说我的国家是加拿大。我在美国和我的办公室使用的ISP只在美国运营。它确实允许你纠正它的猜测,但如果你使用这个服务来跟踪国家的网站访问者,你将无法知道数据是否正确。当然,我只是一个数据点。我下载了GeoLite国家数据库,它只是一个.csv文件,我的IP地址被正确识别为US。

MaxMind产品线(付费或免费)的另一个好处是您拥有数据,您不会因为向另一个系统发起Web服务呼叫而受到性能影响。

0
额外
我在英国,它说我在巴西的里约热内卢:)
额外 作者 Mike,

The most accurate is Digital Elements NetAcuity...not free but you get what you pay for most of the time....Digital Element

0
额外

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

对于服务:

对于列表:

0
额外
一般来说,我在SO中看到过的最有用的答案之一。谢谢!
额外 作者 tzot,
您是否也许知道RIR是否也有更详细的信息,例如来自maxmind的geopipcity db,可用作开放数据?我确实看过,但找不到它
额外 作者 Jevado,

google's clientlocation returns (my example)

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

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

The API is pretty fast, with 10 global endpoints each able to handle >800M calls daily.

这是一个卷曲的例子;

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
    }
}?  
0
额外

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

如果您只是在国家/地区代码之后,则只需在网址中添加国家/地区即可:

$ 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

I've used the IP 8.8.8.8 in these examples, but if you want details for the user's IP just pass in $_SERVER['REMOTE_ADDR'] instead. More details are available at http://ipinfo.io/developers

0
额外

You can try the free 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;

PHP代码来查询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 . "
"; echo "Country_name: " . $country_name . "
"; // 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); } } ?>
0
额外

ipinfodb provides a free database and API for IP to country and vice versa. They use free data from MaxMind. The data gets updated every month, and it's a great free alternative with decent accuracy.

0
额外
比维护自己的数据库好得多。刚刚在一个非常晦涩的地方(泰国乌泰他尼)进行了测试,结果发现了。很棒的发现,谢谢!
额外 作者 Jannie Theunissen,

您可以使用为此问题提供的解决方案

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

0
额外

试试这个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];?>
0
额外

use the function ipToCountry($ip) from http://www.mmtutorialvault.com/php-ip-to-country-function/

0
额外

你可以使用这样做的web服务API:

see example of service: http://ip-api.com and usage: http://whatmyip.info
0
额外