php获取客户端ip地址及ip所在国家、省份、城市、县区
摘要
获取客户端ip地址,然后使用这个ip地址获取所在的国家、省份、城市,可以在网站中实现IP属地,发布地等功能。
本文的获取IP地址信息均采自网络上免费的IP查询网站,通过其API或者网页HTML解析出的ip地址信息。
代码
<?php// 编码header('Content-type:application/json');$ip = $_GET['ip'];// 过滤空数据if(!$ip) {$ipinfo = array('code' => 201,'msg' => '未传入ip地址');echo json_encode($ipinfo,JSON_UNESCAPED_UNICODE);exit;}// 验证ipv4地址合法性if (!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {$ipinfo = array('code' => 201,'msg' => '这不是一个正确的ip地址');echo json_encode($ipinfo,JSON_UNESCAPED_UNICODE);exit;}// 请求接口$methods = ['getMethod_1','getMethod_2','getMethod_3','getMethod_4','getMethod_5'];foreach ($methods as $method) {$response = json_decode($method($ip));if ($response->code === 200) {// 如果请求成功,输出请求结果并停止循环echo $method($ip);break;}}if (!isset($response) || $response->code !== 200) {$ipinfo = array('code' => 201,'msg' => '请求失败~');echo json_encode($ipinfo,JSON_UNESCAPED_UNICODE);exit;}// HTTP请求封装function cUrlGetIP($url) {// cUrl$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);$header[] = 'user-agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36';curl_setopt($ch, CURLOPT_HTTPHEADER, $header);return curl_exec($ch);curl_close($ch);}// 中国34个省级行政区域$provinces = array("北京","天津","河北","山西","内蒙古","辽宁","吉林","黑龙江","上海","江苏","浙江","安徽","福建","江西","山东","河南","湖北","湖南","广东","广西","海南","重庆","四川","贵州","云南","西藏","陕西","甘肃","青海","宁夏","新疆","香港","澳门","台湾");// 接口1// http://ipshudi.com/{ip}.htmfunction getMethod_1($ip) {$response = file_get_contents('http://ipshudi.com/'.$ip.'.htm');$str1 = substr($response, strripos($response, "归属地"));$str2 = substr($str1, 0, strrpos($str1, "运营商"));$str3 = substr($str2, strripos($str2, "<span>") + 6);$str4 = substr($str3, 0, strripos($str3, "</span>") + 6);// 提取国家$country = substr($str4, 0, strpos($str4, ' '));// 提取省份$str5 = substr($str4, 0, strrpos($str4, " <a href"));$province = substr($str5, strpos($str5, ' ') + 1);// 提取城市preg_match('/>([^<]+)</', $str4, $matches);$city = $matches[1];// 提取县区$str6 = substr($str4, strripos($str4, "</a>"));$district = preg_replace('/[^\x{4e00}-\x{9fa5}]+/u', '', $str6);// 判断是否获取成功if($country || $province || $city || $district) {// 拼接数组$ipinfo = array('code' => 200,'msg' => '获取成功','ipinfo' => array('country' => $country,'province' => $province,'city' => $city,'district' => $district,'ip' => $ip));}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}return json_encode($ipinfo,JSON_UNESCAPED_UNICODE);}// 接口2// https://searchplugin.csdn.net/api/v1/ip/get?ip={ip}function getMethod_2($ip) {$response = cUrlGetIP('https://searchplugin.csdn.net/api/v1/ip/get?ip='.$ip);$code = json_decode($response,true)['code'];if($code == 200) {$str1 = json_decode($response,true)['data']['address'];// 国家$country = explode(' ', $str1)[0];// 省份$province = explode(' ', $str1)[1];// 城市$city = explode(' ', $str1)[2];// 县区$district = '';// 判断是否获取成功if($country || $province || $city || $district) {// 拼接数组$ipinfo = array('code' => 200,'msg' => '获取成功','ipinfo' => array('country' => $country,'province' => $province,'city' => $city,'district' => $district,'ip' => json_decode($response,true)['data']['ip']));}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}return json_encode($ipinfo,JSON_UNESCAPED_UNICODE);}// 接口3// https://ipchaxun.com/{ip}/function getMethod_3($ip) {$response = cUrlGetIP('https://ipchaxun.com/'.$ip.'/');$str1 = substr($response, strripos($response, "归属地") + 15);$str2 = substr($str1, 0, strrpos($str1, "运营商"));// 提取省份global $provinces;foreach ($provinces as $province_) {if (strpos($str2, $province_) !== false) {$province = $province_;break;}}// 提取国家$str3 = substr($str2, 0, strrpos($str2, $province));$country = preg_replace('/[^\x{4e00}-\x{9fa5}]+/u', '', $str3);// 提取城市$str4 = substr($str2, strripos($str2, "nofollow") + 10);$city = substr($str4, 0, strrpos($str4, "</a>"));// 提取县区$str6 = substr($str2, strripos($str2, "</a>") + 4);$district = substr($str6, 0, strrpos($str6, "</span>"));// 判断是否获取成功if($country || $province || $city || $district) {// 拼接数组$ipinfo = array('code' => 200,'msg' => '获取成功','ipinfo' => array('country' => $country,'province' => $province,'city' => $city,'district' => $district,'ip' => $ip));}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}return json_encode($ipinfo,JSON_UNESCAPED_UNICODE);}// 接口4// https://api.vvhan.com/api/getIpInfo?ip={ip}function getMethod_4($ip) {$response = cUrlGetIP('https://api.vvhan.com/api/getIpInfo?ip='.$ip);$success = json_decode($response,true)['success'];if($success == true) {$str1 = json_decode($response,true)['info'];// 国家$country = $str1['country'];// 省份$province = $str1['prov'];// 城市$city = $str1['city'];// 县区$district = '';// 判断是否获取成功if($country || $province || $city || $district) {// 拼接数组$ipinfo = array('code' => 200,'msg' => '获取成功','ipinfo' => array('country' => $country,'province' => $province,'city' => $city,'district' => $district,'ip' => $ip));}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}return json_encode($ipinfo,JSON_UNESCAPED_UNICODE);}// 接口5// https://c.runoob.com/wp-content/themes/toolrunoob2/option/ajax.php?type=checkIP&REMOTE_ADDR={ip}function getMethod_5($ip) {$response = cUrlGetIP('https://c.runoob.com/wp-content/themes/toolrunoob2/option/ajax.php?type=checkIP&REMOTE_ADDR='.$ip);$flag = json_decode($response,true)['flag'];if($flag == true) {$str1 = json_decode($response,true)['data'];// 国家$country = $str1['country'];// 省份$province = $str1['regionName'];// 城市$city = $str1['city'];// 县区$district = '';// 判断是否获取成功if($country || $province || $city || $district) {// 拼接数组$ipinfo = array('code' => 200,'msg' => '获取成功','ipinfo' => array('country' => $country,'province' => $province,'city' => $city,'district' => $district,'ip' => $ip));}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}}else {$ipinfo = array('code' => 201,'msg' => '获取失败');}return json_encode($ipinfo,JSON_UNESCAPED_UNICODE);}?>
使用
https://域名/getipInfo.php?ip=需要查询的IP地址
一共有5个接口,接口失效会使用下一个接口,直到接口成功,最终输出数据格式如下:
{"code":200,"msg":"获取成功","ipinfo":{"country":"中国","province":"广东省","city":"广州市","district":"番禺区","ip":"xx.xx.xxx.xx"}}
作者
TANKING
相关文章:
php获取客户端ip地址及ip所在国家、省份、城市、县区
摘要 获取客户端ip地址,然后使用这个ip地址获取所在的国家、省份、城市,可以在网站中实现IP属地,发布地等功能。 本文的获取IP地址信息均采自网络上免费的IP查询网站,通过其API或者网页HTML解析出的ip地址信息。 代码 <?p…...
Error: Port Library failed to initialize: -86
最近遇到一个很奇怪的错误,这里记录一下,以备以后再次遇到 Error: Port Library failed to initialize: -86 Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit.背景是,就是一普…...
SOME/IP 支持两种序列化方式:TLV 和 TV
SOME/IP 是一种基于 IP 的可扩展面向服务的中间件协议,它可以在车载以太网中实现 ECU 之间的高效通信和互操作性。 SOME/IP 的序列化方式是指将数据结构或对象按照一定的规则转换成字节序列的过程,以便在网络中传输和解析。 SOME/IP 支持两种序列化方式:TLV 和 TV。 TLV是…...

