Files
mini_code/test.py

82 lines
2.5 KiB
Python
Raw Normal View History

2026-01-09 14:40:20 +08:00
import socket
import psutil
import re
class NetworkIPGetter:
"""网络IP获取器"""
def __init__(self):
self.interfaces = psutil.net_if_addrs()
def get_wlan_ip(self):
"""获取无线网卡IP优先"""
return self._get_interface_ip(['WLAN', 'Wi-Fi', 'WiFi', 'Wireless'])
def get_ethernet_ip(self):
"""获取有线网卡IP"""
return self._get_interface_ip(['Ethernet', '以太网', 'eth', 'enp'])
def _get_interface_ip(self, keywords):
"""根据关键词查找接口IP"""
for iface_name, addrs in self.interfaces.items():
iface_lower = iface_name.lower()
if any(keyword.lower() in iface_lower for keyword in keywords):
for addr in addrs:
if addr.family == socket.AF_INET:
# 排除一些虚拟/私有地址
if not self._is_virtual_ip(addr.address):
return addr.address
return None
def _is_virtual_ip(self, ip):
"""判断是否为虚拟/私有IP"""
private_patterns = [
r'^127\.', # 回环地址
r'^192\.168\.', # 私有C类
r'^172\.(1[6-9]|2[0-9]|3[0-1])\.', # 私有B类
r'^10\.', # 私有A类
r'^169\.254\.', # 链路本地
]
for pattern in private_patterns:
if re.match(pattern, ip):
return False # 私有IP也是有效的WLAN地址
return False
def get_preferred_ip(self):
"""获取首选网络IP优先WLAN其次有线"""
ip = self.get_wlan_ip()
if not ip:
ip = self.get_ethernet_ip()
return ip or "127.0.0.1"
def get_all_ips(self):
"""获取所有网络接口的IPv4地址"""
result = {}
for iface_name, addrs in self.interfaces.items():
for addr in addrs:
if addr.family == socket.AF_INET:
if iface_name not in result:
result[iface_name] = []
result[iface_name].append({
'address': addr.address,
'netmask': addr.netmask,
'broadcast': addr.broadcast
})
return result
# 使用示例
if __name__ == "__main__":
getter = NetworkIPGetter()
# 获取WLAN IP
wlan_ip = getter.get_wlan_ip()
print(f"WLAN IPv4地址: {wlan_ip}")
# 获取首选IP
main_ip = getter.get_preferred_ip()
print(f"首选IP地址: {main_ip}")