php获取客户端ip地址及ip所在国家、省份、城市、县区

这篇具有很好参考价值的文章主要介绍了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}.htm
    function 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文章来源地址https://www.toymoban.com/news/detail-702223.html

到了这里,关于php获取客户端ip地址及ip所在国家、省份、城市、县区的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java WebSocket 获取客户端 IP 地址

    在开发 Web 应用程序时,我们通常需要获取客户端的 IP 地址用于日志记录、身份验证、限制访问等操作。当使用 WebSocket 协议时,我们可以使用 Java WebSocket API 来获取客户端的 IP 地址。 本文将介绍如何使用 Java WebSocket API 获取客户端 IP 地址,以及如何在常见的 WebSocket 框架中

    2024年02月05日
    浏览(34)
  • 获取客户端真实 IP 地址的最佳实践

    1. 业务上云带来性能收益 公司从去年全面推动业务上云,而以往 IDC 架构部署上,接入层采用典型的 4 层 LVS 多机房容灾架构,在业务高峰时期,扩容困难(受限于物理机资源和 LVS 内网网段的网络规划),且抵挡不住 HTTPS 卸载引发的高 CPU 占用。 而经过压力测试发现,使用

    2024年02月05日
    浏览(43)
  • 【Java开发】之获取客户端真实 IP 地址

    在投票系统开发中,为了防止刷票,我们需要限制每个 IP 地址只能投票一次; 当网站受到诸如 DDoS(Distributed Denial of Service,分布式拒绝服务攻击)等攻击时,我们需要快速定位攻击者 IP; 在渗透测试过程中,经常会碰到网站有 CDN(Content Distribution Network,内容交付网络),

    2024年02月04日
    浏览(37)
  • Nginx代理后获取客户端真实IP地址

    在项目实际应用中,我们可能会需要获取到用户也就是客户端的真实IP地址,比如记录系统操作日志等情况。 通常情况下我们可以使用以下方式来获取IP地址 但是当我们使用Nginx反向代理项目地址后,使用以上方法只能获取到Nginx服务器的IP地址,并不是客户端的IP地址。 解决

    2023年04月11日
    浏览(36)
  • Qt 获取本机 ip地址方法 获取客户端ip和端口的方法

    上述函数返回本机所有IPv4的ip地址列表,比如192.168.1.10|192.166.1.95 其它方法=》 获取客户端IP地址:

    2024年02月14日
    浏览(30)
  • ASP.NET 获取客户端IP、MAC地址

      qqwry.dat 纯真IP数据库下载地址:   

    2024年02月15日
    浏览(35)
  • .net core WebAPI 获取客户端IP的地址

    1、写个扩展方法在控制器里面: 注:不能创建外部类,否则会报错,HttpContext必须是和带有继承ControllerBase的类一起才行 1.在Startup.cs文件里注入服务: 2、去控制器里面写入:

    2024年02月03日
    浏览(36)
  • Docker部署Nginx,无法获取客户端真实ip地址

    在部署docker版本nginx进行请求转发,意外发现nginx打印日志中的客户端ip并非为客户端的真实ip(221.237.xxx.xxx),而是docker虚拟网卡的ip(172.17.0.1) 开始猜测是nginx配置问题,对比其他环境,发现配置相同,但其他环境未出现此情况 通过查询资料,推测是docker网桥和linux防火墙存在

    2023年04月21日
    浏览(26)
  • Java编程技巧:获取ip地址、通过ip获取地理位置、获取客户端操作系统、获取客户端浏览器、获取主机名、获取操作系统、获取系统架构

    说明: 大家直接去对应项目位置找到代码,然后看着复制就行了 1.1、若依(自己写的代码) 项目:https://gitee.com/y_project/RuoYi 子模块:ruoyi-common 所在类:com.ruoyi.common.utils.IpUtils 所在方法:getIpAddr 详细位置:整个方法 1.2、Snowy(借助hutool工具包) 项目:https://gitee.com/xiaonuo

    2024年02月04日
    浏览(51)
  • SOCKET通信中的各种ip问题,服务端获取客户端ip地址

            在进行socket网络通信的时候,我们经常需要获取ip地址,下面介绍一些获取ip地址的方法。 1.自动获取本机ip地址         可以获取本地所有ip地址,可根据自己需求取出ip。 2.在绑定套接字的时候,要获取本机ip         可用INADDR_ANY,宏INADDR_ANY转换过来就是

    2024年02月12日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包