diff --git a/ef_course_autopilot.py b/ef_course_autopilot.py index 49d26ff..d2ba6c6 100755 --- a/ef_course_autopilot.py +++ b/ef_course_autopilot.py @@ -883,6 +883,60 @@ class EFCourseAutopilot: self._log(f"下一单元已激活 (status={put_resp.status_code})") return True + if is_completed and not next_unit_id: + self._log("当前等级所有单元已完成,尝试切换至下一等级") + try: + levels_url = f"{self.base_url}/wl/api/change-level/levels" + levels_resp = self.session.get( + levels_url, params={"locale": self.locale}, + headers=headers, timeout=REQUEST_TIMEOUT, + ) + levels_resp.raise_for_status() + levels_data = levels_resp.json() + + current_level_id = levels_data.get("currentLevelId") + levels = levels_data.get("levels", []) + if not current_level_id or not levels: + self._log("无法获取等级信息,跳过等级切换") + return False + + # 找到 currentLevelId 之后的第一个未开始的等级 + found_current = False + next_level = None + for level in levels: + lid = level.get("id") or level.get("levelId") + if not found_current: + if lid == current_level_id: + found_current = True + continue + status = level.get("progress", {}).get("status", "") + if status == "not_started": + next_level = level + break + if status == "started": + next_level = level + break + + if next_level: + next_level_id = next_level.get("id") or next_level.get("levelId") + self._log(f"切换至下一等级 (levelId={next_level_id})") + study_plan_url = f"{self.base_url}/wl/api/study-plan/study-plan" + put_resp = self.session.put( + study_plan_url, + params={"locale": self.locale}, + json={"courseId": self.ctx.course_id, "levelId": next_level_id}, + headers=headers, timeout=REQUEST_TIMEOUT, + ) + put_resp.raise_for_status() + self._log(f"等级切换成功 (status={put_resp.status_code})") + return True + else: + self._log("未找到可切换的下一等级") + except Exception as e: + self._log(f"等级切换失败: {e}") + + return False + return False