Python脚本实现获取IP地址

季宁
季宁
发布时间:2026-10-11| 1人浏览过
原创

本文提供一段 Python 自动化采集脚本,支持快速提取主机名、内网及外网 IPv4/IPv6 地址,并将结构化数据持久化保存。代码内置多节点公网接口轮询与 UDP 连接回退机制,有效应对复杂网络环境,附带完整的依赖安装指引与异常排查方案。

脚本目标与核心逻辑

本工具旨在通过标准化程序自动盘点当前设备的网络标识信息。脚本优先读取本机主机名,随后分两条链路并行探测:一方面调用 socket 模块解析所有物理与虚拟网络接口的私有地址,另一方面向多个高可用的公共 IP 查询服务发起 HTTP 请求以获取出口公网地址。最终结果会自动追加写入至本地文本文件,便于后续日志审计或资产台账管理。

环境准备与依赖安装

脚本运行依赖 Python 3 标准库及第三方 requests 网络请求模块。在确保终端具备基础运行环境的条件下,请按以下顺序完成部署:

第1步:安装外部依赖库

目的:为发起 HTTPS 网络请求提供底层支持。入口:系统终端或集成开发环境命令行。动作:执行包管理器安装指令。重要参数:pip install requests。完成状态:终端返回安装成功提示且无版本冲突警告。

第2步:载入完整采集代码

目的:将探测逻辑固化为本机可执行脚本。入口:新建空白 Python 源文件并保存为 .py 格式。动作:粘贴下方完整代码块并通过终端触发运行。重要参数:注意核对 save_to_file 函数中的文件写入路径,确保目标目录存在且具有读写权限。完成状态:控制台依次打印各网段 IP 列表并提示文件保存成功。

import socket
import requests
import json
import time
from datetime import datetime
 
 
def get_external_ipv4():
    """获取外网IPv4地址"""
    apis = [
        {
            'url': 'https://api.ipify.org?format=json',
            'timeout': 5,
            'headers': {'User-Agent': 'Mozilla/5.0'},
            'json': True,
            'key': 'ip'
        },
        {
            'url': 'https://api4.ipify.org?format=json',
            'timeout': 5,
            'headers': {'User-Agent': 'Mozilla/5.0'},
            'json': True,
            'key': 'ip'
        },
        {
            'url': 'https://ipv4.icanhazip.com',
            'timeout': 5,
            'headers': {'User-Agent': 'curl/7.64.1'}
        }
    ]
 
    for api in apis:
        try:
            print(f"尝试从 {api['url']} 获取外网IPv4...")
            response = requests.get(
                url=api['url'],
                timeout=api['timeout'],
                headers=api['headers']
            )
 
            if response.status_code == 200:
                if api.get('json'):
                    data = response.json()
                    return data[api['key']]
                else:
                    return response.text.strip()
 
        except Exception as e:
            print(f"当前接口请求失败: {str(e)}")
            continue
 
    return "无法获取IPv4地址"
 
 
def get_external_ipv6():
    """获取外网IPv6地址"""
    apis = [
        {
            'url': 'https://api6.ipify.org?format=json',
            'timeout': 5,
            'headers': {'User-Agent': 'Mozilla/5.0'},
            'json': True,
            'key': 'ip'
        },
        {
            'url': 'https://ipv6.icanhazip.com',
            'timeout': 5,
            'headers': {'User-Agent': 'curl/7.64.1'}
        }
    ]
 
    for api in apis:
        try:
            print(f"尝试从 {api['url']} 获取外网IPv6...")
            response = requests.get(
                url=api['url'],
                timeout=api['timeout'],
                headers=api['headers']
            )
 
            if response.status_code == 200:
                if api.get('json'):
                    data = response.json()
                    return data[api['key']]
                else:
                    return response.text.strip()
 
        except Exception as e:
            print(f"当前接口请求失败: {str(e)}")
            continue
 
    return "无法获取IPv6地址"
 
 
