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

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

在网络安全、网络调试和系统管理场景中,快速获取本机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 yield 用法大全:轻松掌握生成器与迭代器设计
在Python中,yield关键字是构建生成器的核心工具,它通过状态保存机制实现了高效的内存管理和惰性计算。与传统的迭代器实现相比,yield能将迭代器设计从复杂的类定义简化为直...
2025-09-15 编程技术
547

基于Python的旅游数据分析可视化系统【2026最新】
本研究成功开发了基于Python+Django+Vue+MySQL的旅游数据分析可视化系统,实现了从数据采集到可视化展示的全流程管理。系统采用前后端分离架构,前端通过Vue框架构建响应式界...
2025-09-13 编程技术
571

手把手教你用Python读取txt文件:从基础到实战的完整教程
Python作为数据处理的利器,文件读写是其基础核心功能。掌握txt文件读取不仅能处理日志、配置文件等常见场景,更是理解Python文件I/O的基石。本文ZHANID工具网将从基础语法到...
2025-09-12 编程技术
543

Python Flask 入门指南:从零开始搭建你的第一个 Web 应用
Flask作为 Python 中最轻量级且灵活的 Web 框架之一,特别适合初学者快速上手 Web 应用开发。本文将带你一步步了解如何在本地环境中安装 Flask、创建一个简单的 Web 应用,并...
2025-09-11 编程技术
532

Python 如何调用 MediaPipe?详细安装与使用指南
MediaPipe 是 Google 开发的跨平台机器学习框架,支持实时处理视觉、音频和文本数据。本文脚本之家将系统讲解 Python 环境下 MediaPipe 的安装、配置及核心功能调用方法,涵盖...
2025-09-10 编程技术
575

基于Python开发一个利率计算器的思路及示例代码
利率计算是金融领域的基础需求,涵盖贷款利息、存款收益、投资回报等场景。传统计算依赖手工公式或Excel表格,存在效率低、易出错等问题。Python凭借其简洁的语法和强大的数学...
2025-09-09 编程技术
515