天天看点

利用百度地图API后台php获取访客位置

在网页和小程序开发工作中,获取访客位置的需求非常常见,不仅仅局限于一些位置服务应用,在一般页面统计访客信息、表单填写页面获取访客资料等,均可能用到这一功能。在进行粗略的位置获取时,可以采取较为简单的IP定位解决方案。一般地,能够通过JavaScript构造请求在前端获取位置信息。但是,有的时候定位的过程不希望被直接察觉,因而可以采用后台获取的方式。下面以百度地图的IP定位API为例,讲解php页获取访客位置信息的过程。

在开发之前,首先需要拥有一个百度地图公众平台的开发者账号,并在控制台的创建应用栏目创建一个浏服务端的应用。创建应用的目的在于获得一个开发者密钥(AK),供后续获得IP请求得到位置时使用。

登陆百度地图公众平台,进入控制台创建应用页面后,即可看到创建应用栏目的内容。创建的过程中注意需要勾选“普通IP定位”的操作,配置如图1所示。

在进行应用调试的过程中,可以将IP白名单设置为0.0.0.0/0,但是在实际使用的过程中,为了防止自己的配额他人恶意占用,可将其设置为自己的服务器IP。

利用百度地图API后台php获取访客位置

图1 创建应用

在完成应用的创建,点击提交按钮后,可以看到应用列表页面里出现了我们刚刚创建的应用,及其对应的AK,如图2所示。

利用百度地图API后台php获取访客位置

图2 应用列表

接下来步入重头戏,基于php获取访客所在的位置。

开发的第一步,获取访客的IP。由于内网、反向代理等因素,直接使用$_SERVER[“REMOTE_ADDR”]方法获取到的IP可能不真实,可采用下面的函数对真实IP进行获取。

function getIp()
    {

        if(!empty($_SERVER["HTTP_CLIENT_IP"]))
        {
            $cip = $_SERVER["HTTP_CLIENT_IP"];
        }
        else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
        {
            $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        }
        else if(!empty($_SERVER["REMOTE_ADDR"]))
        {
            $cip = $_SERVER["REMOTE_ADDR"];
        }
        else
        {
            $cip = '';
        }
        preg_match("/[\d\.]{7,15}/", $cip, $cips);
        $cip = isset($cips[0]) ? $cips[0] : 'unknown';
        unset($cips);

        return $cip;
    }
           

进一步的,构造HTTP请求,将获取得到的IP传入,请求得到用户所在位置的结果。百度IP定位API的请求地址为:http://api.map.baidu.com/location/ip。我们所需请求参数和对应解释如下表所描述:

参数名称 参数含义
ip 用户上网的IP地址
ak 开发者密钥

由此,构造的GET请求URL为:http://api.map.baidu.com/location/ip?ip=remote_addr&ak=your_ak。其中,remote_addr为访客的ip,而your_ak为前文所述创建应用得到的AK。

进行请求并获取结果的相关代码如下:

$remote_addr = getIp();
$your_ak = "MkFIQBQa*************I6Vfn";
$url='http://api.map.baidu.com/location/ip?ip='.$remote_addr.'&ak='.$your_ak; //构造请求url
$html = file_get_contents($url); //进行get请求
$res = json_decode($html,true); //对得到的JSON字串结果进行解码

$province = $res["content"]["address_detail"]["province"]; //得到访客所在省份
$city = $res["content"]["address_detail"]["city"]; //得到访客所在城市
           

这样便得到了访客所在的省份和城市信息。当然,除了访客所在的省份和城市外,还可以获取相关的其他地理信息,如简要地址、区县、门牌号等,具体内容可见百度地图IP定位API手册。

获得省份和城市信息的整体代码如下:

<?php
function getIp()
{

    if(!empty($_SERVER["HTTP_CLIENT_IP"]))
    {
        $cip = $_SERVER["HTTP_CLIENT_IP"];
    }
    else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"]))
    {
        $cip = $_SERVER["HTTP_X_FORWARDED_FOR"];
    }
    else if(!empty($_SERVER["REMOTE_ADDR"]))
    {
        $cip = $_SERVER["REMOTE_ADDR"];
    }
    else
    {
        $cip = '';
    }
    preg_match("/[\d\.]{7,15}/", $cip, $cips);
    $cip = isset($cips[0]) ? $cips[0] : 'unknown';
    unset($cips);

    return $cip;
}

$remote_addr = getIp();
$your_ak = "MkFIQBQa*************I6Vfn";
$url='http://api.map.baidu.com/location/ip?ip='.$remote_addr.'&ak='.$your_ak; //构造请求url
$html = file_get_contents($url); //进行get请求
$res = json_decode($html,true); //对得到的JSON字串结果进行解码

$province = $res["content"]["address_detail"]["province"]; //得到访客所在省份
$city = $res["content"]["address_detail"]["city"]; //得到访客所在城市

echo "您的所在省份为:".$province;
echo "<br>";
echo "您的所在城市为:".$city;
?>
           

执行结果见:

利用百度地图API后台php获取访客位置