cmd_site.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. """与站点和凭据状态有关的子命令:endpoint / whoami。"""
  2. import sys
  3. import time
  4. from client import fmt_ts, make_client, mask, note, token_expiry
  5. from creds import bucket_name_for, get_bucket, resolve_api_url, save_creds, load_creds, CREDS_PATH
  6. from errors import ApiError, WpError, explain_api_error
  7. from sites import SITES, expand_site_alias, normalize_api_url, site_label
  8. def cmd_endpoint(args):
  9. creds = load_creds()
  10. current_url, source = resolve_api_url(getattr(args, "api", None), creds)
  11. if not args.target:
  12. for idx, site in enumerate(SITES, 1):
  13. mark = " ← 当前" if site["url"] == current_url else ""
  14. print(f" {idx}) {site['url']:<32} {site['version']} · {site['domain']}{mark}")
  15. if source in ("cli", "env"):
  16. src = "--api" if source == "cli" else "WIKIPALI_API_URL"
  17. note(f"注意:当前地址来自 {src},是一次性覆盖,未写入凭据文件。")
  18. if current_url not in [s["url"] for s in SITES]:
  19. print(f" *) {current_url:<32} 自定义地址 ← 当前")
  20. print("\n切换:python3 wp.py endpoint <序号|www|www.cc|next|next.cc|local|完整url>")
  21. return 0
  22. url = normalize_api_url(expand_site_alias(args.target))
  23. name = bucket_name_for(url)
  24. bucket = get_bucket(creds, name, url)
  25. bucket["api_url"] = url
  26. creds["current"] = name
  27. save_creds(creds)
  28. print(f"已切换到 {url}({site_label(url)})")
  29. if name != "online":
  30. note("提示:该地址与线上四站不共用数据库/密钥,凭据是独立的一桶,可能需要重新登录。")
  31. return 0
  32. def cmd_whoami(args):
  33. client = make_client(args)
  34. print(f"API : {client.api_note()}")
  35. print(f"凭据文件 : {CREDS_PATH}(桶:{client.bucket_name})")
  36. user = client.bucket.get("user") or {}
  37. if user.get("token"):
  38. exp = token_expiry(user["token"])
  39. expired = exp is not None and exp < time.time()
  40. print(f"用户 : {user.get('username', '?')} uid={user.get('uid', '?')}")
  41. print(f" token {mask(user['token'])} 到期 {fmt_ts(exp)}{' ⚠ 已过期' if expired else ''}")
  42. else:
  43. print("用户 : 未登录(! python3 scripts/wp_login.py)")
  44. model = client.bucket.get("model") or {}
  45. if model.get("token"):
  46. exp = token_expiry(model["token"])
  47. expired = exp is not None and exp < time.time()
  48. print(f"模型 : {model.get('name', '?')} uid={model.get('uid', '?')}")
  49. print(f" token {mask(model['token'])} 到期 {fmt_ts(exp)}{' ⚠ 已过期' if expired else ''}")
  50. else:
  51. print("模型 : 未建立(python3 wp.py ensure-model --name <模型名>)")
  52. tokens = client.bucket.get("access_tokens") or {}
  53. if tokens:
  54. print("access token:")
  55. for uid, item in tokens.items():
  56. exp = item.get("exp") or token_expiry(item.get("token", ""))
  57. expired = exp is not None and exp < time.time()
  58. book = item.get("book", 0)
  59. scope = "全部 book" if book == 0 else f"book {book}"
  60. name = item.get("channel_name") or ""
  61. print(f" {uid[:8]}… {name:<24} {scope:<10} 到期 {fmt_ts(exp)}{' ⚠ 已过期' if expired else ''}")
  62. else:
  63. print("access token:无(python3 wp.py grant <channel>)")
  64. if args.check:
  65. try:
  66. data = client.call("GET", "v2/auth/current", token=client.user_token)
  67. except ApiError as exc:
  68. raise explain_api_error(exc, "校验用户 token")
  69. print(f"\n服务端确认:{data.get('nickName')} / realName={data.get('realName')}(studio_name 用它)")
  70. return 0