收紧864无可用账号身份时的登录放行

This commit is contained in:
liuwei
2026-05-07 15:06:24 +08:00
parent 0418f913c7
commit a0b4d2d44e

View File

@@ -146,7 +146,9 @@ class Server864RuntimeMixin:
) -> None:
"""确保 864 已完成登录。"""
if await self.is_logged_in():
await self._refresh_identity_from_profile(logger=logger)
identity_ready = await self._refresh_identity_from_profile(logger=logger)
if not identity_ready:
raise RuntimeError("当前未拿到可用账号身份,请重新扫码登录")
# 864 在“服务端已经在线、ABOT 只是后启动”的场景下会直接走这里:
# 1. 之前这条分支只清理二维码态,没有补写本地 runtime_state
# 2. 这会让用户误以为“明明已经登录成功,却没有生成 provider 状态文件”;
@@ -383,7 +385,9 @@ class Server864RuntimeMixin:
try:
await self._wait_init_ready(logger=logger)
await self._refresh_identity_from_profile(logger=logger)
identity_ready = await self._refresh_identity_from_profile(logger=logger)
if not identity_ready:
raise RuntimeError("扫码完成后未获取到可用账号身份,请重新扫码登录")
ipad_config["wxid"] = self.wxid
ipad_config["login_time"] = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
self._save_runtime_state(
@@ -495,7 +499,7 @@ class Server864RuntimeMixin:
logger.warning(f"server_864 检查初始化状态失败: {error_message}")
await asyncio.sleep(2)
async def _refresh_identity_from_profile(self, *, logger) -> None:
async def _refresh_identity_from_profile(self, *, logger) -> bool:
"""从 864 的资料接口刷新当前登录身份。"""
try:
profile = await self.get_profile()
@@ -503,10 +507,13 @@ class Server864RuntimeMixin:
error_message = str(e).strip()
# 864 有些版本在消息链路可用后,资料接口仍可能短时间不可用:
# 1. 此时若直接抛异常,会让“已经登录成功”的启动流程被资料查询反向拖垮;
# 2. 项目主链路真正依赖的是后续消息同步与发送能力,而不是这里的展示性资料
# 3. 所以这里改成降级告警,保留已有身份字段,等后续再由可用接口补齐
logger.warning(f"server_864 刷新登录账号资料失败,继续沿用当前缓存身份: {error_message}")
return
# 2. 但如果当前连 `wxid/nickname` 都没有,就不能再假装“已经有可用身份”
# 3. 因此这里返回布尔值,由上层决定是继续使用已知身份,还是把登录流程判定为失败
if self.wxid or self.nickname:
logger.warning(f"server_864 刷新登录账号资料失败,继续沿用当前已获取身份: {error_message}")
return True
logger.warning(f"server_864 刷新登录账号资料失败,当前尚未拿到可用账号身份: {error_message}")
return False
self.wxid = str(
profile.get("UserName")
or profile.get("userName")
@@ -530,6 +537,7 @@ class Server864RuntimeMixin:
logger.info(
f"server_864 登录账号信息: wxid: {self.wxid} 昵称: {self.nickname} 微信号: {self.alias} 手机号: {self.phone}"
)
return bool(self.wxid or self.nickname)
@staticmethod
def _save_runtime_state(*, state_path: str, state_payload: dict[str, Any], logger) -> None: