sites.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. """站点清单与地址解析。
  2. 四个线上地址共享同一个数据库和同一把 jwt 密钥,凭据完全通用;
  3. .org / .cc 是地区可达性,www / next 是代码版本(不是数据环境)。
  4. 开发机是另一个库、另一把密钥,故单独一桶,且永不作为自动 fallback 目标。
  5. """
  6. import urllib.parse
  7. from errors import WpError
  8. SITES = [
  9. {"key": "www", "url": "https://www.wikipali.org/api", "version": "稳定版", "domain": ".org"},
  10. {"key": "www.cc", "url": "https://www.wikipali.cc/api", "version": "稳定版", "domain": ".cc"},
  11. {"key": "next", "url": "https://next.wikipali.org/api", "version": "最新版", "domain": ".org"},
  12. {"key": "next.cc", "url": "https://next.wikipali.cc/api", "version": "最新版", "domain": ".cc"},
  13. {"key": "local", "url": "http://127.0.0.1:8000/api", "version": "开发机", "domain": "本机"},
  14. ]
  15. ONLINE_URLS = [s["url"] for s in SITES if s["key"] != "local"]
  16. LOCAL_URL = SITES[-1]["url"]
  17. DEFAULT_API_URL = SITES[0]["url"]
  18. def normalize_api_url(url):
  19. url = url.rstrip("/")
  20. parsed = urllib.parse.urlparse(url)
  21. if parsed.scheme not in ("http", "https"):
  22. raise WpError(f"API 地址必须以 http:// 或 https:// 开头:{url}")
  23. host = (parsed.hostname or "").lower()
  24. if parsed.scheme == "http" and host not in ("127.0.0.1", "localhost", "::1"):
  25. raise WpError(f"只有 127.0.0.1 / localhost 允许用 http://,其余必须 https://:{url}")
  26. return url
  27. def expand_site_alias(value):
  28. """把序号 / 简称展开成完整 url;已是 url 则原样返回。"""
  29. value = value.strip()
  30. if value.isdigit():
  31. idx = int(value) - 1
  32. if 0 <= idx < len(SITES):
  33. return SITES[idx]["url"]
  34. raise WpError(f"站点序号超出范围:{value}(可选 1-{len(SITES)})")
  35. for site in SITES:
  36. if value == site["key"]:
  37. return site["url"]
  38. if "://" in value:
  39. return value
  40. raise WpError(
  41. f"无法识别的站点:{value}。可用简称:" + " / ".join(s["key"] for s in SITES) + ",或直接给完整 url"
  42. )
  43. def site_label(api_url):
  44. for site in SITES:
  45. if site["url"] == api_url:
  46. return f"{site['version']} · {site['domain']}"
  47. return "自定义地址"