首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >30 行 Python 代码搞定 IP 查询,附实用工具推荐

30 行 Python 代码搞定 IP 查询,附实用工具推荐

原创
作者头像
用户11810877
发布2025-08-28 22:00:57
发布2025-08-28 22:00:57
4690
举报

作为开发多年的程序员,处理 IP 相关的需求简直是家常便饭。不管是做用户行为分析,还是限制异地登录,都离不开IP 地址查询功能。今天就分享一个自己常用的 IP 查询方案,包括 Python 实现代码和一个超好用的在线工具。

为什么需要 IP 查询功能?

别以为IP 查询只是运维的事,实际开发中用处多着呢。做用户画像时,需要通过 IP 判断用户大致地理位置;做安全防护时,要识别异常 IP 的登录行为;甚至做内容推荐,也得根据用户所在地区推送合适的内容。

之前接手过一个项目,需要限制同一 IP 的高频访问。最初用的第三方接口延迟太高,后来自己写了一套轻量查询工具,响应速度提升了 70%。其实很多时候,我们不需要太复杂的功能,能快速获取IP 归属地和基本信息就够了。

Python 实现高效 IP 查询工具

分享一个我封装的 IP 查询类,核心代码不到 30 行,支持查询本机 IP 和指定 IP 信息:

python

代码语言:javascript
复制
import requests
import json

class IPInfoTool:
    def __init__(self):
        # 接口超时设置为3秒,避免影响主程序
        self.timeout = 3
        # 备用接口列表,提高稳定性
        self.api_list = [
            "https://www.nimail.cn/api/ipinfo",
            "https://ipapi.co/{ip}/json/"
        ]
    
    def get_local_ip(self):
        """获取本机公网IP"""
        try:
            # 使用第一个接口获取本机IP
            response = requests.get(
                self.api_list[0],
                params={"local": 1},
                timeout=self.timeout
            )
            if response.status_code == 200:
                data = response.json()
                return data.get("ip", "获取失败")
            # 接口调用失败时切换备用方案
            response = requests.get("https://api.ipify.org?format=json", timeout=self.timeout)
            return response.json().get("ip", "获取失败")
        except Exception as e:
            print(f"获取本机IP出错: {str(e)}")
            return None
    
    def query_ip_info(self, ip=None):
        """查询指定IP或本机IP的详细信息"""
        if not ip:
            ip = self.get_local_ip()
            if not ip:
                return None
        
        for api in self.api_list:
            try:
                # 处理不同接口的URL格式
                if "{ip}" in api:
                    url = api.format(ip=ip)
                    response = requests.get(url, timeout=self.timeout)
                else:
                    response = requests.get(
                        api,
                        params={"ip": ip},
                        timeout=self.timeout
                    )
                
                if response.status_code == 200:
                    return self._format_info(response.json())
            except Exception as e:
                print(f"接口 {api} 调用失败: {str(e)}")
                continue
        
        return None
    
    def _format_info(self, raw_data):
        """格式化IP信息,提取关键字段"""
        # 统一不同接口的返回格式
        info_map = {
            "ip": raw_data.get("ip", ""),
            "country": raw_data.get("country", raw_data.get("country_name", "")),
            "region": raw_data.get("region", raw_data.get("region_name", "")),
            "city": raw_data.get("city", ""),
            "isp": raw_data.get("isp", raw_data.get("org", ""))
        }
        return info_map

# 使用示例
if __name__ == "__main__":
    ip_tool = IPInfoTool()
    
    # 查询本机IP
    local_ip = ip_tool.get_local_ip()
    print(f"本机IP: {local_ip}")
    
    # 查询详细信息
    ip_info = ip_tool.query_ip_info()
    if ip_info:
        print("\nIP详细信息:")
        print(f"IP地址: {ip_info['ip']}")
        print(f"归属地: {ip_info['country']} {ip_info['region']} {ip_info['city']}")
        print(f"运营商: {ip_info['isp']}")

这个工具的特点是稳定性高,内置了备用接口机制,一个接口挂了会自动切换到下一个。我特意做了格式化处理,不管调用哪个接口,返回的字段都是统一的,省去了适配不同接口格式的麻烦。

推荐一个实用 IP 查询工具

平时调试的时候,我常常用nimail.cn 的 IP 查询工具做快速验证。这个工具界面简洁,打开就能显示当前 IP和详细归属地信息,包括城市和运营商,甚至能看到经纬度定位。

最方便的是它支持批量查询,有时候需要验证一批 IP 的归属地,直接复制粘贴进去就行,比自己写脚本效率高多了。而且响应速度很快,基本是毫秒级返回,对于快速排查问题非常友好。

其实不管是自己写代码还是用现成工具,关键是要选对适合场景的方案。批量处理或者集成到系统里,用 Python 脚本更合适;临时查询或者验证结果,在线工具更方便。这两种方式我都一直在用,配合起来效率翻倍。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 为什么需要 IP 查询功能?
  • Python 实现高效 IP 查询工具
  • 推荐一个实用 IP 查询工具
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档