import socket
import psutil
import ipaddress
def getInterface(): # 获取网卡信息
net_if_addrs = psutil.net_if_addrs()
interfaces = []
for k in net_if_addrs:
# a new net_interface
netif = {'name': k}
for v in net_if_addrs[k]: #snicaddr(family=<AddressFamily.AF_LINK: -1>, address='AA-BB-', netmask=None, broadcast=None, ptp=None)
# check address
try:
if v[0] == psutil.AF_LINK: #MAC
netif['mac'] = v[1]
elif v[0] == socket.AddressFamily.AF_INET: #IPv4
v4 = ipaddress.IPv4Address(v[1])
if v4.is_global:
if "ipv4" not in netif:
netif["ipv4"] = []
netif["ipv4"].append({
'ip': v[1],
'type': 'global',
})
elif v4.is_private:
if v4.is_link_local or v4.is_loopback or v4.is_reserved:
continue
if "ipv4" not in netif:
netif["ipv4"] = []
netif["ipv4"].append({
'ip': v[1],
'type': 'private',
})
elif v[0] == socket.AddressFamily.AF_INET6: #IPv6
v6 = ipaddress.IPv6Address(v[1])
if v6.is_global:
if "ipv6" not in netif:
netif["ipv6"] = []
netif["ipv6"].append({
'ip': v[1],
'type': 'global',
})
except Exception:
pass
if "ipv4" in netif or "ipv6" in netif:
interfaces.append(netif)
return interfaces
def getIPs(): # 从网卡信息中读取IP
interfaces = getInterface()
IPs={"global":[],"private":[]}
for i in interfaces:
if "ipv4" in i:
for v4 in i["ipv4"]:
if v4["type"] == "global":
IPs["global"].append({
"ip": v4["ip"],
"name": i["name"],
})
else:
IPs["private"].append({
"ip": v4["ip"],
"name": i["name"],
})
if "ipv6" in i:
for v6 in i["ipv6"]:
if v6["type"] == "global":
IPs["global"].append({
"ip": v6["ip"],
"name": i["name"],
})
return IPs
def getGlobalIPs(): # 获取全局IP地址
IPs = getIPs()['global']
globalIPs = [i['ip'] for i in IPs]
return globalIPs
print(getInterface())
print(getIPs())
print(getGlobalIPs())