92

理想情况下,我正在尝试组合一个 PHP 脚本,我可以从任何 Web 浏览器查询它,它会返回访问 PHP 脚本的 IP 地址所在的国家/地区。

这是可能的还是有更好的解决方案?

4

17 回答 17

88

您可以使用免费、简单的 API,例如:

哪个看起来最值得信赖取决于您:)

否则,有些脚本基于您服务器上的本地数据库。但是,数据库数据需要定期更新。看看这个:

编辑: 当然,根据您的项目,您可能希望查看HTML5 位置功能。您还不能在 Internet Explorer 上使用它们(IE9 将支持它,还有很长的路要走),但如果您的受众主要使用移动设备或使用 Safari/Firefox,那么绝对值得一看!

获得坐标后,您可以将它们反向地理编码为国家/地区代码。同样有这样的 API:

更新,2013 年 4 月
今天我建议使用Geocoder,这是一个 PHP 库,它可以非常轻松地对 IP 地址和邮政地址数据进行地理编码。

***更新,2016 年 9 月
由于 Google 的隐私政策发生了变化,如果您的服务器没有 HTPPS 证书或用户不允许您查看他的位置,您将无法使用 HTML5 Geolocation API。所以现在您可以使用用户的 IP 并签入 PHP 或获取 HTTPS 证书。

于 2010-09-06T08:47:37.177 回答
56

有各种 Web API 可以为您执行此操作。这是使用我的服务http://ipinfo.io的示例:

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://ipinfo.io/{$ip}"));
echo $details->country; // -> "US"

Web API 是一种快速简便的解决方案,但如果您需要进行大量查找,那么在您自己的机器上拥有一个 IP -> 国家/地区数据库是一个更好的解决方案。MaxMind 提供了一个免费的数据库,您可以将其与各种 PHP 库(包括GeoIP )一起使用。

于 2013-07-12T06:00:58.267 回答
26

您可以从 MaxMind 下载 ip-tables:

http://www.maxmind.com/app/geolite

将 CSV 导入数据库(确保为 ip_long_from + ip_long_to 创建索引)。然后你可以简单地做:

$iplong = ip2long($_SERVER['REMOTE_ADDR']);

