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 ...
随机推荐
- AngularJS入门基础——作用域
作用域$scope是构成AngularJS应用的核心基础,在整个框架中都被广泛使用,因此了解它是非常重要的. $scope对像是定义应用业务逻辑,控制器方法和视图属性的地方.作用域是视图和控制器之间的 ...
- bzoj 1432 数学(找规律)
我们可以发现所有的情况(除n=1时),都可以找到两个交叉的直线,就是第一层的那 两个线段所在的直线如图中左 那么我们以这个为准,两边对称着加直线,会得到右图,每一层是折线,且每 加一对儿就多两条线段, ...
- Java内存模型-volatile的内存语义
一 引言 听说在Java 5之前volatile关键字备受争议,所以本文也不讨论1.5版本之前的volatile.本文主要针对1.5后即JSR-133针对volatile做了强化后的了解. 二 vol ...
- mybatis入门程序-(二)
1. 添加配置文件 log4j.properties # Global logging configuration #开发环境下日志级别设置成DEBUG,生产环境设置成info或者error log4 ...
- Android启动过程
1.背景知识 Init进程是Linux环境下非常重要的一个进程,而Zygote进程是J ...
- Shape Factory
Factory is a design pattern in common usage. Implement a ShapeFactory that can generate correct shap ...
- CEO、COO、CFO、CTO、CXO
CEO:Chief Executive Officer 首席执行官——类似总经理.总裁,是企业的法人代表 COO:Chief Operating Officer 首席营运官——类似常务总经理 CFO: ...
- c# 获取百度最后的url
using System;using System.Collections.Generic;using System.Linq;using System.Net.Http;using System.T ...
- JAVA 反射用法
1.获得Class对象 Class<?> classType = Class.forName() 可以通过传入一个全限定类名(包含包名)返回一个该类的Class类对象引用 . Cla ...
- mysql添加事件
begin declare debug int; set @debug = 0; if @debug = 1 then insert into task_monitor(info) values('s ...