Python脚本实现获取IP地址
本文提供一段 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网络信息采集的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