// should use mysqli with prepared statements etc, but just an example
mysql_query("
    SELECT country
    FROM ip_table
    WHERE $iplong BETWEEN ip_long_from AND ip_long_to
    LIMIT 1
");
于 2012-05-21T07:55:19.963 回答
10

这是使用http://www.geoplugin.net/json.gp的示例

$ip = $_SERVER['REMOTE_ADDR'];
$details = json_decode(file_get_contents("http://www.geoplugin.net/json.gp?ip={$ip}"));
echo $details;
于 2014-11-27T08:09:12.567 回答
6

您可以使用此位置 API从 IP 地址获取国家/地区

代码

    echo file_get_contents('https://ipapi.co/8.8.8.8/country/');

回复

   US 

这是一个小提琴。响应是text当您查询特定字段时,例如country此处。无需解码,只需将其插入您的代码即可。

PS如果你想要所有的字段,例如https://ipapi.co/8.8.8.8/json/,响应是JSON

于 2016-10-02T08:33:17.143 回答
5

查看“其他基本扩展”下的 GeoIP 功能。 http://php.net/manual/en/book.geoip.php

于 2010-09-06T08:32:58.943 回答
5

我看到有很多答案,但没有一个提到https://freegeoip.net/

您最多可以15,000 queries per hour. 我认为在大多数情况下这已经足够了。否则,您应该考虑使用MaxMind GeoIP的本地数据库。

Freegeoip 是开源的,你可以在github上找到源代码,在本地部署它并摆脱查询限制。

此外,服务提供纬度/经度/时区和其他有用的东西。

于 2015-07-14T15:16:32.490 回答
5
$country_code = trim(file_get_contents("http://ipinfo.io/{$ip_address}/country"))

会给你国家代码。

于 2015-07-20T00:23:16.260 回答
2

这是另一个用于地理定位请求的免费 API:http: //geoip.nekudo.com

响应采用 JSON 格式。此外,如果您需要设置自己的 API,可以在 github 上找到 API 源代码。

于 2014-12-16T16:42:06.463 回答
2

如果可以的话,安装和使用PHP 的 GeoIP 扩展。在 debian lenny 上:

sudo wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
sudo gunzip GeoLiteCity.dat.gz
sudo mkdir -v /usr/share/GeoIP
sudo mv -v GeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat

sudo apt-get install php5-geoip
# or sudo apt-get install php-geoip for PHP7

然后在 PHP 中尝试:

$ip = $_SERVER['REMOTE_ADDR'];
$country = geoip_country_name_by_name($ip);
echo 'The current user is located in: ' . $country;

返回:

The current user is located in: Cameroon
于 2016-10-06T17:29:28.420 回答
1

我发现这篇博文很有帮助。它拯救了我的一天。 http://www.techsirius.com/2014/05/simple-geo-tracking-system.html

基本上,您需要安装 IP 数据库表,然后对 IP 进行 mysql 查询以获取位置。

<?php
include 'config.php';
mysql_connect(DB_HOST, DB_USER, DB_PASSWORD) OR die(mysql_error());
mysql_select_db(DB_NAME) OR die(mysql_error());
$ip =  $_SERVER['REMOTE_ADDR'];
$long = sprintf('%u', ip2long($ip));
$sql = "SELECT * FROM `geo_ips` WHERE '$long' BETWEEN `ip_start` AND `ip_end`";
$result = mysql_query($sql) OR die(mysql_error());
$ip_detail = mysql_fetch_assoc($result);
if($ip_detail){
    echo $ip_detail['country']."', '".$ip_detail['state']."', '".$ip_detail['city'];
}
else{
    //Something wrong with IP
}
于 2014-06-05T09:53:02.047 回答
1

如果您需要一个良好且更新的数据库,以获得更高的性能并且不从您的网站请求外部服务,这里有一个下载更新和准确数据库的好地方。

我之所以推荐这个,是因为根据我的经验,它工作得很好,甚至包括我的 IP 的城市和国家/地区位置,大多数其他数据库/api 都未能包括/报告我的位置,但这项服务将我引导到这个数据库。
(当我测试时,我的 ip 位置来自“伊朗”的“拉什特”市,ip 为:2.187.21.235等于45815275

因此,如果您不确定哪种服务更准确,我建议您使用这些服务:

数据库: http://lite.ip2location.com/databases

API服务: http://ipinfodb.com/ip_location_api.php

于 2015-06-09T14:35:45.363 回答
1

You can try the services of https://www.geoip-db.com They provide a JSON or JSONP-callback solution.

<?php

    $json = file_get_contents("https://www.geoip-db.com/json");
    $data = json_decode($json);

    print $data->country_code . "<br>";
    print $data->country_name . "<br>";
    print $data->state . "<br>";
    print $data->city . "<br>";
    print $data->postal . "<br>";
    print $data->latitude . "<br>";
    print $data->longitude . "<br>";
    print $data->IPv4 . "<br>";

?>
于 2016-10-13T14:46:42.120 回答
1

我在IPLocate.io运行该服务,您可以通过一个简单的电话免费连接:

<?php
$res = file_get_contents('https://www.iplocate.io/api/lookup/8.8.8.8');
$res = json_decode($res);

echo $res->country; // United States
echo $res->continent; // North America
echo $res->latitude; // 37.751
echo $res->longitude; // -97.822

var_dump($res);

$res对象将包含您的地理位置字段,如country,city等。

查看文档以获取更多信息。

于 2017-11-15T00:32:12.343 回答
1

您可以使用https://ip-api.io/获取国家名称、城市名称、纬度和经度。它支持 IPv6。

作为奖励,它会告诉 IP 地址是一个 Tor 节点、公共代理还是垃圾邮件发送者。

php代码:

$result = json_decode(file_get_contents('http://ip-api.io/json/64.30.228.118'));
var_dump($result);

输出:

{
"ip": "64.30.228.118",
"country_code": "US",
"country_name": "United States",
"region_code": "FL",
"region_name": "Florida",
"city": "Fort Lauderdale",
"zip_code": "33309",
"time_zone": "America/New_York",
"latitude": 26.1882,
"longitude": -80.1711,
"metro_code": 528,
"suspicious_factors": {
"is_proxy": false,
"is_tor_node": false,
"is_spam": false,
"is_suspicious": false
}
于 2017-07-29T14:02:23.257 回答
1

Ipdata.co提供了一个可扩展的 API 来执行此操作。拥有 10 个全球端点,每个端点每天都能处理超过 8 亿个请求!

它还为您提供来自任何 IPv4 或 IPv6 地址的组织、货币、时区、调用代码、标志和 Tor 退出节点状态数据。

在php中

php > $ip = '8.8.8.8';
php > $details = json_decode(file_get_contents("https://api.ipdata.co/{$ip}"));
php > echo $details->region;
California
php > echo $details->city;
Mountain View
php > echo $details->country_name;
United States
php > echo $details->location;
37.405991,-122.078514

免责声明

我建立了这项服务。

于 2018-02-18T11:50:23.127 回答
0

使用小部件www.feedsalive.com,获取国家信息和最后一页信息。

于 2012-06-07T17:22:51.957 回答