【PHP】几种免费的通过IP获取IP所在地理位置的接口(免费API接口)

发布于:2025-07-30 ⋅ 阅读:(319) ⋅ 点赞:(0)

目录

一、获取客户端IP地址

二、获取IP所在地理位置接口

1、IP域名归属地查询

2、腾讯地图 - IP定位

3、聚合数据 - IP地址

4、高德地图 - IP定位

5、360分享计划 - IP查询


一、获取客户端IP地址

//获取ip地址
function get_ip(){
  if (isset($_SERVER)) {
    if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
      $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
      $realip = $_SERVER['HTTP_CLIENT_IP'];
    } else {
      $realip = $_SERVER['REMOTE_ADDR'];
    }
  } else {
    if (getenv("HTTP_X_FORWARDED_FOR")) {
      $realip = getenv( "HTTP_X_FORWARDED_FOR");
    } elseif (getenv("HTTP_CLIENT_IP")) {
      $realip = getenv("HTTP_CLIENT_IP");
    } else {
      $realip = getenv("REMOTE_ADDR");
    }
  }
  return $realip;
}

二、获取IP所在地理位置接口

一些通用的方法,用于处理接口:CURL请求,将JSON转为数组

// CURL请求
public function freeApiCurl($url,$params=false,$ispost=0){
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
    curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
    curl_setopt( $ch, CURLOPT_USERAGENT , 'free-api' );
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
    curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
    if( $ispost )
    {
        curl_setopt( $ch , CURLOPT_POST , true );
        curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
        curl_setopt( $ch , CURLOPT_URL , $url );
    }
    else
    {
        if($params){
            curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
        }else{
            curl_setopt( $ch , CURLOPT_URL , $url);
        }
    }
    $response = curl_exec( $ch );
    if ($response === FALSE) {
        return false;
    }
    curl_close( $ch );
    return $response;
}

/**
 * 将JSON内容转为数据,并返回
 */
public function returnArray($content){
    return json_decode($content,true);
}

1、IP域名归属地查询

接口描述:(无限制)

 名称 说明
接口名称 IP/域名归属地查询
接口地址 https://api.asilu.com/ip/
请求方式 GET/POST
官方文档 API 接口

 请求参数说明

参数 必填 含义 说明
ip 是 IP地址 ip地址或域名,缺省时会使用当前请求端的Ip 

返回参数说明

名称 含义 说明
ip ip地址 当前ip地址或域名
dz 地理位置 请求IP的地理位置
wl 运营商

 代码示例

$ip = get_ip();
$apiUrl = 'https://api.asilu.com/ip/?ip='.$ip;
$result = $this->returnArray($this->freeApiCurl($apiUrl));

2、腾讯地图 - IP定位

接口描述:有限制

 名称 说明
接口名称 IP定位
接口地址 https://apis.map.qq.com/ws/location/v1/ip
请求方式 GET
来源 腾讯地图
官方文档

WebService API | 腾讯位置服务

 请求参数说明

参数 必填 含义 说明
key 是 开发密钥
ip 否 IP地址 ip地址或域名,缺省时会使用当前请求端的Ip 
output 否 返回格式 支持JSON/JSONP,默认JSON
callback 否 JSONP方式回调函数

返回参数说明

名称 类型 说明
status number 状态码,0为正常,其它为异常,详细请参阅状态码说明
message string 对status的描述
result object IP定位结果
ip string 用于定位的IP地址
location object 定位坐标。注:IP定位服务精确到市级,该位置为IP地址所属的行政区划政府坐标。
lat number 纬度
lng number 经度
ad_info object 定位行政区划信息
nation string 国家
nation_code number 国家代码(ISO3166标准3位数字码)
province string 省
city string 市
district string 区
adcode number 行政区代码

代码示例 

$ip = get_ip();
$apiUrl = 'https://apis.map.qq.com/ws/location/v1/ip';
$params = [
        "key" => "xxxxxx",
        "ip" => $ip
    ];
$params = http_build_query($params);
$result = $this->returnArray($this->freeApiCurl($apiUrl,$params,1));

3、聚合数据 - IP地址

