用Python写一个获取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按回车键退出...")