目录
一、获取客户端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 |
来源 | 腾讯地图 |
官方文档 |
请求参数说明
参数 | 必填 | 含义 | 说明 |
---|---|---|---|
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'}, //不填查询当前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>
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是河南郑州的,结果返回河南驻马店,请酌情使用