def get_internal_ips():
    """获取内网IP地址(同时获取IPv4和IPv6)"""
    internal_ips = {'ipv4': [], 'ipv6': []}
 
    try:
        # 获取所有网络接口的所有IP
        hostname = socket.gethostname()
        addrs = socket.getaddrinfo(hostname, None)
 
        for addr in addrs:
            ip = addr[4][0]
            # 判断是否为IPv6地址
            if ':' in ip:
                if not ip.startswith('fe80:') and not ip.startswith('::1'):
                    if ip not in internal_ips['ipv6']:
                        internal_ips['ipv6'].append(ip)
            else:
                if not ip.startswith('127.'):
                    if ip not in internal_ips['ipv4']:
                        internal_ips['ipv4'].append(ip)
 
        # 使用备用方法获取IPv4
        if not internal_ips['ipv4']:
            try:
                s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                s.connect(("8.8.8.8", 80))
                ip = s.getsockname()[0]
                s.close()
                if ip not in internal_ips['ipv4']:
                    internal_ips['ipv4'].append(ip)
            except:
                pass
 
    except Exception as e:
        print(f"获取内网IP出错: {str(e)}")
 
    return internal_ips
 
 
def save_to_file(data):
    """保存信息到文件"""
    try:
        with open('../办公与多媒体/ip_info.txt', 'a', encoding='utf-8') as f:
            f.write(f"\n{'=' * 50}\n")
            f.write(f"检测时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}\n")
            f.write(f"主机名: {data['hostname']}\n\n")
 
            f.write("内网IPv4地址:\n")
            for ip in data['internal_ipv4']:
                f.write(f"  - {ip}\n")
 
            f.write("\n内网IPv6地址:\n")
            for ip in data['internal_ipv6']:
                f.write(f"  - {ip}\n")
 
            f.write(f"\n外网IPv4: {data['external_ipv4']}\n")
            f.write(f"外网IPv6: {data['external_ipv6']}\n")
            f.write(f"{'=' * 50}\n")
 
    except Exception as e:
        print(f"保存文件时出错: {str(e)}")
 
 
def main():
    try:
        print("开始获取网络信息...\n")
 
        # 获取主机名
        hostname = socket.gethostname()
        print(f"主机名: {hostname}\n")
 
        # 获取内网IP
        internal_ips = get_internal_ips()
        print("内网IPv4地址:")
        for ip in internal_ips['ipv4']:
            print(f"  - {ip}")
 
        print("\n内网IPv6地址:")
        for ip in internal_ips['ipv6']:
            print(f"  - {ip}")
 
        # 获取外网IP
        print("\n正在获取外网IP...")
        external_ipv4 = get_external_ipv4()
        external_ipv6 = get_external_ipv6()
 
        print(f"\n外网IPv4: {external_ipv4}")
        print(f"外网IPv6: {external_ipv6}")
 
        # 保存信息到文件
        data = {
            'hostname': hostname,
            'internal_ipv4': internal_ips['ipv4'],
            'internal_ipv6': internal_ips['ipv6'],
            'external_ipv4': external_ipv4,
            'external_ipv6': external_ipv6
        }
        save_to_file(data)
        print("\n信息已保存到 ip_info.txt 文件")
 
    except Exception as e:
        print(f"程序执行出错: {str(e)}")
 
    input("\n按回车键退出...")
 

if __name__ == "__main__":
    # 确保已安装requests库
    # pip install requests
 
    main()

结果确认与输出解析

脚本正常执行完毕后,终端将按固定格式逐行打印检测结果。数据会自动追加保存至 ip_info.txt 文件中,每条记录由分隔线包裹,并附带精确到秒的时间戳。用户可通过任意文本编辑器查看历史累积数据,适用于网络设备巡检或网络架构变更记录留存。

常见问题与排错说明

在实际网络环境中运行本脚本时,若发现字段缺失或请求超时,可对照以下情形进行排查:

  • 网络连接限制:外网 IP 探测严格依赖互联网连通性。若设备处于断网或隔离 VLAN 中,公网字段将稳定返回 无法获取IPvX地址。
  • 企业网关与安全组拦截:部分公司网络策略会屏蔽非标准端口的出站流量。若所有公共接口均显示请求失败,请检查防火墙或零信任网关的 HTTPS(443) 出站白名单是否放行。
  • 代理与 VPN 干扰:当系统全局代理生效时,脚本向外发出的请求将强制走代理出口节点,此时获取到的公网 IP 实为代理服务器地址而非本机真实出口 IP。
  • IPv6 协议栈差异:若当前运营商或路由器未分配 IPv6 地址,相关探测模块会自动降级并返回特定提示,不影响 IPv4 数据的完整性。
  • 权限与多网卡冗余:操作系统的管理员权限有时对解析特定虚拟适配器至关重要。此外,多网卡共存场景下输出多条内网 IP 属于正常现象,脚本已内置去重逻辑过滤本地回环地址。

以上就是Python脚本实现获取IP地址的详细内容,更多关于Python网络信息采集的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。