PHP 获取IP地址位置信息「聚合数据API」
聚合数据 提供了【查询IP所属区域】的服务接口,只需要以 GET 请求的方式向 API 传入 IP地址 和 APPKEY 即可获得查询结果。
这里的难点主要在于如何通过PHP获取客户端IP地址,以及如何以GET方式向服务接口发送请求和获取相应。
====================获取IP地址=====================
通常情况下只需要 $_SERVER['REMOTE_ADDR'] 就可以获取客户端IP地址。
不过有时候可能需要数值型地址,或者防止IP地址伪装……所以我对整个过程进行了包装,方便日后使用。
/**
* 获取客户端IP地址
* @param int $type [IP地址类型]
* @param bool $strict [是否以严格模式获取]
* @return mixed [客户端IP地址]
*/
function client_ip($type = 0, $strict = false)
{
$ip = null;
// 0 返回字段型地址(127.0.0.1)
// 1 返回长整形地址(2130706433)
$type = $type ? 1 : 0;
if ($strict) {
/* 防止IP地址伪装的严格模式 */
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$arr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
$pos = array_search('unknown', $arr);
if (false !== $pos) {
unset($arr[$pos]);
}
$ip = trim(current($arr));
} elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
$ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
} else if (isset($_SERVER['REMOTE_ADDR'])) {
$ip = $_SERVER['REMOTE_ADDR'];
}
/* IP地址合法性验证 */
$long = sprintf("%u", ip2long($ip));
$ip = $long ? [$ip, $long] : ['0.0.0.0', 0];
return $ip[$type];
}
提示:本地访问 localhost 的时候函数返回 0.0.0.0。
====================cURL函数=====================
PHP 的 libcurl 库可以让服务器通过各类协议进行连接和通讯,通过cURL我们可以向服务接口发送数据获取响应。
cURL中HTTP请求包含初始化、设置选项、执行响应、释放句柄四个操作,这里我对其进行了封装。
/**
* cURL请求函数
* @param string $url [请求的URL地址]
* @param array $params [请求的参数]
* @param bool $post [是否采用POST形式]
* @return mixed [请求结果|失败返回FALSE]
*/
function curl_tool($url, $params = [], $post = false)
{
/* 创建cURL句柄 */
$ch = curl_init(); /* 设置URL连接参数 */
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60);// 设置尝试连接等待时间
curl_setopt($ch, CURLOPT_TIMEOUT, 60);// 设置cURL函数执行的最长时间
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);// 将执行结果以字符串返回
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);// 根据响应头信息进行重定向 /* POST与GET请求 */
$params = http_build_query($params);// 将请求参数转换为字符串形式
if ($post) {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
} else {
$url = $url . ($params ? '?' : '') . $params;
}
curl_setopt($ch, CURLOPT_URL, $url); /* 抓取URL并关闭资源 */
$response = curl_exec($ch);
// if ($response === false) echo curl_error($ch);
curl_close($ch); return $response;
}
提示:去掉 echo curl_error($ch) 的注释可以查看函数返回 FALSE 的原因。
====================查询IP位置=====================

