add
This commit is contained in:
@@ -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)
|
||||
|
||||
+35
-8
@@ -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成绩信息:"
|
||||
|
||||
@@ -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:
|
||||
|
||||
+54
-18
@@ -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获取个人信息时出错"
|
||||
|
||||
Reference in New Issue
Block a user