diff --git a/wechat_ipad/providers/server_864/runtime.py b/wechat_ipad/providers/server_864/runtime.py index 0563f17..af9ef53 100644 --- a/wechat_ipad/providers/server_864/runtime.py +++ b/wechat_ipad/providers/server_864/runtime.py @@ -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: