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}")