【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>
相关推荐
小徐不徐说8 小时前
序列化与反序列化:把 C++ 对象可靠地保存下来
开发语言·数据库·c++·php
ragnwang8 小时前
Notes: Python pybind11 import C++ module
开发语言·c++·python
Wang's Blog8 小时前
Java 项目实战: 交友项目 - 搜索附近的功能概述和分析
java·开发语言·交友
骑着蜗牛撵大象3278 小时前
大模型 Agent 的沙箱护栏:gVisor 隔离、出口白名单与审计闭环
java·开发语言·jvm·安全·agent沙箱·gvisor·microvm
Dxy12393102169 小时前
JS DES 加密详解
开发语言·javascript·arcgis
充值内卷9 小时前
我给桌面加了个鱼缸:C++ 写后端,WebView2 里养一座 Three.js 小岛
开发语言·javascript·c++
云和数据.ChenGuang10 小时前
深入解析 Python 的 dir():从用法到 CPython 源码实现
开发语言·人工智能·python·langchain
nice_lcj52010 小时前
深入理解 Java 反射:从 Class 对象到方法调用(含性能实测 + 迷你 IOC 实战 + 面试考点)
java·开发语言·后端·面试
樱花树下的数学喵12 小时前
手写简易 STL string|C++ 字符串底层实现
开发语言·c++
jimy113 小时前
C++ 报错的 qualifiers 的意思
开发语言·c++