在网络安全、网络调试和系统管理场景中,快速获取本机IP地址信息是高频需求。本文将ZHANID工具网通过Python实现一个跨平台的IP查询工具,支持获取本地网络IP、公网IP及地理位置信息,并详细解析技术实现原理。
一、工具功能设计
1. 核心功能清单
本地IP地址查询(支持IPv4/IPv6)
公网IP地址查询
IP地理位置信息解析
网络接口状态检测
跨平台兼容性(Windows/macOS/Linux)
2. 技术选型
网络接口查询:
psutil
库(跨平台网络接口信息)公网IP获取:
requests
库调用第三方API地理位置解析:
ipinfo.io
免费API服务命令行交互:
argparse
库构建CLI
二、完整代码实现
# ip_query_tool.py import socket import psutil import platform import argparse import requests from typing import Optional, Dict class IPQueryTool: def __init__(self): self.public_ip_api = "https://ipinfo.io/json" self.local_ips = self.get_local_ips() self.public_ip_info = self.get_public_ip_info() @staticmethod def get_local_ips() -> Dict[str, str]: """获取所有本地网络接口IP地址""" ips = {"IPv4": [], "IPv6": []} for interface, addrs in psutil.net_if_addrs().items(): for addr in addrs: if addr.family in [socket.AF_INET, socket.AF_INET6]: ip_type = "IPv6" if addr.family == socket.AF_INET6 else "IPv4" if not addr.ip.startswith("127.") and addr.ip.count(":") < 4: ips[ip_type].append(f"{interface}: {addr.ip}") return {k: v if v else ["N/A"] for k, v in ips.items()} def get_public_ip_info(self) -> Dict[str, str]: """获取公网IP及地理位置信息""" try: response = requests.get(self.public_ip_api, timeout=5) response.raise_for_status() data = response.json() return { "Public IP": data.get("ip", "N/A"), "City": data.get("city", "N/A"), "Region": data.get("region", "N/A"), "Country": data.get("country", "N/A"), "ISP": data.get("org", "N/A") } except (requests.RequestException, ValueError): return {"error": "Failed to retrieve public IP information"} def get_active_interface(self) -> Optional[str]: """检测默认活动网络接口""" for interface, addrs in psutil.net_if_addrs().items(): for addr in addrs: if addr.family == socket.AF_INET and not addr.ip.startswith("127."): stats = psutil.net_if_stats().get(interface) if stats and stats.isup: return interface return "N/A" def display_info(self) -> None: """格式化输出所有IP信息""" system = platform.system() print(f"=== {system} 系统IP信息查询工具 ===") print(f"操作系统: {platform.platform()}") print("\n【本地网络信息】") print(f"活动网络接口: {self.get_active_interface()}") for ip_type, addresses in self.local_ips.items(): print(f"\n{ip_type} 地址:") for addr in addresses: print(f" - {addr}") print("\n【公网IP信息】") if "error" in self.public_ip_info: print(f" - 错误: {self.public_ip_info['error']}") else: for key, value in self.public_ip_info.items(): print(f" - {key}: {value}") if __name__ == "__main__": parser = argparse.ArgumentParser(description="IP地址查询工具") parser.add_argument("-v", "--verbose", action="store_true", help="显示详细信息") args = parser.parse_args() tool = IPQueryTool() tool.display_info()
三、核心技术解析
1. 本地IP地址获取
psutil.net_if_addrs() # 获取所有网络接口地址
遍历所有网络接口,过滤回环地址(127.x.x.x)
区分IPv4/IPv6地址(socket.AF_INET/socket.AF_INET6)
智能过滤虚拟接口和未激活接口
2. 公网IP查询
requests.get("https://ipinfo.io/json")
调用ipinfo.io免费API获取公网IP及地理位置
设置5秒超时防止网络卡顿
异常处理机制保证程序健壮性
3. 活动接口检测
psutil.net_if_stats()[interface].isup # 检测接口状态
结合地址信息和接口状态判断实际使用中的网络接口
优先返回物理网卡而非虚拟接口
4. 跨平台兼容
platform.system() # 自动检测操作系统
使用psutil库统一不同系统的网络接口差异
适配Windows/Linux/macOS的接口命名规则
四、使用说明
1. 依赖安装
pip install psutil requests
2. 基础使用
python ip_query_tool.py
3. 高级选项
python ip_query_tool.py -v # 显示详细网络信息
五、输出示例
=== Windows 系统IP信息查询工具 === 操作系统: Windows-10-10.0.19045-SP0 【本地网络信息】 活动网络接口: Ethernet0 IPv4 地址: - Ethernet0: 192.168.1.100 - VirtualBox: 10.0.2.15 IPv6 地址: - N/A 【公网IP信息】 - Public IP: 203.0.113.42 - City: Beijing - Region: Beijing - Country: CN - ISP: China Telecom
六、扩展应用场景
网络诊断:快速定位IP冲突或网络配置错误
安全审计:记录公网IP变更历史
自动化脚本:集成到DevOps流程中
教学演示:网络基础课程实践工具
七、注意事项
第三方API限制:ipinfo.io免费版每秒请求限制为50次
隐私保护:公网IP查询结果可能包含ISP信息
权限要求:Linux系统可能需要sudo权限获取完整接口信息
本文实现的IP查询工具通过模块化设计,既可作为独立脚本使用,也可集成到更大规模的网络管理系统中。开发者可根据实际需求扩展功能,如添加IP归属地数据库、历史记录查询等模块。
本文由@战地网 原创发布。
该文章观点仅代表作者本人,不代表本站立场。本站不承担相关法律责任。
如若转载,请注明出处:https://www.zhanid.com/biancheng/4297.html