diff --git a/main.py b/main.py index 49737b9..c71e07d 100644 --- a/main.py +++ b/main.py @@ -154,7 +154,11 @@ def jobs(robot: Robot): # 系统级定时任务统一改为数据库驱动,不再在 main.py 里硬编码维护。 # 这里保留入口,只负责按表配置重新加载,便于运行时刷新。 if hasattr(robot, "system_job_loader") and robot.system_job_loader: - robot.system_job_loader.reload_from_db() + # 启动阶段再次 reload 只需要同步最新数据库配置,不应重新触发漏执行补偿: + # 1. Robot.__init__ 里已经完成过一次注册; + # 2. 若这里使用默认参数再次 reload,会把启动期补偿又执行一遍,抵消前面的提速优化; + # 3. 因此这里显式关闭 startup compensation,保持启动路径轻量且幂等。 + robot.system_job_loader.reload_from_db(run_startup_compensation=False) diff --git a/wechat_ipad/providers/server_864/runtime.py b/wechat_ipad/providers/server_864/runtime.py index b68d903..0563f17 100644 --- a/wechat_ipad/providers/server_864/runtime.py +++ b/wechat_ipad/providers/server_864/runtime.py @@ -51,6 +51,22 @@ class Server864RuntimeMixin: return f"{normalized} 请更换更高版本的 864 client/server 组合后再登录。" return normalized + @staticmethod + def _normalize_post_scan_failure_message(message: str) -> str: + """把扫码成功后的收口阶段错误翻译成更接近真实原因的提示。""" + normalized = Server864RuntimeMixin._normalize_login_runtime_message(message) + if "该链接不存在" in normalized: + # 864 在扫码成功后如果 ManualAuth 失败,会直接把长连接停掉: + # 1. ABOT 随后再调 `GetInItStatus/GetProfile` 时,就只会看到“该链接不存在”; + # 2. 但这并不是根因,根因往往已经出现在服务端控制台,例如“当前客户端版本过低”; + # 3. 因此前端这里给出更贴近真实情况的兼容提示,帮助用户把注意力放到版本兼容上。 + return ( + "扫码成功后服务端登录收口失败,连接已被主动关闭。" + "这通常表示当前 864 client/server 版本组合不兼容;" + "若服务端日志已出现“当前客户端版本过低”,请升级到更高版本后再登录。" + ) + return normalized + async def run_runtime( self, *, @@ -376,7 +392,7 @@ class Server864RuntimeMixin: logger=logger, ) except Exception as e: - error_message = self._normalize_login_runtime_message(str(e)) + error_message = self._normalize_post_scan_failure_message(str(e)) # 扫码成功后的收口阶段同样需要把异常同步给前端: # 1. 这类错误往往发生在“state=2 之后但正式进入业务前”,最容易被误判成前端没刷新; # 2. 例如当前用户遇到的“客户端版本过低”就是在这个阶段由服务端主动断开;