只需调用淘宝网 API 接口,即可获取公网或局域网所在的地理位置信息。

/**
 * 根据 Ip 获取地址位置
 */
function getIpInfo($internetIp = '')
{
    try
    {
        //内网IP
        //  A类10.0.0.0~10.255.255.255
        //  B类172.16.0.0~172.31.255.255
        //  C类192.168.0.0~192.168.255.255
        //  ......
        $bLocalIp = !filter_var($internetIp, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
        if($bLocalIp)
            $internetIp = 'myip';//局域网IP

        $requestAPi = "http://ip.taobao.com/service/getIpInfo.php?ip=" . $internetIp;
        $opts       = array(
            'http' => array(
                'method'  => 'GET',
                'timeout' => 1, // 单位秒
            )
        );
        $jsonArr = json_decode( file_get_contents($requestAPi, false, stream_context_create($opts)),
            JSON_HEX_TAG | JSON_HEX_QUOT | JSON_HEX_AMP | JSON_HEX_APOS );

        // 说明断网
        if (!isset($jsonArr) || !isset($jsonArr['code']))
        {
            return false;
        }

        // 0 表示成功
        if ($jsonArr['code'] !== 0)
        {
            return false;
        }

        // 返回的数据结果:
        //  "ip": "223.98.166.115",
        //  "country": "中国",
        //  "area": "",
        //  "region": "山东",
        //  "city": "济南",
        //  "county": "XX",
        //  "isp": "移动",
        //  "country_id": "CN",
        //  "area_id": "",
        //  "region_id": "370000",
        //  "city_id": "370100",
        //  "county_id": "xx",
        //  "isp_id": "100025"
        $data = (array)$jsonArr['data'];
        return $data;
    }
    catch (\Exception $e)
    {

    }

    return false;
}

附录:获取 IP 地址

/**
 * 获取客户端IP地址
 * @param int $type [IP地址类型]
 * @param bool $strict [是否以严格模式获取]
 * @return mixed [客户端IP地址]
 */
function client_ip($type = 0, $strict = false)
{
    $ip = null;
    // 0 返回字段型地址(127.0.0.1)
    // 1 返回长整形地址(2130706433)
    $type = $type ? 1 : 0;
    if ($strict) {
        /* 防止IP地址伪装的严格模式 */
        if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
            $arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
            $pos = array_search('unknown', $arr);
            if (false !== $pos) {
                unset($arr[$pos]);
            }
            $ip = trim(current($arr));
        } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
            $ip = $_SERVER['HTTP_CLIENT_IP'];
        } elseif (isset($_SERVER['REMOTE_ADDR'])) {
            $ip = $_SERVER['REMOTE_ADDR'];
        }
    } else if (isset($_SERVER['REMOTE_ADDR'])) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    /* IP地址合法性验证 */
    $long = sprintf("%u", ip2long($ip));
    $ip = $long ? [$ip, $long] : ['0.0.0.0', 0];
    return $ip[$type];
}

1,通过腾讯或者新浪提供的接口来获取(新浪和腾讯类似)

<?php 
   function getIPLocation($queryIP){ 
    $url = 'http://ip.qq.com/cgi-bin/searchip?searchip1='.$queryIP; 

  //如果是新浪,这里的URL是:'http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip='.$queryIP; 
    $ch = curl_init($url); 
    curl_setopt($ch,CURLOPT_ENCODING ,'gb2312'); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true) ; // 获取数据返回 
    $result = curl_exec($ch); 
    $result = mb_convert_encoding($result, "utf-8", "gb2312"); // 编码转换,否则乱码 
 //   print_r($result);
    curl_close($ch); 
    preg_match("@<span>(.*)</span></p>@iU",$result,$ipArray); //匹配标签,抓取查询到的ip地址(以数组的形式返回)
    $location = $ipArray[0]; 
    return $location; 
} 


$ip = getIPLocation('111.186.116.208');//将ip传入进来
print_r($ip);//打印结果
?>

如果把提交的$result打印出来的话,显示如下:

最后显示的结果为中国上海市 教育

2,通过淘宝提供的接口

<?php
header("Content-type:text/html;charset=utf-8");//设置编码格式
function getCity($ip)
{
   $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
   print_r(file_get_contents($url));
   $ipinfo=json_decode(file_get_contents($url)); 
   if($ipinfo->code=='1'){
       return false;
   }
   $city = $ipinfo->data->region.$ipinfo->data->city;
   return $city; 
}

// example
print_r(getCity("111.186.116.208"));
?>

打印出-打开的url地址后,可以发现,它是以json格式返回数据的,因此需要进行解码(json_decode)

最后得到的结果为:上海市上海市

参考文章:

PHP淘宝IP数据获取用户IP及地理位置 http://www.111cn.net/phper/php/48159.htm

使用PHP+淘宝IP地址库接口获得IP所属地理位置 http://www.ttlsa.com/php/to-obtain-ip-location-using-the-php-taobao-ip-address-database-interface/

PHP获取IP地址所在的地理位置 http://jingyan.baidu.com/article/154b46315e74af28ca8f4137.html


一个好奇的人