在网络安全、网络调试和系统管理场景中,快速获取本机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




















