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

目录

一、获取客户端IP地址

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

1、IP域名归属地查询

[2、腾讯地图 - IP定位](#2、腾讯地图 - IP定位)

[3、聚合数据 - IP地址](#3、聚合数据 - IP地址)

[4、高德地图 - IP定位](#4、高德地图 - IP定位)


整理收集了几种通过IP地址获取所在地理位置的接口,部分免费,部分有次数限制。

一、获取客户端IP地址

php 复制代码
//获取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转为数组

php 复制代码
// 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 运营商

代码示例

php 复制代码
$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 | 腾讯位置服务](https://lbs.qq.com/service/webService/webServiceGuide/position/webServiceIp "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 行政区代码

代码示例

php 复制代码
$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 运营商,部分可能为空

代码示例

php 复制代码
$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](https://lbs.amap.com/api/webservice/guide/api/ipconfig "IP定位-基础 API 文档-开发指南-Web服务 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 所在城市矩形区域范围 所在城市范围的左下右上对标对

代码示例

javascript 复制代码
<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>
相关推荐
wangchunyu1143 小时前
Python 数据可视化实战入门教程
开发语言·python·信息可视化
唐青枫4 小时前
Yii2 Applications 详解:应用生命周期、组件配置与多入口实战
php
我是唐青枫4 小时前
Yii2 Controller 详解:路由、Action、过滤器与 CRUD 实战
php
false_or_true4 小时前
一次由 tcp_tw_recycle 引发的“灵异”故障排查:基于双网闸架构的踩坑记
网络·tcp/ip·架构
学逆向的5 小时前
C 突破编译器限制
c语言·开发语言·网络安全
jimy15 小时前
C++ 虚函数表:基类和派生类共用一张 vtable 吗?
开发语言·c++
爱吃提升5 小时前
Dev-C++ 5.11 C++断点调试完整教程
开发语言·c++
夜晚回家5 小时前
Python 原始字符串详解 | r 前缀到底让什么不再转义
开发语言·python
陈年老古董5 小时前
PyQt5 入门指南:环境搭建、PyCharm 外部工具配置与登录界面实战
开发语言·qt·pycharm
看浪的路人5 小时前
第7讲:大模型后端服务化——Go 实现高并发 LLM Proxy / Router / Fallback
开发语言·后端·golang