add
This commit is contained in:
@@ -53,6 +53,9 @@ run_count = 2
|
|||||||
# 初始化运行日志
|
# 初始化运行日志
|
||||||
run_log = ""
|
run_log = ""
|
||||||
|
|
||||||
|
# 初始化错误内容
|
||||||
|
error_content = []
|
||||||
|
|
||||||
# 当前时间
|
# 当前时间
|
||||||
current_time = "------\n" + datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f")[:-3]
|
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")
|
integrated_info = get_user_info(student_client, output_type="integrated_info")
|
||||||
|
|
||||||
if not info or not integrated_info:
|
if not info or not integrated_info:
|
||||||
run_log += "个人信息为空\n"
|
error_content.append("个人信息为空")
|
||||||
run_count = 1
|
run_count = 1
|
||||||
|
|
||||||
elif "获取个人信息时出错" in info or "获取个人信息时出错" in integrated_info:
|
elif "获取个人信息时出错" in info or "获取个人信息时出错" in integrated_info:
|
||||||
run_log += "获取个人信息时出错\n"
|
error_content.append("获取个人信息时出错")
|
||||||
run_count = 1
|
run_count = 1
|
||||||
|
|
||||||
else:
|
else:
|
||||||
@@ -118,12 +121,12 @@ for _ in range(run_count):
|
|||||||
if not grade:
|
if not grade:
|
||||||
# 成绩为空时将成绩信息定义为"成绩为空"
|
# 成绩为空时将成绩信息定义为"成绩为空"
|
||||||
integrated_grade_info = "------\n成绩信息:\n成绩为空\n------"
|
integrated_grade_info = "------\n成绩信息:\n成绩为空\n------"
|
||||||
run_log += "成绩为空\n"
|
error_content.append("成绩为空")
|
||||||
|
|
||||||
elif "获取成绩时出错" in grade:
|
elif "获取成绩时出错" in grade:
|
||||||
# 获取成绩时出错时将成绩信息定义为"获取成绩时出错"
|
# 获取成绩时出错时将成绩信息定义为"获取成绩时出错"
|
||||||
integrated_grade_info = "------\n成绩信息:\n获取成绩时出错\n------"
|
integrated_grade_info = "------\n成绩信息:\n获取成绩时出错\n------"
|
||||||
run_log += "获取成绩时出错\n"
|
error_content.append("获取成绩时出错")
|
||||||
|
|
||||||
else:
|
else:
|
||||||
# 清空grade.txt文件内容
|
# 清空grade.txt文件内容
|
||||||
@@ -203,43 +206,47 @@ grades_updated_push_integrated_send_info = (
|
|||||||
f"{integrated_send_info}"
|
f"{integrated_send_info}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# 如果是第一次运行,则提示程序运行成功
|
if error_content:
|
||||||
if run_count == 2:
|
error_content = "、".join(map(str, error_content))
|
||||||
run_log += f"{first_run_text}\n"
|
run_log += f"你因{error_content}原因而运行失败。\n"
|
||||||
|
run_log += "------\n"
|
||||||
# 推送信息
|
|
||||||
first_run_text_response_text = send_message(
|
|
||||||
token,
|
|
||||||
"正方教务管理系统成绩推送",
|
|
||||||
first_time_run_integrated_send_info,
|
|
||||||
)
|
|
||||||
|
|
||||||
# 输出响应内容
|
|
||||||
run_log += f"{first_run_text_response_text}\n"
|
|
||||||
else:
|
else:
|
||||||
# 对grade.txt和old_grade.txt两个文件的内容进行比对,输出成绩是否更新
|
# 如果是第一次运行,则提示程序运行成功
|
||||||
if grade_content != old_grade_content or force_push_message:
|
if run_count == 2:
|
||||||
|
run_log += f"{first_run_text}\n"
|
||||||
# 如果非第一次运行,则输出成绩信息
|
|
||||||
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(
|
first_run_text_response_text = send_message(
|
||||||
token,
|
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:
|
else:
|
||||||
run_log += "------\n"
|
# 对grade.txt和old_grade.txt两个文件的内容进行比对,输出成绩是否更新
|
||||||
run_log += "成绩未更新"
|
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
|
# 更新info.txt
|
||||||
if run_count == 2:
|
if run_count == 2:
|
||||||
@@ -259,10 +266,22 @@ if run_log:
|
|||||||
github_step_summary_run_log = (
|
github_step_summary_run_log = (
|
||||||
f"# 正方教务管理系统成绩推送\n{run_log}\n{workflow_info}\n{copyright_text}"
|
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)
|
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 的环境文件中
|
# 将 github_step_summary_run_log 写入到 GitHub Actions 的环境文件中
|
||||||
with open(github_step_summary, "w", encoding="utf-8") as file:
|
with open(github_step_summary, "w", encoding="utf-8") as file:
|
||||||
file.write(github_step_summary_run_log)
|
file.write(github_step_summary_run_log)
|
||||||
|
|||||||
+35
-8
@@ -1,11 +1,29 @@
|
|||||||
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
|
|
||||||
|
|
||||||
def get_grade(student_client, output_type="none"):
|
def get_grade(student_client, output_type="none"):
|
||||||
try:
|
try:
|
||||||
# 获取成绩信息
|
# 定义重试次数上限为5次
|
||||||
grade_data = student_client.get_grade().get("data", {})
|
attempts = 5
|
||||||
grade = grade_data.get("courses", [])
|
# 初始化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:
|
if grade:
|
||||||
@@ -14,13 +32,17 @@ def get_grade(student_client, output_type="none"):
|
|||||||
|
|
||||||
# 遍历 grade 中的每个字典,将 title 中的中文括号替换为英文括号
|
# 遍历 grade 中的每个字典,将 title 中的中文括号替换为英文括号
|
||||||
for course_data_grade in grade:
|
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,否则将无法排序
|
# 对于没有提交时间参数的成绩,则将提交时间设置为1970-01-01 00:00:00,否则将无法排序
|
||||||
sorted_grade = sorted(
|
sorted_grade = sorted(
|
||||||
grade,
|
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,
|
reverse=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -34,16 +56,21 @@ def get_grade(student_client, output_type="none"):
|
|||||||
|
|
||||||
# (百分制成绩*学分)的总和
|
# (百分制成绩*学分)的总和
|
||||||
sum_of_percentage_grades_multiplied_by_credits = sum(
|
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计算 (学分*绩点)的总和/学分总和
|
||||||
gpa = "{:.2f}".format(total_xfjd / total_credit)
|
gpa = "{:.2f}".format(total_xfjd / total_credit)
|
||||||
|
|
||||||
# 百分制GPA计算 (百分制成绩*学分)的总和/学分总和
|
# 百分制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:
|
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成绩信息:"
|
integrated_grade_info = "------\n成绩信息:"
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
import time
|
||||||
import traceback
|
import traceback
|
||||||
from .get_grade import get_grade
|
from .get_grade import get_grade
|
||||||
|
|
||||||
@@ -7,9 +8,25 @@ def get_selected_courses(student_client):
|
|||||||
# 获取成绩信息
|
# 获取成绩信息
|
||||||
grade = get_grade(student_client, output_type="grade")
|
grade = get_grade(student_client, output_type="grade")
|
||||||
|
|
||||||
# 获取已选课程信息
|
# 定义重试次数上限为5次
|
||||||
selected_courses_data = student_client.get_selected_courses().get("data", {})
|
attempts = 5
|
||||||
selected_courses = selected_courses_data.get("courses", [])
|
# 初始化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:
|
if selected_courses:
|
||||||
|
|||||||
+54
-18
@@ -1,33 +1,69 @@
|
|||||||
from .get_grade import get_grade
|
from .get_grade import get_grade
|
||||||
import traceback
|
import traceback
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
def get_user_info(student_client, output_type="none"):
|
def get_user_info(student_client, output_type="none"):
|
||||||
try:
|
try:
|
||||||
# 获取个人信息
|
# 定义重试次数上限为5次
|
||||||
info = student_client.get_info()["data"]
|
attempts = 5
|
||||||
|
# 初始化info为空字典
|
||||||
|
info = {}
|
||||||
|
|
||||||
# 整合个人信息
|
# 使用while循环最多重试5次获取个人信息
|
||||||
info = f"个人信息:\n" f"学号:{info['sid']}\n" f"班级:{info['class_name']}\n" f"姓名:{info['name']}"
|
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:
|
# 如果info为空,等待1秒后重试
|
||||||
gpa = get_grade(student_client, output_type="gpa")
|
time.sleep(1)
|
||||||
percentage_gpa = get_grade(student_client, output_type="percentage_gpa")
|
# 减少剩余重试次数
|
||||||
# 整合个人信息
|
attempts -= 1
|
||||||
gpa_info = f"\n当前GPA:{gpa}\n" f"当前百分制GPA:{percentage_gpa}"
|
|
||||||
integrated_info = f"{info}{gpa_info}"
|
|
||||||
|
|
||||||
if output_type == "info":
|
# 如果成功获取到个人信息
|
||||||
return info
|
if info:
|
||||||
elif output_type == "integrated_info":
|
# 整合个人信息为字符串格式
|
||||||
return integrated_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:
|
else:
|
||||||
return "获取个人信息:参数缺失"
|
# 如果未获取到成绩信息,返回仅包含个人信息的字符串
|
||||||
|
return f"{info}"
|
||||||
else:
|
else:
|
||||||
return f"{info}"
|
# 如果重试5次仍未获取到个人信息,返回错误提示
|
||||||
|
return "个人信息:\n获取个人信息失败"
|
||||||
except Exception:
|
except Exception:
|
||||||
|
# 捕获并打印所有异常的详细信息
|
||||||
print(traceback.format_exc())
|
print(traceback.format_exc())
|
||||||
|
# 返回错误提示信息
|
||||||
return "个人信息:\n获取个人信息时出错"
|
return "个人信息:\n获取个人信息时出错"
|
||||||
|
|||||||
Reference in New Issue
Block a user