获取用户当前位置

Posted

技术标签:

【中文标题】获取用户当前位置【英文标题】:Get user's current location 【发布时间】:2011-07-20 21:34:05 【问题描述】:

如何根据IP判断用户当前位置(我猜是这样)。

【问题讨论】:

【参考方案1】:
<?php
$user_ip = getenv('REMOTE_ADDR');
$geo = unserialize(file_get_contents("http://www.geoplugin.net/php.gp?ip=$user_ip"));
$country = $geo["geoplugin_countryName"];
$city = $geo["geoplugin_city"];
?>

【讨论】:

Geoplugin 不是最好的平台。它限制为每分钟 120 个动作。它对我有用,但最近它开始对来自我的服务器的所有请求显示 403。谁知道为什么。 (我没有在一分钟内建立那 120 个连接) 对这些限制毫无用处。【参考方案2】:

已编辑

把freegeoip.net改成ipinfo.io

<?php    

function get_client_ip()

    $ipaddress = '';
    if (isset($_SERVER['HTTP_CLIENT_IP'])) 
        $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
     else if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
        $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
     else if (isset($_SERVER['HTTP_X_FORWARDED'])) 
        $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
     else if (isset($_SERVER['HTTP_FORWARDED_FOR'])) 
        $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
     else if (isset($_SERVER['HTTP_FORWARDED'])) 
        $ipaddress = $_SERVER['HTTP_FORWARDED'];
     else if (isset($_SERVER['REMOTE_ADDR'])) 
        $ipaddress = $_SERVER['REMOTE_ADDR'];
     else 
        $ipaddress = 'UNKNOWN';
    

    return $ipaddress;

$PublicIP = get_client_ip();
$json     = file_get_contents("http://ipinfo.io/$PublicIP/geo");
$json     = json_decode($json, true);
$country  = $json['country'];
$region   = $json['region'];
$city     = $json['city'];
?>

【讨论】:

虽然此代码可能会回答问题,但提供有关此代码为何和/或如何回答问题的额外上下文可提高其长期价值。 本地主机服务器有解决方法吗?我的 IP 地址一直显示为 ::1 @vince Localhost 总是返回 ::1 ip 地址 deprecation_message:“此 API 端点已弃用,将于 2018 年 7 月 1 日停止工作。有关详细信息,请访问:github.com/apilayer/freegeoip#readme”, 检查所有转发的ip有什么必要?我认为只需要检查if(isset(HTTP_X_FORWARDED_FOR))【参考方案3】:
<?php
$query = @unserialize (file_get_contents('http://ip-api.com/php/'));
if ($query && $query['status'] == 'success') 
echo 'Hey user from ' . $query['country'] . ', ' . $query['city'] . '!';

foreach ($query as $data) 
    echo $data . "<br>";

?>

使用此源尝试此代码。它有效!

【讨论】:

做或不做。没有“尝试”。 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度> 【参考方案4】:

使用hostip.info 服务试试这个代码:

$country=file_get_contents('http://api.hostip.info/get_html.php?ip=');
echo $country;

// Reformat the data returned (Keep only country and country abbr.)
$only_country=explode (" ", $country);

echo "Country : ".$only_country[1]." ".substr($only_country[2],0,4);

【讨论】:

您可以使用 json 作为返回,而不是爆炸返回。 api.hostip.info/get_json.php $json_string = 'api.hostip.info/…; $jsondata = file_get_contents($json_string); $obj = json_decode($jsondata, true); 此站点不再可用。【参考方案5】:

MaxMind GeoIP 服务很好。他们还提供免费的城市级查询服务。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案6】:

您可能想查看位于PHPClasses 的GeoIP Country Whois Locator。

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案7】:

由于PHP依赖服务器,无法提供实时定位,只能提供静态定位,最好避免依赖JS定位,而不是使用php。但是需要将js数据发布到php,以便在服务器上轻松编程

【讨论】:

【参考方案8】:

IP 为您提供了一个非常不可靠的位置,如果最初获取位置并不重要,您可以在加载时使用 JS 对位置进行 Ajax。 (此外,用户需要授予您访问它的权限。)

Html5 Geolocation

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。【参考方案9】:

旧的 freegeoip API 现已弃用,将于 2018 年 7 月 1 日停用。

新 API 来自 https://ipstack.com。您必须在 ipstack 中创建帐户。然后您可以使用 API url 中的访问密钥。

$url = "http://api.ipstack.com/122.167.180.20?access_key=ACCESS_KEY&format=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXYPORT, 3128);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$response = curl_exec($ch);
curl_close($ch);
$response = json_decode($response);
$city  = $response->city; //You can get all the details like longitude,latitude from the $response .

欲了解更多信息,请点击此处:/ https://github.com/apilayer/freegeoip

【讨论】:

这是一项付费服务​​。 问题不在于免费服务 他们有免费的。有限层

以上是关于获取用户当前位置的主要内容,如果未能解决你的问题,请参考以下文章

使用融合位置提供程序获取用户当前位置

H5微信 获取用户当前位置信息

在应用启动期间获取当前位置

获取用户当前位置

在 IOS 中使用 CLLocation 获取用户当前位置

获取当前位置的问题