Files
mini_code/tools.py
ddrwode 984223c720 haha
2026-02-03 13:09:01 +08:00

82 lines
2.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import socket
import psutil
import re
class NetworkIPGetter:
"""网络IP获取器"""
def __init__(self):
self.interfaces = psutil.net_if_addrs()
def get_wlan_ip(self):
"""获取无线网卡IP优先。Windows: WLAN/Wi-FimacOS: en0/en1通常为 Wi-Fi"""
return self._get_interface_ip(['WLAN', 'Wi-Fi', 'WiFi', 'Wireless', 'en0', 'en1'])
def get_ethernet_ip(self):
"""获取有线网卡IP。Windows: EthernetLinux: eth/enpmacOS: en2/en3 等"""
return self._get_interface_ip(['Ethernet', '以太网', 'eth', 'enp', 'en2', 'en3', 'en4'])
def _get_interface_ip(self, keywords):
"""根据关键词查找接口IP按 keywords 顺序优先匹配)"""
for keyword in keywords:
kw_lower = keyword.lower()
for iface_name, addrs in self.interfaces.items():
if kw_lower in iface_name.lower():
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}")