【PHP】几种免费的通过IP获取IP所在地理位置的接口(免费API接口)
目录
一、获取客户端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'}, //不填查询当前IPsuccess:function (data) {//市,如郑州市var city = data.city;//邮编:410100var cityCode = data.adcode;//省份:河南省var province = data.province;//省邮编:410000var 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是河南郑州的,结果返回河南驻马店,请酌情使用