From ca5beaae0722cbe2eb157cf61d75fc9e78c2e40c Mon Sep 17 00:00:00 2001 From: NianBroken Date: Wed, 7 Aug 2024 20:15:32 +0800 Subject: [PATCH] add --- main.py | 85 ++++++++++++++++++++------------- scripts/get_grade.py | 43 +++++++++++++---- scripts/get_selected_courses.py | 23 +++++++-- scripts/get_user_info.py | 72 +++++++++++++++++++++------- 4 files changed, 161 insertions(+), 62 deletions(-) diff --git a/main.py b/main.py index 90bf8dd..680baa3 100644 --- a/main.py +++ b/main.py @@ -53,6 +53,9 @@ run_count = 2 # 初始化运行日志 run_log = "" +# 初始化错误内容 +error_content = [] + # 当前时间 current_time = "------\n" + datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f")[:-3] @@ -69,11 +72,11 @@ info = get_user_info(student_client, output_type="info") integrated_info = get_user_info(student_client, output_type="integrated_info") if not info or not integrated_info: - run_log += "个人信息为空\n" + error_content.append("个人信息为空") run_count = 1 elif "获取个人信息时出错" in info or "获取个人信息时出错" in integrated_info: - run_log += "获取个人信息时出错\n" + error_content.append("获取个人信息时出错") run_count = 1 else: @@ -118,12 +121,12 @@ for _ in range(run_count): if not grade: # 成绩为空时将成绩信息定义为"成绩为空" integrated_grade_info = "------\n成绩信息:\n成绩为空\n------" - run_log += "成绩为空\n" + error_content.append("成绩为空") elif "获取成绩时出错" in grade: # 获取成绩时出错时将成绩信息定义为"获取成绩时出错" integrated_grade_info = "------\n成绩信息:\n获取成绩时出错\n------" - run_log += "获取成绩时出错\n" + error_content.append("获取成绩时出错") else: # 清空grade.txt文件内容 @@ -203,43 +206,47 @@ grades_updated_push_integrated_send_info = ( f"{integrated_send_info}" ) -# 如果是第一次运行,则提示程序运行成功 -if run_count == 2: - run_log += f"{first_run_text}\n" - - # 推送信息 - first_run_text_response_text = send_message( - token, - "正方教务管理系统成绩推送", - first_time_run_integrated_send_info, - ) - - # 输出响应内容 - run_log += f"{first_run_text_response_text}\n" +if error_content: + error_content = "、".join(map(str, error_content)) + run_log += f"你因{error_content}原因而运行失败。\n" + run_log += "------\n" else: - # 对grade.txt和old_grade.txt两个文件的内容进行比对,输出成绩是否更新 - if grade_content != old_grade_content or force_push_message: - - # 如果非第一次运行,则输出成绩信息 - if grade: - run_log += f"新成绩:{encrypted_integrated_grade_info}\n" - run_log += f"旧成绩:{old_grade_content}\n" - run_log += "------\n" - - # 判断是否选中了强制推送信息 - run_log += f"{'强制推送信息' if force_push_message else '成绩已更新'}\n" + # 如果是第一次运行,则提示程序运行成功 + if run_count == 2: + run_log += f"{first_run_text}\n" # 推送信息 - response_text = send_message( + first_run_text_response_text = send_message( token, "正方教务管理系统成绩推送", - grades_updated_push_integrated_send_info, + first_time_run_integrated_send_info, ) + # 输出响应内容 - run_log += f"{response_text}" + run_log += f"{first_run_text_response_text}\n" else: - run_log += "------\n" - run_log += "成绩未更新" + # 对grade.txt和old_grade.txt两个文件的内容进行比对,输出成绩是否更新 + if grade_content != old_grade_content or force_push_message: + + # 如果非第一次运行,则输出成绩信息 + if grade: + run_log += f"新成绩:{encrypted_integrated_grade_info}\n" + run_log += f"旧成绩:{old_grade_content}\n" + run_log += "------\n" + + # 判断是否选中了强制推送信息 + run_log += f"{'强制推送信息' if force_push_message else '成绩已更新'}\n" + + # 推送信息 + response_text = send_message( + token, + "正方教务管理系统成绩推送", + grades_updated_push_integrated_send_info, + ) + # 输出响应内容 + run_log += f"{response_text}" + else: + run_log += "成绩未更新" # 更新info.txt if run_count == 2: @@ -259,10 +266,22 @@ if run_log: github_step_summary_run_log = ( f"# 正方教务管理系统成绩推送\n{run_log}\n{workflow_info}\n{copyright_text}" ) + # 定义正则表达式模式 + error_content_pattern = r"你因(.*?)原因而运行失败。" + error_content_replacement = ( + r"你因 **\1** 原因而运行失败。\n" + r"若你不明白或不理解为什么登录失败,请到上游仓库的 " + r"[Issue](https://github.com/NianBroken/ZFCheckScores/issues/new 'Issue') 中寻求帮助。\n" + ) # 将任意个数的换行替换为两个换行 github_step_summary_run_log = re.sub("\n+", "\n\n", github_step_summary_run_log) + # 将你因xx原因而运行失败。替换为你因**xx**原因而运行失败。 + github_step_summary_run_log = re.sub( + error_content_pattern, error_content_replacement, github_step_summary_run_log + ) + # 将 github_step_summary_run_log 写入到 GitHub Actions 的环境文件中 with open(github_step_summary, "w", encoding="utf-8") as file: file.write(github_step_summary_run_log) diff --git a/scripts/get_grade.py b/scripts/get_grade.py index 24f82d9..97415e9 100644 --- a/scripts/get_grade.py +++ b/scripts/get_grade.py @@ -1,11 +1,29 @@ +import time import traceback def get_grade(student_client, output_type="none"): try: - # 获取成绩信息 - grade_data = student_client.get_grade().get("data", {}) - grade = grade_data.get("courses", []) + # 定义重试次数上限为5次 + attempts = 5 + # 初始化grade为空列表 + grade = [] + + # 使用while循环最多重试5次获取个人信息 + while attempts > 0: + + # 调用student_client的get_grade方法获取成绩信息 + grade_data = student_client.get_grade().get("data", {}) + grade = grade_data.get("courses", []) + + # 如果grade不为空,跳出循环 + if grade: + break + + # 如果grade为空,等待1秒后重试 + time.sleep(1) + # 减少剩余重试次数 + attempts -= 1 # 成绩不为空时 if grade: @@ -14,13 +32,17 @@ def get_grade(student_client, output_type="none"): # 遍历 grade 中的每个字典,将 title 中的中文括号替换为英文括号 for course_data_grade in grade: - course_data_grade["title"] = course_data_grade["title"].replace("(", "(").replace(")", ")") + course_data_grade["title"] = ( + course_data_grade["title"].replace("(", "(").replace(")", ")") + ) # 按照提交时间降序排序 # 对于没有提交时间参数的成绩,则将提交时间设置为1970-01-01 00:00:00,否则将无法排序 sorted_grade = sorted( grade, - key=lambda x: (x["submission_time"] if x["submission_time"] else "1970-01-01 00:00:00"), + key=lambda x: ( + x["submission_time"] if x["submission_time"] else "1970-01-01 00:00:00" + ), reverse=True, ) @@ -34,16 +56,21 @@ def get_grade(student_client, output_type="none"): # (百分制成绩*学分)的总和 sum_of_percentage_grades_multiplied_by_credits = sum( - float(course["percentage_grades"]) * float(course["credit"]) for course in filtered_grade + float(course["percentage_grades"]) * float(course["credit"]) + for course in filtered_grade ) # GPA计算 (学分*绩点)的总和/学分总和 gpa = "{:.2f}".format(total_xfjd / total_credit) # 百分制GPA计算 (百分制成绩*学分)的总和/学分总和 - percentage_gpa = "{:.2f}".format(sum_of_percentage_grades_multiplied_by_credits / total_credit) + percentage_gpa = "{:.2f}".format( + sum_of_percentage_grades_multiplied_by_credits / total_credit + ) else: - total_credit = total_xfjd = sum_of_percentage_grades_multiplied_by_credits = gpa = percentage_gpa = 0 + total_credit = total_xfjd = sum_of_percentage_grades_multiplied_by_credits = gpa = ( + percentage_gpa + ) = 0 # 初始化输出成绩信息字符串 integrated_grade_info = "------\n成绩信息:" diff --git a/scripts/get_selected_courses.py b/scripts/get_selected_courses.py index 4d1f0ba..6e7ae19 100644 --- a/scripts/get_selected_courses.py +++ b/scripts/get_selected_courses.py @@ -1,3 +1,4 @@ +import time import traceback from .get_grade import get_grade @@ -7,9 +8,25 @@ def get_selected_courses(student_client): # 获取成绩信息 grade = get_grade(student_client, output_type="grade") - # 获取已选课程信息 - selected_courses_data = student_client.get_selected_courses().get("data", {}) - selected_courses = selected_courses_data.get("courses", []) + # 定义重试次数上限为5次 + attempts = 5 + # 初始化selected_courses为空列表 + selected_courses = [] + + # 使用while循环最多重试5次获取个人信息 + while attempts > 0: + # 调用student_client的get_selected_courses方法获取已选课程信息 + selected_courses_data = student_client.get_selected_courses().get("data", {}) + selected_courses = selected_courses_data.get("courses", []) + + # 如果selected_courses不为空,跳出循环 + if selected_courses: + break + + # 如果selected_courses为空,等待1秒后重试 + time.sleep(1) + # 减少剩余重试次数 + attempts -= 1 # 已选课程信息不为空时,处理未公布成绩的课程 if selected_courses: diff --git a/scripts/get_user_info.py b/scripts/get_user_info.py index 432e5df..a3edb41 100644 --- a/scripts/get_user_info.py +++ b/scripts/get_user_info.py @@ -1,33 +1,69 @@ from .get_grade import get_grade import traceback +import time def get_user_info(student_client, output_type="none"): try: - # 获取个人信息 - info = student_client.get_info()["data"] + # 定义重试次数上限为5次 + attempts = 5 + # 初始化info为空字典 + info = {} - # 整合个人信息 - info = f"个人信息:\n" f"学号:{info['sid']}\n" f"班级:{info['class_name']}\n" f"姓名:{info['name']}" + # 使用while循环最多重试5次获取个人信息 + while attempts > 0: + # 调用student_client的get_info方法获取个人信息字典 + info = student_client.get_info().get("data", {}) - grade = get_grade(student_client, output_type="grade") + # 如果info不为空,退出循环 + if info: + break - if grade: - gpa = get_grade(student_client, output_type="gpa") - percentage_gpa = get_grade(student_client, output_type="percentage_gpa") - # 整合个人信息 - gpa_info = f"\n当前GPA:{gpa}\n" f"当前百分制GPA:{percentage_gpa}" - integrated_info = f"{info}{gpa_info}" + # 如果info为空,等待1秒后重试 + time.sleep(1) + # 减少剩余重试次数 + attempts -= 1 - if output_type == "info": - return info - elif output_type == "integrated_info": - return integrated_info + # 如果成功获取到个人信息 + if info: + # 整合个人信息为字符串格式 + info = ( + f"个人信息:\n" + f"学号:{info['sid']}\n" + f"班级:{info['class_name']}\n" + f"姓名:{info['name']}" + ) + + # 调用get_grade方法获取学生成绩信息 + grade = get_grade(student_client, output_type="grade") + + # 如果成功获取到成绩信息 + if grade: + # 获取当前GPA + gpa = get_grade(student_client, output_type="gpa") + # 获取当前百分制GPA + percentage_gpa = get_grade(student_client, output_type="percentage_gpa") + # 整合GPA信息为字符串格式 + gpa_info = f"\n当前GPA:{gpa}\n" f"当前百分制GPA:{percentage_gpa}" + # 将个人信息和GPA信息整合为完整字符串 + integrated_info = f"{info}{gpa_info}" + + # 根据output_type返回不同类型的信息 + if output_type == "info": + return info + elif output_type == "integrated_info": + return integrated_info + else: + # 如果output_type参数无效,返回错误提示 + return "获取个人信息:参数缺失" else: - return "获取个人信息:参数缺失" + # 如果未获取到成绩信息,返回仅包含个人信息的字符串 + return f"{info}" else: - return f"{info}" - + # 如果重试5次仍未获取到个人信息,返回错误提示 + return "个人信息:\n获取个人信息失败" except Exception: + # 捕获并打印所有异常的详细信息 print(traceback.format_exc()) + # 返回错误提示信息 return "个人信息:\n获取个人信息时出错"