接口描述:有限制,50次/天 - 聚合数据

 名称 说明
接口名称 IP地址查询
接口地址 http://apis.juhe.cn/ip/ipNewV3
请求方式 GET/POST
来源 聚合数据
官方文档 IP地址查询接口_IP归属地查询接口_免费API数据接口_聚合数据 - 天聚地合

 请求参数说明

参数 必填 含义 说明
key 是 开发密钥 在个人中心->我的数据,接口名称上方查看
ip 是 IP地址 需要查询的IPv4地址。暂不支持IPv6地址

返回参数说明

名称 含义 说明
error_code 返回码 0表示成功
resultcode 状态码 200表示成功
reason 返回说明
result 返回结果集
Country 国家/地区
Province 省份区域,部分可能为空
City 城市,部分可能为空
Isp 运营商,部分可能为空

代码示例

$ip = get_ip();
$apiUrl = 'http://apis.juhe.cn/ip/ipNew';
$params = [
        "key" => "xxxxxxx",
        "ip" => $ip
    ];

$params = http_build_query($params);
$rs = $this->returnArray($this->freeApiCurl($apiUrl,$params,1));

4、高德地图 - IP定位

接口描述:高德地图IP定位接口支持HTTP/HTTPS,采用前端javascript的方式调用,比较简单,每月免费150000次

名称 说明
接口名称 高德IP定位
接口地址 https://restapi.amap.com/v3/ip?parameters
请求方式 GET
来源 高德地图
官方文档 IP定位-基础 API 文档-开发指南-Web服务 API | 高德地图API

 请求参数说明

参数 必填 含义 说明
key 是 请求服务权限标识 用户在高德地图官网 申请 Web 服务 API 类型 KEY
ip 否 IP地址 需要搜索的IP地址,若不填写IP,则使用当前IP
sig 否 签名 选择数字签名认证的付费用户必填

返回参数说明

名称 含义 说明
status 结果状态值 0表示失败,1表示成功
info 状态说明 当status为0时,info返回错误原因,否则返回OK
infocode 状态码 10000代表正确
province 省份

如果在局域网 IP 网段内,则返回“局域网”;

非法 IP 以及国外 IP 则返回空

city 城市 如果为局域网网段内 IP 或者非法 IP 或国外 IP,则返回空
adcode 城市的 adcode 编码 adcode 信息可参考 城市编码表 获取
rectangle 所在城市矩形区域范围 所在城市范围的左下右上对标对

代码示例

<script src="/newadmin/js/jquery-1.12.3.min.js" charset="utf-8"></script> 
<script>
$.ajax({
    url:'https://restapi.amap.com/v3/ip?key=xxxxxx',
    data:{ip:'223.104.3.43'},    //不填查询当前IP
    success:function (data) {
        //市,如郑州市
        var city = data.city;
        //邮编:410100
        var cityCode = data.adcode;
        //省份:河南省
        var province = data.province;
        //省邮编:410000
        var provinceCode = data.provinceCode;
        //经度 & 维度,以;间隔
        var rectangle = data.rectangle;

        console.log(data)
    }
});
</script>

5、360分享计划 - IP查询

接口描述:无限制,不稳定,有时候有数据有时候无数据

 名称 说明
接口名称 IP地址查询
接口地址 http://ip.360.cn/IPQuery/ipquery
请求方式 GET/POST
来源 360分享计划

 请求参数说明

参数 必填 含义 说明
ip 是 IP地址 需要查询的IP地址

返回参数说明

名称 含义 说明
errno 返回码 0表示成功
code 返回码 当code=null时,请求失败
errmsg 错误信息 errno为0时,错误信息为空
data 返回地理位置及运营商 如:北京市   移动

代码示例

public function index(){

        $ip = get_ip();
        $apiUrl = 'http://ip.360.cn/IPQuery/ipquery';
        $params = [
                "ip" => $ip
            ];
        $params = http_build_query($params);
        $result = $this->returnArray($this->freeApiCurl($apiUrl,$params,1));
      
}

这个接口好像对市级不太精准,这个Ip是河南郑州的,结果返回河南驻马店,请酌情使用 


微信公众号

今日签到

点亮在社区的每一天
去签到