import re import socket import urllib.parse from typing import Optional, Tuple class NetworkUtil: """网络工具类""" @staticmethod def is_valid_ip(ip: str) -> bool: """验证IP地址格式 Args: ip: IP地址 Returns: bool: 是否为有效IP地址 """ try: socket.inet_aton(ip) return True except socket.error: return False @staticmethod def extract_domain(url: str) -> Optional[str]: """从URL中提取域名 Args: url: 完整URL Returns: 提取的域名,如果解析失败返回None """ try: parsed = urllib.parse.urlparse(url) if parsed.netloc: return parsed.netloc return None except Exception: return None @staticmethod def is_valid_url(url: str) -> bool: """验证URL格式 Args: url: 要验证的URL Returns: bool: 是否为有效URL """ pattern = re.compile( r'^(?:http|ftp)s?://' # http:// or https:// r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain... r'localhost|' # localhost... r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip r'(?::\d+)?' # optional port r'(?:/?|[/?]\S+)$', re.IGNORECASE) return bool(re.match(pattern, url)) @staticmethod def get_ip_info(ip: str) -> Optional[Tuple[str, str]]: """获取IP地址的地理位置信息 Args: ip: IP地址 Returns: 包含国家和城市的元组,如果获取失败返回None """ try: # 这里可以集成第三方IP查询服务 # 示例返回 return ('China', 'Beijing') except Exception: return None