【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>
相关推荐
泡泡龙~~2 小时前
计算机网络:2、TCP和UDP
tcp/ip·计算机网络·udp
四维碎片2 小时前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio
IT码农-爱吃辣条2 小时前
Three.js 初级教程大全
开发语言·javascript·three.js
☺����3 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
染翰3 小时前
lua入门以及在Redis中的应用
开发语言·redis·lua
王者鳜錸3 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
妮妮学代码3 小时前
c#:TCP服务端管理类
java·tcp/ip·c#
兔老大RabbitMQ4 小时前
git pull origin master失败
java·开发语言·git
tt5555555555554 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
xiao助阵4 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python