解决了 获取IP地址 和 发送HTTP请求 的问题,就可以通过 http://apis.juhe.cn/ip/ip2addr 接口查询IP地址的地理位置信息了。
$url = "http://apis.juhe.cn/ip/ip2addr"; // 接口地址
// $appkey 填写您在聚合数据申请的 APPKEY
$appkey = '80701ec21437ca36ca466af27bb8e8d3'; // 调试APPKEY $params = array(
"ip" => client_ip(),//需要查询的IP地址或域名
"key" => $appkey,//应用APPKEY(应用详细页查询)
"dtype" => "json",//返回数据的格式,xml或json,默认json
); // 获取响应内容,失败时为FALSE
$content = curl_tool($url, $params);
// 将JSON转换为数组打印输出
$result = json_decode($content, true);
print_r($result);
通过外网访问的结果:
Array
(
[resultcode] => 200
[reason] => Return Successd!
[result] => Array
(
[area] => 北京市
[location] => 电信
)
[error_code] => 0
)
注意:如果直接通过 localhost 访问,API 会提示 Wrong IP address! 错误。
PHP 获取IP地址位置信息「聚合数据API」的更多相关文章
- 淘宝(新浪)API获取IP地址位置信息
package com.parse; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IO ...
- thinkphp获取ip地址及位置信息
ThinkPHP\Common\funcitons.php下有一个get_client_ip()能够获取ip地址 但是有时候不够准确 找到了下面一段来 function get_client_ip($ ...
- js获取ip地址,操作系统,浏览器版本等信息,可兼容
这次呢,说一下使用js获取用户电脑的ip信息,刚开始只是想获取用户ip,后来就顺带着获取了操作系统和浏览器信息. 先说下获取用户ip地址,包括像ipv4,ipv6,掩码等内容,但是大部分都要根据浏览器 ...
- 获取ip地址及城市信息
大家好,今天给大家分享的是一个简单的知识获取登录用户的ip地址及城市信息,lz是一个小白,如果有哪些错误的地方 欢迎大家指出 东西很简单,直接上代码 [HttpPost] public string ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- 【PHP开发篇】一个统计客户端商机提交的获取IP地址
1.对客服提交数据的ip地址记录. 获取ip地址的方法: public function getIP() { global $ip; if (getenv("HTTP_X_REAL_IP&q ...
- js获取IP地址方法总结_转
js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...
- Linux下Python获取IP地址
<lnmp一键安装包>中需要获取ip地址,有2种情况:如果服务器只有私网地址没有公网地址,这个时候获取的IP(即私网地址)不能用来判断服务器的位置,于是取其网关地址用来判断服务器在国内还是 ...
- ARM-Linux配置DHCP自动获取IP地址
备注:内核版本:2.6.30.9busybox版本:1.15.2 PC Linux和开发板Linux的工作用户:root 1. 配置内核:[*] Networking support --->N ...
随机推荐
- spring Mvc + Maven + 拷贝插件 (十一)
maven-antrun-plugin:可用于在项目编译打包时,把文件指定的文件拷贝到指定的位置,我们打包一般都是打包到 项目 的target 文件下; <groupId>org.apac ...
- 【三分钟视频教程】iOS开发中 Xcode 报 apple-o linker 错误的#解决方案#
[三分钟视频教程]iOS开发中 Xcode 报 apple-o linker 错误的#解决方案# 同样的道理,指向同一库文件的代码语句如果重复书写,即使重复书写所在的文件名字不同,同样会造成这 ...
- Spark笔记之累加器(Accumulator)
一.累加器简介 在Spark中如果想在Task计算的时候统计某些事件的数量,使用filter/reduce也可以,但是使用累加器是一种更方便的方式,累加器一个比较经典的应用场景是用来在Spark St ...
- python中的*号
from:https://www.douban.com/note/231603832/ 传递实参和定义形参(所谓实参就是调用函数时传入的参数,形参则是定义函数是定义的参数)的时候,你还可以使用两个特殊 ...
- Oracle错误及解决方案
1.ORA-00257:归档程序错误.在释放之前仅限于内部链接 问题原因:归档日志占满了空间 解决方法: .增加归档日志空间 alter system set db_recovery_file_des ...
- 打包部署到tomcat
部署到tomcat的方法 注意:在eclipse 或 idea 上需要引入外部tomcat 1.将程序打成war包启动tomcat 2.将target 文件下内容压缩城zip,发布到tomcat RO ...
- python文件操作及格式化输出
1 文件与IO 1.1读写文本数据 读写各种不同的文本数据,如ASCII,UTF-8,UTF-9编码等. 使用带有rt模式的open()函数读取文本文件. 例如: with open('db', 'r ...
- Kaggle大数据竞赛平台入门
Kaggle大数据竞赛平台入门 大数据竞赛平台,国内主要是天池大数据竞赛和DataCastle,国外主要就是Kaggle.Kaggle是一个数据挖掘的竞赛平台,网站为:https://www.kagg ...
- 2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践
2018-2019-2 网络对抗技术 20165301 Exp3 免杀原理与实践 实验内容 任务一:正确使用msf编码器,msfvenom生成如jar之类的其他文件,veil-evasion,自己利用 ...
- Java编程的逻辑 (22) - 代码的组织机制
本系列文章经补充和完善,已修订整理成书<Java编程的逻辑>,由机械工业出版社华章分社出版,于2018年1月上市热销,读者好评如潮!各大网店和书店有售,欢迎购买,京东自营链接:http: ...