This commit is contained in:
qsc
2026-09-05 03:05:34 +08:00
parent 524090e769
commit bc4a38f589
7 changed files with 125 additions and 7 deletions
+43
View File
@@ -116,6 +116,49 @@ class JX3APIService:
}
)
async def token_stats(self) -> Optional[Dict[str, Any]]:
"""查询当前配置 JX3API Token 的等级、用量及有效状态。"""
if not str(self.token or "").strip():
return None
try:
data = await self._api.post(
"https://www.jx3api.com/token/stats",
data={"token": self.token},
out_key="data",
success_codes=(200, "200"),
return_error=True,
)
except Exception as exc:
logger.warning(f"查询 JX3API Token 统计失败: {exc}")
return None
if isinstance(data, APIErrorResponse):
logger.warning(
f"JX3API Token 统计返回错误: "
f"code={data.code}, msg={data.message or '未知错误'}"
)
return None
if not isinstance(data, dict):
return None
def nonnegative_int(value: Any) -> Optional[int]:
if isinstance(value, bool):
return None
try:
number = int(value)
except (TypeError, ValueError):
return None
return number if number >= 0 else None
valid = data.get("valid")
return {
"level": nonnegative_int(data.get("level")),
"used": nonnegative_int(data.get("used")),
"remaining": nonnegative_int(data.get("remaining")),
"valid": valid if isinstance(valid, bool) else None,
}
def _init_return_data(self) -> Dict[str, Any]:
"""初始化标准的返回数据结构"""
+17 -5
View File
@@ -1,5 +1,6 @@
from __future__ import annotations
import asyncio
import re
from typing import TYPE_CHECKING, Any
@@ -87,11 +88,21 @@ class WebUIService:
raise ValueError("别名必须是字符串或数组")
async def dashboard(self):
bindings = await self.server_binding.list_bindings()
subscriptions = await self.event_push.list_subscription_statuses()
aliases = await self.server_binding.list_aliases()
kungfu = await self.kungfu_alias.list_kungfu()
session_control = await self.session_control.get_state()
(
bindings,
subscriptions,
aliases,
kungfu,
session_control,
token_stats,
) = await asyncio.gather(
self.server_binding.list_bindings(),
self.event_push.list_subscription_statuses(),
self.server_binding.list_aliases(),
self.kungfu_alias.list_kungfu(),
self.session_control.get_state(),
self.jx3api.token_stats(),
)
return json_response(
{
"bindings": bindings,
@@ -103,6 +114,7 @@ class WebUIService:
str(action): name for action, name in EVENT_NAMES.items()
},
"session_control": session_control,
"token_stats": token_stats,
}
)