如何在电脑“LocalHost”之外获取地理位置信息?

Posted

技术标签:

【中文标题】如何在电脑“LocalHost”之外获取地理位置信息?【英文标题】:How get geolocation info outside of pc "LocalHost"? 【发布时间】:2015-12-06 22:06:29 【问题描述】:

我想使用外部服务(网站服务)获取一些地理位置信息,但这只能在我的电脑上正常工作(本地主机使用WampServer http 客户端);当我的 php 文件传输到远程主机(pc)时,它无法获取这些信息。已经尝试过几种主机服务,但还是没有成功。

PS:我的网站参考是http://ip-api.com/。

这是我的代码:

$ip = $_REQUEST['REMOTE_ADDR']; 
$query = @unserialize(file_get_contents('http://ip-api.com/php/'.$ip));

if($query && $query['status'] == 'success') 

  $regiao = $query['regionName'];
  $cidade = $query['city'];
  $isp = $query['isp'];
  $sigla_regiao = $query['region'];
 
else 
  echo '';

那么,有人知道为什么这个 api 在远程主机上不起作用?

提前致谢。

【问题讨论】:

您的主机可能会阻止您对该 API 的请求。 如果不抑制第二行的错误输出,会不会出现某种错误? @lxg,输入var_dump($query),返回:bool(false) 不,我的意思是:请删除第 2 行中的 @ 符号,并告诉我们您是否收到错误消息。 @lxg, this 是出现的错误。 【参考方案1】:

根据您发布的错误,file_get_contents 函数无法创建与远程主机的连接。可能是某些功能禁用了对远程资源的访问。

您可以尝试使用 cURL 访问远程 URL:

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, "http://ip-api.com/php" . $ipAddr);
curl_setopt ($curl, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec ($curl);
curl_close ($curl); 

if (curl_errno($curl))
    throw new \Exception(sprintf("Connection error %s: %s", curl_errno($curl), curl_error($curl)));

print_r(unserialize($content));

【讨论】:

【参考方案2】:

如果您对其他提供商感兴趣,可以使用https://geoip-db.com的服务

一个有效的 JSON 示例:

<?php

    $json = file_get_contents('https://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>';

?>

或者使用 php 的 JSONP 回调:

<?php

    $jsonp = file_get_contents('https://geoip-db.com/jsonp');
    $data = jsonp_decode($jsonp);

    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>';

    // Strip callback function name and parenthesis
    function jsonp_decode($jsonp)  
        if($jsonp[0] !== '[' && $jsonp[0] !== '')  
           $jsonp = substr($jsonp, strpos($jsonp, '('));
        
        return json_decode(trim($jsonp,'();'));
    
?>

【讨论】:

以上是关于如何在电脑“LocalHost”之外获取地理位置信息?的主要内容,如果未能解决你的问题,请参考以下文章

小程序微信授权测试小结

微信如何获取自己的位置?

从 phpmyadmin 和 mysql 阻止除 localhost 之外的所有用户

腾讯地图在微信公众号中获取当前位置

如何在 Android (Kotlin) 中的 onSuccessListener 之外分配位置坐标?

微信公众账号二维码如何提取url链接地址