network_util.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. import re
  2. import socket
  3. import urllib.parse
  4. from typing import Optional, Tuple
  5. class NetworkUtil:
  6. """网络工具类"""
  7. @staticmethod
  8. def is_valid_ip(ip: str) -> bool:
  9. """验证IP地址格式
  10. Args:
  11. ip: IP地址
  12. Returns:
  13. bool: 是否为有效IP地址
  14. """
  15. try:
  16. socket.inet_aton(ip)
  17. return True
  18. except socket.error:
  19. return False
  20. @staticmethod
  21. def extract_domain(url: str) -> Optional[str]:
  22. """从URL中提取域名
  23. Args:
  24. url: 完整URL
  25. Returns:
  26. 提取的域名,如果解析失败返回None
  27. """
  28. try:
  29. parsed = urllib.parse.urlparse(url)
  30. if parsed.netloc:
  31. return parsed.netloc
  32. return None
  33. except Exception:
  34. return None
  35. @staticmethod
  36. def is_valid_url(url: str) -> bool:
  37. """验证URL格式
  38. Args:
  39. url: 要验证的URL
  40. Returns:
  41. bool: 是否为有效URL
  42. """
  43. pattern = re.compile(
  44. r'^(?:http|ftp)s?://' # http:// or https://
  45. r'(?:(?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+(?:[A-Z]{2,6}\.?|[A-Z0-9-]{2,}\.?)|' # domain...
  46. r'localhost|' # localhost...
  47. r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})' # ...or ip
  48. r'(?::\d+)?' # optional port
  49. r'(?:/?|[/?]\S+)$',
  50. re.IGNORECASE)
  51. return bool(re.match(pattern, url))
  52. @staticmethod
  53. def get_ip_info(ip: str) -> Optional[Tuple[str, str]]:
  54. """获取IP地址的地理位置信息
  55. Args:
  56. ip: IP地址
  57. Returns:
  58. 包含国家和城市的元组,如果获取失败返回None
  59. """
  60. try:
  61. # 这里可以集成第三方IP查询服务
  62. # 示例返回
  63. return ('China', 'Beijing')
  64. except Exception:
  65. return None