【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>
相关推荐
汽车功能安全啊21 分钟前
利用对称算法及非对称算法实现安全启动
java·开发语言·安全
Flobby5291 小时前
Go语言新手村:轻松理解变量、常量和枚举用法
开发语言·后端·golang
nbsaas-boot2 小时前
SQL Server 窗口函数全指南(函数用法与场景)
开发语言·数据库·python·sql·sql server
东方佑2 小时前
递归推理树(RR-Tree)系统:构建认知推理的骨架结构
开发语言·r语言·r-tree
Warren982 小时前
Java Stream流的使用
java·开发语言·windows·spring boot·后端·python·硬件工程
伍哥的传说3 小时前
Radash.js 现代化JavaScript实用工具库详解 – 轻量级Lodash替代方案
开发语言·javascript·ecmascript·tree-shaking·radash.js·debounce·throttle
xidianhuihui3 小时前
go install报错: should be v0 or v1, not v2问题解决
开发语言·后端·golang
架构师沉默3 小时前
Java优雅使用Spring Boot+MQTT推送与订阅
java·开发语言·spring boot
DebugKitty4 小时前
C语言14-指针4-二维数组传参、指针数组传参、viod*指针
c语言·开发语言·算法·指针传参·void指针·数组指针传参
Bio Coder5 小时前
R语言中 read.table 和 read.delim 之间的区别
开发语言·r语言