根据IP获得城市信息(百度API的运用)

    /**
     * 根据IP获取城市
     * @param string $ip ip地址
     * @return array
     * http://api.map.baidu.com/location/ip?ak=32f38c9491f2da9eb61106aaab1e9739&ip="+ip
     */
    public function getCityByIp($ip)
    {
        $result = false;
        $url =  "http://api.map.baidu.com/location/ip?ak=32f38c9491f2da9eb61106aaab1e9739&ip=".$ip;
        $result = file_get_contents($url);
        $result = json_decode($result);
        $result = self::objtoarr($result);
        if (is_array($result) && isset($result['status'])) {
            if ($result['status'] == 0 && isset($result['content'])) {
                $result['city'] = iconv('utf-8', 'gbk', $result['content']['address_detail']['city']);
            }
        }
        return $result;
    }
    /**
     * 将对象类型数据转化为数组形式
     * @param stdClass Object $obj 对象类型数据
     * @return array
     */
    public static function objtoarr($obj)
    {
        $ret = array();
        foreach ($obj as $key =>$value) {
            if (gettype($value) == 'array' || gettype($value) == 'object') {
                $ret[$key] = self::objtoarr($value);
            } else {
                $ret[$key] = $value;
            }
        }
        return $ret;
    }

 

/**
* 获取客户端IP地址
* @param boolean $pasportlogin 是否是passport登录
* @param boolean $forwarded    是否取HTTP_X_FORWARDED_FOR
* @return string
*/
function Get_Client_ip($pasportlogin = true, $forwarded = false)
{
    if (getenv("HTTP_X_REAL_IP") && strcasecmp(getenv("HTTP_X_REAL_IP"), "unknown") && !$forwarded)
        $ip = getenv("HTTP_X_REAL_IP");
    else if (getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
       $ip = getenv("HTTP_CLIENT_IP");
    else if (getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
        $ip = getenv("HTTP_X_FORWARDED_FOR");
    else if (getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
        $ip = getenv("REMOTE_ADDR");
    else if (isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
        $ip = $_SERVER['REMOTE_ADDR'];
    else
        $ip = "unknown";

    if ($pasportlogin === true) {
        if (false !== strpos($ip, ',')) {
            $arrIp = explode(', ', $ip);
            for ($i = 0; $i < count($arrIp); $i++) {
                if (!eregi("^(10|172\.16|192\.168)\.", $arrIp[$i])) {
                    $ip = $arrIp[$i];
                    break;
                }
            }
        }
    }

    return($ip);
}

posted on   Ryanyanglibin  阅读(1303)  评论(0编辑  收藏  举报

编辑推荐:
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· .NET 9 new features-C#13新的锁类型和语义
阅读排行:
· Sdcb Chats 技术博客:数据库 ID 选型的曲折之路 - 从 Guid 到自增 ID,再到
· 语音处理 开源项目 EchoSharp
· 《HelloGitHub》第 106 期
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 使用 Dify + LLM 构建精确任务处理应用

导航

< 2025年1月 >
29 30 31 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示