diff --git a/get_grade.py b/get_grade.py index 83dab0c..e3b41c0 100644 --- a/get_grade.py +++ b/get_grade.py @@ -1,70 +1,80 @@ +import traceback + + def get_grade(student_client, output_type="none"): - # 获取成绩信息 - grade_data = student_client.get_grade().get("data", {}) - grade = grade_data.get("courses", []) + try: + # 获取成绩信息 + grade_data = student_client.get_grade().get("data", {}) + grade = grade_data.get("courses", []) - # 成绩不为空时 - if grade: - # 遍历 grade 中的每个字典,将 title 中的中文括号替换为英文括号 - for course_data_grade in grade: - course_data_grade["title"] = ( - course_data_grade["title"].replace("(", "(").replace(")", ")") + # 成绩不为空时 + if grade: + # 遍历 grade 中的每个字典,将 title 中的中文括号替换为英文括号 + for course_data_grade in grade: + 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" + ), + reverse=True, ) - # 按照提交时间降序排序 - # 对于没有提交时间参数的成绩,则将提交时间设置为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" - ), - reverse=True, - ) + # 学分总和 + total_credit = sum(float(course["credit"]) for course in grade) - # 学分总和 - total_credit = sum(float(course["credit"]) for course in grade) + # 学分绩点总和 + total_xfjd = sum(float(course["xfjd"]) for course in grade) - # 学分绩点总和 - total_xfjd = sum(float(course["xfjd"]) for course in grade) - - # (百分制成绩*学分)的总和 - sum_of_percentage_grades_multiplied_by_credits = sum( - float(course["percentage_grades"]) * float(course["credit"]) - for course in grade - ) - - # GPA计算 (学分*绩点)的总和/学分总和 - gpa = "{:.2f}".format(total_xfjd / total_credit) - - # 百分制GPA计算 (百分制成绩*学分)的总和/学分总和 - percentage_gpa = "{:.2f}".format( - sum_of_percentage_grades_multiplied_by_credits / total_credit - ) - - # 初始化输出成绩信息字符串 - integrated_grade_info = "成绩信息:" - - # 遍历前8条成绩信息 - for _, course in enumerate(sorted_grade[:8]): - # 整合成绩信息 - integrated_grade_info += ( - f"\n" - f"教学班ID:{course['class_id']}\n" - f"课程名称:{course['title']}\n" - f"任课教师:{course['teacher']}\n" - f"成绩:{course['grade']}\n" - f"提交时间:{course['submission_time']}\n" - f"提交人姓名:{course['name_of_submitter']}\n" - f"------" + # (百分制成绩*学分)的总和 + sum_of_percentage_grades_multiplied_by_credits = sum( + float(course["percentage_grades"]) * float(course["credit"]) + for course in grade ) - if output_type == "grade": - return grade - elif output_type == "gpa": - return gpa - elif output_type == "percentage_gpa": - return percentage_gpa - elif output_type == "integrated_grade_info": - return integrated_grade_info - else: - return "获取成绩:参数缺失" + # GPA计算 (学分*绩点)的总和/学分总和 + gpa = "{:.2f}".format(total_xfjd / total_credit) + + # 百分制GPA计算 (百分制成绩*学分)的总和/学分总和 + percentage_gpa = "{:.2f}".format( + sum_of_percentage_grades_multiplied_by_credits / total_credit + ) + + # 初始化输出成绩信息字符串 + integrated_grade_info = "成绩信息:" + + # 遍历前8条成绩信息 + for _, course in enumerate(sorted_grade[:8]): + # 整合成绩信息 + integrated_grade_info += ( + f"\n" + f"教学班ID:{course['class_id']}\n" + f"课程名称:{course['title']}\n" + f"任课教师:{course['teacher']}\n" + f"成绩:{course['grade']}\n" + f"提交时间:{course['submission_time']}\n" + f"提交人姓名:{course['name_of_submitter']}\n" + f"------" + ) + + if output_type == "grade": + return grade + elif output_type == "gpa": + return gpa + elif output_type == "percentage_gpa": + return percentage_gpa + elif output_type == "integrated_grade_info": + return integrated_grade_info + else: + return "获取成绩:参数缺失" + + except Exception: + print(traceback.format_exc()) + return "获取成绩时出错" diff --git a/get_selected_courses.py b/get_selected_courses.py index d3ae31b..82e41b8 100644 --- a/get_selected_courses.py +++ b/get_selected_courses.py @@ -1,3 +1,4 @@ +import traceback from get_grade import get_grade @@ -10,6 +11,17 @@ def get_selected_courses(student_client): selected_courses_data = student_client.get_selected_courses().get("data", {}) selected_courses = selected_courses_data.get("courses", []) + # 按照学年学期降序排序 + # 对于没有学年学期参数的课程,则将学年学期设置为1970至1971学年第1学期,否则将无法排序 + selected_courses = sorted( + selected_courses, + key=lambda x: ( + (x["course_year"] if x["course_year"] else "1970-1971"), + (x["course_semester"] if x["course_semester"] else "1"), + ), + reverse=True, + ) + # 已选课程信息不为空时,处理未公布成绩的课程和异常课程 if selected_courses: # 初始化空字典用于存储未公布成绩的课程,按学年学期分组 @@ -25,9 +37,13 @@ def get_selected_courses(student_client): # 遍历selected_courses和grade中的每个课程 for course in selected_courses + (grade or []): - # 获取课程的class_id和学年学期 - yearsemester_id = course["class_name"].split("(")[1].split(")")[0] - year, semester, seq = yearsemester_id.split("-") + # 获取课程的学年和学期 + try: + year, semester, seq = course["course_year"].split("-") + [ + course["course_semester"] + ] + except Exception: + pass # 构建年学期名称,例如 "a至b学年第c学期" yearsemester_name = f"{year}至{semester}学年第{seq}学期" @@ -79,8 +95,8 @@ def get_selected_courses(student_client): selected_courses_filtering += f"\n{course}" else: selected_courses_filtering = "------\n已选课程信息为空" - except Exception as e: - print(e) - return "------\n无法获取未公布成绩的课程或异常的课程" + return selected_courses_filtering - return selected_courses_filtering + except Exception: + print(traceback.format_exc()) + return "------\n获取未公布成绩的课程或异常的课程时出错" diff --git a/get_user_info.py b/get_user_info.py index 147324d..2c5cb20 100644 --- a/get_user_info.py +++ b/get_user_info.py @@ -1,32 +1,40 @@ from get_grade import get_grade +import traceback def get_user_info(student_client, output_type="none"): - # 获取个人信息 - info = student_client.get_info()["data"] + try: + # 获取个人信息 + info = student_client.get_info()["data"] - # 整合个人信息 - info = ( - f"个人信息:\n" - f"学号:{info['sid']}\n" - f"班级:{info['class_name']}\n" - f"姓名:{info['name']}" - ) - - grade = get_grade(student_client, output_type="grade") - - 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}\n" f"------" - integrated_info = f"{info}{gpa_info}" + info = ( + f"个人信息:\n" + f"学号:{info['sid']}\n" + f"班级:{info['class_name']}\n" + f"姓名:{info['name']}" + ) - if output_type == "info": - return info - elif output_type == "integrated_info": - return integrated_info + grade = get_grade(student_client, output_type="grade") + + 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}\n" f"------" + ) + integrated_info = f"{info}{gpa_info}" + + if output_type == "info": + return info + elif output_type == "integrated_info": + return integrated_info + else: + return "获取个人信息:参数缺失" else: - return "获取个人信息:参数缺失" - else: - return info + return info + + except Exception: + print(traceback.format_exc()) + return "获取个人信息时出错\n------" diff --git a/main.py b/main.py index 1c13f2b..cc5eb99 100644 --- a/main.py +++ b/main.py @@ -55,22 +55,13 @@ current_time = "------\n" + datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f")[:-3] current_file_name = os.path.realpath(__file__) # 登录 -try: - student_client = login(url, username, password) -except Exception as e: - print(current_file_name, "登录失败:", e) +student_client = login(url, username, password) # 获取个人信息 -try: - info = get_user_info(student_client, output_type="info") -except Exception as e: - print(current_file_name, "获取个人信息失败:", e) +info = get_user_info(student_client, output_type="info") # 获取完整个人信息 -try: - integrated_info = get_user_info(student_client, output_type="integrated_info") -except Exception as e: - print(current_file_name, "获取完整个人信息失败:", e) +integrated_info = get_user_info(student_client, output_type="integrated_info") # 加密个人信息 encrypted_info = md5_encrypt(info) @@ -106,10 +97,7 @@ for _ in range(run_count): old_grade_file.write(grade_file.read()) # 获取成绩信息 - try: - grade = get_grade(student_client, output_type="grade") - except Exception as e: - print(current_file_name, "获取成绩信息失败:", e) + grade = get_grade(student_client, output_type="grade") # 成绩不为空时 if grade: @@ -118,12 +106,11 @@ for _ in range(run_count): grade_file.truncate() # 获取整合后的成绩信息 - try: - integrated_grade_info = get_grade( - student_client, output_type="integrated_grade_info" - ) - except Exception as e: - print(current_file_name, "获取整合后的成绩信息失败:", e) + integrated_grade_info = get_grade( + student_client, output_type="integrated_grade_info" + ) + if integrated_grade_info == "获取成绩时出错": + integrated_grade_info += "\n------" else: # 成绩为空时将成绩信息定义为"成绩为空" integrated_grade_info = "------\n成绩为空\n------" @@ -146,10 +133,7 @@ with open(grade_file_path, "r") as grade_file, open( integrated_grade_info += f"\n" f"MD5:{encrypted_integrated_grade_info}" # 获取未公布成绩的课程和异常的课程 -try: - selected_courses_filtering = get_selected_courses(student_client) -except Exception as e: - print(current_file_name, "获取未公布成绩的课程和异常的课程失败:", e) +selected_courses_filtering = get_selected_courses(student_client) # 工作流信息 workflow_info = ( diff --git a/zfn_api.py b/zfn_api.py index 0d29344..8bc4eb0 100644 --- a/zfn_api.py +++ b/zfn_api.py @@ -966,6 +966,8 @@ class Client: "class_name": i.get("jxbmc"), "title": i.get("kcmc"), "teacher": i.get("jsxm"), + "course_year": i.get("xnmc"), + "course_semester": i.get("xqmmc") } for i in selected["items"] ],