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 ...
随机推荐
- ASP.NET MVC学习笔记-----Filter(1)
Filter类型 接口 MVC的默认实现 Description Authorization IAuthorizationFilter AuthorizeAttribute 最先执行,在其他类型的fi ...
- Tornado实现多线程、多进程HTTP服务
背景 线上有一个相关百科的服务,返回一个query中提及的百科词条.该服务是用python实现的,以前通过thrift接口访问,现要将其改为通过HTTP访问.之前没有搭建HTTPServer的经验,因 ...
- Codeforces 237 div2 B. Marathon(关于精度损失的教训)
题目链接:http://codeforces.com/contest/404/problem/B?csrf_token=6292hf3e1h4g5e0d16a996ge6bgcg7g2 解题报告:一个 ...
- HDU 1176 免费馅饼 DP类似数塔题
解题报告: 小明走在一条小路上,这条小路的长度是10米,从左到右依次是0到10一共十个点,现在天上会掉馅饼,给出馅饼掉落的坐标和时间,一开始小明的位置是在坐标为5的位置, 他每秒钟只能移动一米的距离, ...
- 以后的博客将更新到自己的域名pythonsite.com,欢迎访问
以后的博客将更新到自己的域名pythonsite.com,欢迎访问
- TPCC-MySQL安装、使用及结果解读
tpcc-mysql用于MySQL基准测试,percona基于TPC-C(下面简写成TPCC)衍生出来的产品.下面对tpcc-mysql进行安装然后使用,最后结果解读,安装very easy,let ...
- ModelAndView学习笔记
api: 构造函数摘要 ModelAndView() bean样式用法的默认构造函数:填充bean属性,而不是传递构造函数参数. ModelAndView(Object view) ...
- SVN使用过程中遇到的一些问题
更新svn的客户端TortoiseSVN后 ,之前使用svn管理的文件的关联图标消失了 说明:下面的解决方法及图片来自博客:装了SVN,你的关联图标变了没有? 解决办法:在同步的文件点击右键如下图 ...
- Android开源库集合(工具)
图片加载框架: Glide https://github.com/bumptech/glide Android-Universal-Image-Loader https://github.com/no ...
- Spring Boot Mvc 单元测试
https://blog.csdn.net/hfmbook/article/details/70209162