Python脚本实现获取IP地址

 更新时间:2025年03月07日 11:01:56   作者:穿梭的编织者  
这篇文章主要为大家详细介绍了如何基于Python编写一个脚本,可以实现获取主机名、外网IP(通过多个公共API尝试) IPV4和IPV6以及所有网络接口的内网IP,感兴趣的可以了解下

一、脚本功能

1.获取主机名

2.获取外网IP(通过多个公共API尝试) IPV4和IPV6

3.获取所有网络接口的内网IP

4.保存至文件并打印信息

输出示例:

主机名: MyComputer

内网IPv4地址:
  - 192.168.1.100
  - 192.168.56.1

内网IPv6地址:
  - 2001:0db8:85a3:0000:0000:8a2e:0370:7334

外网IPv4: 203.0.113.1
外网IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334

二、注意事项

1.获取外网IP需要网络连接

2.某些网络环境可能会阻止访问IP查询服务

3.如果在代理或VPN环境下,获取的外网IP可能是代理或VPN的IP

4.内网IP可能会有多个,特别是在有多个网络接口的情况下

5.考虑暂时关闭防火墙

6.如果你的网络不支持 IPv6,那么相关的 IPv6 地址将显示为"无法获取"

7.某些系统可能需要管理员权限才能获取完整的网络接口信息

三、准备工作

导入库:

import socket
import requests
import json
import time
from datetime import datetime

四、完整代码

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)}")
 
 
if __name__ == "__main__":
    # 确保已安装requests库
    # pip install requests
 
    main()
 
    # 等待用户按键退出
    input("\n按回车键退出...")

以上就是Python脚本实现获取IP地址的详细内容,更多关于Python获取IP地址的资料请关注脚本之家其它相关文章!

相关文章

  • 用Python每天自动给女友免费发短信

    用Python每天自动给女友免费发短信

    大家好,本篇文章主要讲的是用Python每天自动给女友免费发短信,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • 两种方法检查Python中的变量是否为字符串

    两种方法检查Python中的变量是否为字符串

    在 Python 中,每个变量都有一个数据类型, 数据类型表示变量内部存储的数据类型,本文通过示例介绍两种不同的方法来检查 Python 中的变量是否为字符串,感兴趣的朋友一起看看吧
    2023-11-11
  • python编程普通及类和静态方法示例详解

    python编程普通及类和静态方法示例详解

    普通方法会将实例传入方法当中(通常用self表示),类方法会将类传入方法当中(通常用cls表示),静态方法中传入与类无关的变量。下面将举例详细说明
    2021-10-10
  • Appium自动化测试实现九宫格解锁

    Appium自动化测试实现九宫格解锁

    本文主要介绍了Appium自动化测试实现九宫格解锁,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • Python图片文字识别与提取实战记录

    Python图片文字识别与提取实战记录

    这篇文章主要介绍了Python图片文字识别与提取的相关资料,本文介绍了如何安装和配置OCR环境,包括安装pytesseract扩展包、窗口配套软件以及配置环境变量,在完成环境搭建后,即可进行图片中文字的提取,需要的朋友可以参考下
    2024-09-09
  • python数据XPath使用案例详解

    python数据XPath使用案例详解

    xpath是最常用且最便捷高效的一种解析方式,通用型强,其不仅可以用于python语言中,还可以用于其他语言中,数据解析建议首先xpath
    2021-09-09
  • python搭建项目的虚拟环境

    python搭建项目的虚拟环境

    本文主要介绍了python搭建项目的虚拟环境,主要就是在多个项目中进行一个隔离,防止包的版本冲突或者其他情况,下面就来介绍一下具体步骤,感兴趣的可以了解一下
    2024-03-03
  • 使用pyplot.matshow()函数添加绘图标题

    使用pyplot.matshow()函数添加绘图标题

    这篇文章主要介绍了使用pyplot.matshow()函数添加绘图标题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python transpose()处理高维度数组的轴变换的实现

    python transpose()处理高维度数组的轴变换的实现

    本文主要介绍了python transpose()处理高维度数组的轴变换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-09-09
  • Pytorch中Tensor与各种图像格式的相互转化详解

    Pytorch中Tensor与各种图像格式的相互转化详解

    这篇文章主要介绍了Pytorch中Tensor与各种图像格式的相互转化详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论