Unity之3D物理导航系统
一 介绍 Unity自带寻路(导航)系统是unity官方自带的一种寻路系统。我们可以通过它来制作简单的寻路,比如可以制作点击某个位置,让角色自动的绕开障碍走到目标点的效果,比如可以制作敌人AI,让它可以通过NavMesh绕开障碍追击我方单…...
9.4黄金行情是否反转?今日多空如何布局?
近期有哪些消息面影响黄金走势?今日黄金多空该如何研判? 黄金消息面解析:周一(9月4日)亚市盘中,现货黄金震荡走高,延续上周涨势,一度刷新日内高点至1946.16美元/盎司。周三,ISM将发布服务业P…...

Win10下使用vim9
作为一个经常与文字打交道的Writer,你在学会Vim的基本操作之后,就一定会爱上Vim的。 以下是Windows10_64位(专业版)环境中安装、使用Vim9的全过程,分享一下: 一、下载、安装Vim9 去Vim官网去下载最新的Vi…...

Flink+Flink CDC版本升级的依赖问题总结
之前使用Flink1.13Flink CDC2.0同步MySQL数据,想测试一下最新的几个版本。但是各种依赖冲突的报错,经过一段时间的调试,终于解决,现在总结一下。 1、flink1.15前后jar包名称不一样 flink-streaming-java、flink-clients、flink-…...

