12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- 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
|