基于Python开发电脑ip地址查询工具示例代码详解

原创 2025-05-20 10:06:22编程技术
430

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

python.webp

四、使用说明

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

六、扩展应用场景

  1. 网络诊断:快速定位IP冲突或网络配置错误

  2. 安全审计:记录公网IP变更历史

  3. 自动化脚本:集成到DevOps流程中

  4. 教学演示:网络基础课程实践工具

七、注意事项

  1. 第三方API限制:ipinfo.io免费版每秒请求限制为50次

  2. 隐私保护:公网IP查询结果可能包含ISP信息

  3. 权限要求:Linux系统可能需要sudo权限获取完整接口信息

本文实现的IP查询工具通过模块化设计,既可作为独立脚本使用,也可集成到更大规模的网络管理系统中。开发者可根据实际需求扩展功能,如添加IP归属地数据库、历史记录查询等模块。

Python
THE END
战地网
频繁记录吧,生活的本意是开心

相关推荐

Python BeautifulSoup中select()与select_one()的区别详解(超详细)
在Python网络爬虫开发中,BeautifulSoup库的CSS选择器方法select()和select_one()是解析HTML文档的核心工具。虽然两者都基于CSS选择器语法,但在返回值类型、使用场景和性能表...
2025-06-23 编程技术
218

基于Python搭建MCP服务器的详细步骤指南
MCP(Model Context Protocol)作为一种专为智能应用设计的通信协议,以其轻量级和高适应性受到广泛关注。本文ZHANID工具网将详细介绍如何基于Python搭建MCP服务器,从环境准...
2025-06-22 编程技术
227

Python+pyserial实现模拟串口通信的示例代码详解
在嵌入式系统开发、工业自动化和物联网设备调试中,串口通信是设备间数据交互的基础技术。Python通过pyserial库提供了强大的串口通信支持,本文ZHANID工具网将结合实际案例,...
2025-06-22 编程技术
228

Python实现将xml转换成xlsx的方法详解
在数据处理和转换场景中,将XML格式数据转换为Excel(XLSX)格式是常见需求。本文ZHANID工具网将详细介绍使用Python实现这一转换的多种方法,涵盖基础实现、高级功能及性能优...
2025-06-21 编程技术
236

Nano-vLLM:1200行Python代码实现的高性能轻量级大模型推理引擎
Nano-vLLM是由DeepSeek AI研究员俞星凯开发的轻量级大语言模型(LLM)推理框架,作为当前最简洁的vLLM实现方案之一,其核心创新在于仅用1200行Python代码即复现了原版vLLM的核心...
2025-06-16 新闻资讯
297

Python可以做网站吗?Python开发网站效率高吗?
在Web开发领域,Python凭借其简洁的语法、丰富的生态和高效的开发模式,逐渐成为中小型项目和快速原型开发的首选语言。从个人博客到企业级应用,Python的Web框架和工具链已展...
2025-06-16 编程技术
241