Matlab论文插图绘制模板第112期—带阴影标记的图
之前的文章中,分享了Matlab带线标记的图: 进一步,本期分享的是带阴影标记的图。 先来看一下成品效果: 特别提示:本期内容『数据代码』已上传资源群中,加群的朋友请自行下载。有需要的朋友可以关注同名公号…...

专业运动耳机哪个牌子好、专业运动耳机推荐
在进行运动时,倾听音乐实际上是一种放松大脑、放松身体的小技巧。毕竟运动是一个耗费体力最多的活动,整个过程也往往令人感到乏味。如果有音乐作伴,你的运动就会变得更加轻松愉快。那么,哪种耳机适合运动呢?我正好对此…...

【SQL应知应会】索引 • Oracle版:B-树索引;位图索引;函数索引;单列与复合索引;分区索引
欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 本文免费学习,自发文起3天后,会收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习,有基础也有进阶,有MySQL也有Oracle 索引 • MySQL版 前言一、Oracle索引1.索引概述及分类…...

用ChatGPT做一个Chrome扩展 | 京东云技术团队
用ChatGPT做了个Chrome Extension 最近科技圈儿最火的话题莫过于ChatGPT了。 最近又发布了GPT-4,发布会上的Demo着实吸睛。 笔记本上手画个网页原型,直接生成网页。网友直呼:前端失业了! 但我觉着啊,真就外行看热闹…...

动态库的制作与使用及 动态库加载失败解决
加载动态库时有时会出现error while loading shared libraries:libcalc.so:可以通过lld命令查看动态库的依赖关系,发现libcalc.so时not found 原因 查找的优先级是DT_RPATH->LD_LIBRARY_PATH->/etc/ld.so.cache->/lib/,/usr/lib 找不到一个优…...

404 not found nginx(dist打包后,刷新和跳转都是404 not found nginx的问题) 解决方案(打包发布在服务器)
当我们执行了yarn run build之后,生成dist文件 我们将代码放入nginx-1.24.0下面的html中 然后我们就配置conf文件下的nginx.conf 配置方面不介绍了,主要问题是因为没有加这句话 问题分析 index index.htm index.html; index 就是根目录,也就…...

《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》全文翻译
《Chain-of-Thought Prompting Elicits Reasoning in Large Language Models》- Chain-of-Thought Prompting Elicits Reasoning in Large Language Models 论文信息摘要1. 介绍2. 思维链提示3. 算术推理3.1 实验设置3.2 结果3.3 消融研究3.4 思想链的稳健性 4. 常识推理5. 符号…...

MySQL——笔试测试题
解析: 要查询各科目的最大分数,可以使用如下的SQL语句: SELECT coursename, MAX(score) FROM t_stuscore GROUP BY coursename; 这条SQL语句使用了MAX()聚合函数来获取每个科目的最大分数,并使用GROUP BY子句按照科目进行分组…...

WangEditor在Vue前端的应用
1、在Vue项目中安装WangEditor 对于Vue2: npm install wangeditor/editor-for-vue --save 或者 yarn add wangeditor/editor-for-vue 对于Vue3: npm install wangeditor/editor-for-vuenext --save 或者 yarn add wangeditor/editor-for-vuenext 2、将Wa…...
初学python的感受
目录 初学感受学习计划学习目标 初学感受 刚学python的我惊讶的发现编程语言之间竟有如此多的相似之处,因此在学python的时候相对于学C语言时要轻松的多,虽然二者也有一些不同之处,但是我想只要对二者稍微区分的话应该不会搞混的,并且在学习的过程中也可以借鉴学C语言的方法去…...
SpringSecurity中注解讲解
文章目录 1 EnableGlobalMethodSecurity1.1 PreAuthorize1.1.1 开启注解1.1.2 使用注解原生方法1.1.3 使用注解自定义方法 1.2 PostAuthorize1.3 Secured 2 其他注解2.1 PostFilter2.2 PreFilter 3 权限表达式 1 EnableGlobalMethodSecurity EnableGlobalMethodSecurity 是 Sp…...

朔雪流量复制器的前端
朔雪流量复制器的前端 1. 功能需求简介 本流量复制器使用端口映射模式实现流量复制,可以实现一对一,一对多,和多对一的流量复制模式。 映射网口的多少取决于设备的硬件,最多可以支持36端口。 使用模式包括** 1)从1…...
Anaconda下 Prophet的安装,pystan和fbprophet的版本问题
一、安装pystan conda install pystan2.19.1.1 二、安装fbprophet conda install fbprophet0.7.1 -c conda-forge Prophet有prophet和fbprophet两个包可以安装,我这里用的是fbprophet 三 import fbprophet 后会提示: ERROR:fbprophet:Importing p…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互
物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...