Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| be2a1fb1bb | |||
| 6601213068 |
+25
-65
@@ -311,23 +311,33 @@ def build_response_categorisation(task: TaskInfo) -> dict:
|
|||||||
|
|
||||||
|
|
||||||
def build_response_writing_challenge(task: TaskInfo) -> dict:
|
def build_response_writing_challenge(task: TaskInfo) -> dict:
|
||||||
"""writing-challenge: 写作挑战 — 优先使用expectedResponse,否则提交占位文本"""
|
"""writing-challenge: 写作挑战 — 优先使用expectedResponse,否则生成足够字数的占位文本"""
|
||||||
expected = task.expected_response.get("contents", {}).get("writingChallenge", {})
|
expected = task.expected_response.get("contents", {}).get("writingChallenge", {})
|
||||||
if expected:
|
if expected and expected.get("userInput", "").strip():
|
||||||
return {"writingChallenge": expected}
|
return {"writingChallenge": expected}
|
||||||
|
|
||||||
# 回退:提交一段较长占位文本(确保满足最低字数要求)
|
# 从task_detail获取字数要求
|
||||||
|
min_words = task.task_detail.get("writingChallenge", {}).get("minWordCount", 20)
|
||||||
|
|
||||||
|
# 生成满足最低字数要求的占位文本
|
||||||
|
paragraph = (
|
||||||
|
"I think this is a very interesting topic. There are many things "
|
||||||
|
"to consider when writing about this subject. First of all, it is "
|
||||||
|
"important to understand the main ideas and think carefully about "
|
||||||
|
"the best way to express your thoughts. In my opinion, practice "
|
||||||
|
"is the key to success and everyone should try their best to "
|
||||||
|
"improve their skills every day. This is why I believe that "
|
||||||
|
"learning English is very useful for communication with people "
|
||||||
|
"from different countries and cultures around the world."
|
||||||
|
)
|
||||||
|
word_count = len(paragraph.split())
|
||||||
|
if word_count < min_words:
|
||||||
|
repeat = (min_words // word_count) + 1
|
||||||
|
paragraph = " ".join([paragraph] * repeat)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"writingChallenge": {
|
"writingChallenge": {
|
||||||
"userInput": (
|
"userInput": paragraph,
|
||||||
"I think this is a good topic. There are many things to consider "
|
|
||||||
"when writing about this subject. First of all, it is important to "
|
|
||||||
"understand the main ideas and think carefully about the best way to "
|
|
||||||
"express your thoughts. In my opinion, practice is the key to success "
|
|
||||||
"and everyone should try their best to improve their skills every day. "
|
|
||||||
"This is why I believe that learning English is very useful for "
|
|
||||||
"communication with people from different countries and cultures."
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -875,56 +885,6 @@ class EFCourseAutopilot:
|
|||||||
|
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def _save_diagnostic_report(self):
|
|
||||||
"""当检测到重复课程时,保存诊断报告供开发者分析"""
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
report = {
|
|
||||||
"timestamp": datetime.datetime.now().isoformat(),
|
|
||||||
"course_id": self.ctx.course_id,
|
|
||||||
"node_id": self.ctx.node_id,
|
|
||||||
"unit_id": self.ctx.unit_id,
|
|
||||||
"level_id": self.ctx.level_id,
|
|
||||||
"lesson_id": self.lesson.lesson_id,
|
|
||||||
"session_id": self.lesson.session_id,
|
|
||||||
"activities": [],
|
|
||||||
"results": [],
|
|
||||||
}
|
|
||||||
|
|
||||||
for act in self.activities:
|
|
||||||
act_info = {
|
|
||||||
"activity_id": act.activity_id,
|
|
||||||
"tasks": [
|
|
||||||
{
|
|
||||||
"task_id": t.task_id,
|
|
||||||
"task_type": t.task_type,
|
|
||||||
"task_detail": t.task_detail,
|
|
||||||
"expected_response": t.expected_response,
|
|
||||||
}
|
|
||||||
for t in act.tasks
|
|
||||||
],
|
|
||||||
}
|
|
||||||
report["activities"].append(act_info)
|
|
||||||
|
|
||||||
for r in self.results:
|
|
||||||
report["results"].append({
|
|
||||||
"task_id": r.task_id,
|
|
||||||
"task_type": r.task_type,
|
|
||||||
"success": r.success,
|
|
||||||
"skipped": r.skipped,
|
|
||||||
"error": r.error,
|
|
||||||
"new_version": r.new_version,
|
|
||||||
})
|
|
||||||
|
|
||||||
safe_cid = self.ctx.course_id[:8] if self.ctx.course_id else "unknown"
|
|
||||||
safe_nid = self.ctx.node_id[:8] if self.ctx.node_id else "unknown"
|
|
||||||
filename = f"diagnostic_{safe_cid}_{safe_nid}_{int(time.time())}.json"
|
|
||||||
|
|
||||||
with open(filename, "w") as f:
|
|
||||||
json.dump(report, f, ensure_ascii=False, indent=2)
|
|
||||||
|
|
||||||
self._log(f"\n 诊断报告已保存至: {filename}")
|
|
||||||
self._log(f" 请将此文件提供给开发者以优化对新课程的支持")
|
|
||||||
|
|
||||||
# --------------------------------------------------------
|
# --------------------------------------------------------
|
||||||
# 主流程
|
# 主流程
|
||||||
@@ -970,9 +930,9 @@ class EFCourseAutopilot:
|
|||||||
if lesson_key in self._processed_lessons:
|
if lesson_key in self._processed_lessons:
|
||||||
self.repeat_detected = True
|
self.repeat_detected = True
|
||||||
self._log("\n⚠️ 检测到重复课程!该课程已处理过但未能晋级。")
|
self._log("\n⚠️ 检测到重复课程!该课程已处理过但未能晋级。")
|
||||||
self._log(" 请手动登录平台检查课程状态,或联系开发者分析。")
|
self._log(" 请手动完成此课程,处理方式二选一:")
|
||||||
self._save_diagnostic_report()
|
self._log(" ① 打开F12录制HAR,从课程列表到学习完成的全流程,将har文件发给开发者优化")
|
||||||
self._log(f" 诊断文件已保存,请提供给开发者")
|
self._log(" ② 直接手动学习完成,完成后本程序将继续处理后续课程")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# 步骤②: 注册课程会话
|
# 步骤②: 注册课程会话
|
||||||
|
|||||||
+3
-2
@@ -103,8 +103,9 @@ token.txt 说明:
|
|||||||
success = autopilot.run()
|
success = autopilot.run()
|
||||||
if autopilot.repeat_detected:
|
if autopilot.repeat_detected:
|
||||||
print("\n⚠️ 检测到重复课程,自动循环终止。")
|
print("\n⚠️ 检测到重复课程,自动循环终止。")
|
||||||
print(" 请手动登录平台检查课程状态,或联系开发者优化。")
|
print(" 请手动完成此课程,处理方式二选一:")
|
||||||
print(f" 诊断文件已保存至当前目录。")
|
print(" ① 打开F12录制HAR,从课程列表到学习完成的全流程,将har文件发给开发者优化")
|
||||||
|
print(" ② 直接手动学习完成,完成后重新运行本程序继续后续课程")
|
||||||
total_fail += 1
|
total_fail += 1
|
||||||
break
|
break
|
||||||
if success:
|
if success:
|
||||||
|
|||||||
Reference in New Issue
Block a user