| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- """与站点和凭据状态有关的子命令:endpoint / whoami。"""
- import sys
- import time
- from client import fmt_ts, make_client, mask, note, token_expiry
- from creds import bucket_name_for, get_bucket, resolve_api_url, save_creds, load_creds, CREDS_PATH
- from errors import ApiError, WpError, explain_api_error
- from sites import SITES, expand_site_alias, normalize_api_url, site_label
- def cmd_endpoint(args):
- creds = load_creds()
- current_url, source = resolve_api_url(getattr(args, "api", None), creds)
- if not args.target:
- for idx, site in enumerate(SITES, 1):
- mark = " ← 当前" if site["url"] == current_url else ""
- print(f" {idx}) {site['url']:<32} {site['version']} · {site['domain']}{mark}")
- if source in ("cli", "env"):
- src = "--api" if source == "cli" else "WIKIPALI_API_URL"
- note(f"注意:当前地址来自 {src},是一次性覆盖,未写入凭据文件。")
- if current_url not in [s["url"] for s in SITES]:
- print(f" *) {current_url:<32} 自定义地址 ← 当前")
- print("\n切换:python3 wp.py endpoint <序号|www|www.cc|next|next.cc|local|完整url>")
- return 0
- url = normalize_api_url(expand_site_alias(args.target))
- name = bucket_name_for(url)
- bucket = get_bucket(creds, name, url)
- bucket["api_url"] = url
- creds["current"] = name
- save_creds(creds)
- print(f"已切换到 {url}({site_label(url)})")
- if name != "online":
- note("提示:该地址与线上四站不共用数据库/密钥,凭据是独立的一桶,可能需要重新登录。")
- return 0
- def cmd_whoami(args):
- client = make_client(args)
- print(f"API : {client.api_note()}")
- print(f"凭据文件 : {CREDS_PATH}(桶:{client.bucket_name})")
- user = client.bucket.get("user") or {}
- if user.get("token"):
- exp = token_expiry(user["token"])
- expired = exp is not None and exp < time.time()
- print(f"用户 : {user.get('username', '?')} uid={user.get('uid', '?')}")
- print(f" token {mask(user['token'])} 到期 {fmt_ts(exp)}{' ⚠ 已过期' if expired else ''}")
- else:
- print("用户 : 未登录(! python3 scripts/wp_login.py)")
- model = client.bucket.get("model") or {}
- if model.get("token"):
- exp = token_expiry(model["token"])
- expired = exp is not None and exp < time.time()
- print(f"模型 : {model.get('name', '?')} uid={model.get('uid', '?')}")
- print(f" token {mask(model['token'])} 到期 {fmt_ts(exp)}{' ⚠ 已过期' if expired else ''}")
- else:
- print("模型 : 未建立(python3 wp.py ensure-model --name <模型名>)")
- tokens = client.bucket.get("access_tokens") or {}
- if tokens:
- print("access token:")
- for uid, item in tokens.items():
- exp = item.get("exp") or token_expiry(item.get("token", ""))
- expired = exp is not None and exp < time.time()
- book = item.get("book", 0)
- scope = "全部 book" if book == 0 else f"book {book}"
- name = item.get("channel_name") or ""
- print(f" {uid[:8]}… {name:<24} {scope:<10} 到期 {fmt_ts(exp)}{' ⚠ 已过期' if expired else ''}")
- else:
- print("access token:无(python3 wp.py grant <channel>)")
- if args.check:
- try:
- data = client.call("GET", "v2/auth/current", token=client.user_token)
- except ApiError as exc:
- raise explain_api_error(exc, "校验用户 token")
- print(f"\n服务端确认:{data.get('nickName')} / realName={data.get('realName')}(studio_name 用它)")
- return 0
|