diff --git a/delete_old_runs.py b/delete_old_runs.py index 9a78a0d..30e63fa 100644 --- a/delete_old_runs.py +++ b/delete_old_runs.py @@ -18,55 +18,39 @@ class GitHubActionsManager: if response.status_code == 200: # 如果请求成功 return response.json()["workflow_runs"] # 返回运行记录列表 else: # 如果请求失败 - print( - f"Failed to fetch runs from {url}. Status code: {response.status_code}" - ) # 打印错误信息 + print(f"Failed to fetch runs from {url}. Status code: {response.status_code}") # 打印错误信息 return [] # 返回空列表 def delete_run(self, run_id): delete_url = f"{self.runs_url}/{run_id}" # 构建删除运行记录的URL # 发送DELETE请求删除指定ID的运行记录 - response = requests.delete( - delete_url, headers={"Authorization": f"token {self.token}"} - ) + response = requests.delete(delete_url, headers={"Authorization": f"token {self.token}"}) if response.status_code == 204: # 如果删除成功 print(f"Deleted run with ID {run_id}") # 打印删除成功的消息 else: # 如果删除失败 - print( - f"Failed to delete run with ID {run_id}. Status code: {response.status_code}" - ) # 打印错误信息 + print(f"Failed to delete run with ID {run_id}. Status code: {response.status_code}") # 打印错误信息 def delete_old_runs(self, max_workers=2): next_page = self.runs_url # 初始化下一页的URL为第一页 while next_page: # 循环直到没有下一页 print(datetime.now().strftime("%Y-%m-%d %H:%M:%S:%f")[:-3]) # 打印时间 # 发送GET请求获取一页工作流运行记录 - response = requests.get( - next_page, headers={"Authorization": f"token {self.token}"} - ) + response = requests.get(next_page, headers={"Authorization": f"token {self.token}"}) if response.status_code == 200: # 如果请求成功 data = response.json() # 将响应数据转换为JSON格式 runs = data["workflow_runs"] # 获取运行记录列表 next_page = response.links.get("next", {}).get("url") # 获取下一页的URL - with ThreadPoolExecutor( - max_workers=max_workers - ) as executor: # 创建线程池 + with ThreadPoolExecutor(max_workers=max_workers) as executor: # 创建线程池 for run in runs: # 遍历每条运行记录 # 将运行记录的创建时间转换为UTC时间 - run_time = datetime.strptime( - run["created_at"], "%Y-%m-%dT%H:%M:%SZ" - ).replace(tzinfo=timezone.utc) + run_time = datetime.strptime(run["created_at"], "%Y-%m-%dT%H:%M:%SZ").replace(tzinfo=timezone.utc) # 计算当前时间与运行记录创建时间的差值 time_difference = self.current_time - run_time if time_difference > timedelta(hours=168): # 如果差值超过168小时 - executor.submit( - self.delete_run, run["id"] - ) # 提交删除运行记录的任务 + executor.submit(self.delete_run, run["id"]) # 提交删除运行记录的任务 else: # 如果请求失败 - print( - f"Failed to fetch runs. Status code: {response.status_code}" - ) # 打印错误信息 + print(f"Failed to fetch runs. Status code: {response.status_code}") # 打印错误信息 break # 退出循环 diff --git a/get_grade.py b/get_grade.py index b717e98..4e108a3 100644 --- a/get_grade.py +++ b/get_grade.py @@ -11,19 +11,13 @@ def get_grade(student_client, output_type="none"): if grade: # 遍历 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,18 +28,13 @@ def get_grade(student_client, output_type="none"): 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 - ) + 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 - ) + percentage_gpa = "{:.2f}".format(sum_of_percentage_grades_multiplied_by_credits / total_credit) # 初始化输出成绩信息字符串 integrated_grade_info = "成绩信息:" @@ -60,16 +49,7 @@ def get_grade(student_client, output_type="none"): score_grades = f"{course['grade']} ({course['percentage_grades']})" # 整合成绩信息 - integrated_grade_info += ( - f"\n" - f"教学班ID:{course['class_id']}\n" - f"课程名称:{course['title']}\n" - f"任课教师:{course['teacher']}\n" - f"成绩:{score_grades}\n" - f"提交时间:{course['submission_time']}\n" - f"提交人姓名:{course['name_of_submitter']}\n" - f"------" - ) + integrated_grade_info += f"\n" f"教学班ID:{course['class_id']}\n" f"课程名称:{course['title']}\n" f"任课教师:{course['teacher']}\n" f"成绩:{score_grades}\n" f"提交时间:{course['submission_time']}\n" f"提交人姓名:{course['name_of_submitter']}\n" f"------" if output_type == "grade": return grade diff --git a/get_selected_courses.py b/get_selected_courses.py index 82e41b8..b0a2bd0 100644 --- a/get_selected_courses.py +++ b/get_selected_courses.py @@ -39,9 +39,7 @@ def get_selected_courses(student_client): for course in selected_courses + (grade or []): # 获取课程的学年和学期 try: - year, semester, seq = course["course_year"].split("-") + [ - course["course_semester"] - ] + year, semester, seq = course["course_year"].split("-") + [course["course_semester"]] except Exception: pass @@ -51,28 +49,16 @@ def get_selected_courses(student_client): # 判断课程是否未公布成绩或为异常课程 if course["class_id"] not in grade_class_ids: # 未公布成绩 - ungraded_courses_by_semester.setdefault( - yearsemester_name, [] - ).append( - f"{course['title'].replace('(', '(').replace(')', ')')} - {course['teacher']}" - ) - elif course["class_id"] not in { - course["class_id"] for course in selected_courses - }: + ungraded_courses_by_semester.setdefault(yearsemester_name, []).append(f"{course['title'].replace('(', '(').replace(')', ')')} - {course['teacher']}") + elif course["class_id"] not in {course["class_id"] for course in selected_courses}: # 异常课程 - abnormal_courses_by_semester.setdefault( - yearsemester_name, [] - ).append( - f"{course['title'].replace('(', '(').replace(')', ')')} - {course['teacher']}" - ) + abnormal_courses_by_semester.setdefault(yearsemester_name, []).append(f"{course['title'].replace('(', '(').replace(')', ')')} - {course['teacher']}") # 构建输出内容 if ungraded_courses_by_semester: # 存在未公布成绩的课程 selected_courses_filtering += "------\n未公布成绩的课程:" - for i, (semester, courses) in enumerate( - ungraded_courses_by_semester.items() - ): + for i, (semester, courses) in enumerate(ungraded_courses_by_semester.items()): if i > 0: selected_courses_filtering += "\n------" selected_courses_filtering += f"\n{semester}:" @@ -85,9 +71,7 @@ def get_selected_courses(student_client): # 如果存在课程,添加分隔线 selected_courses_filtering += "\n" selected_courses_filtering += "------\n异常的课程:" - for i, (semester, courses) in enumerate( - abnormal_courses_by_semester.items() - ): + for i, (semester, courses) in enumerate(abnormal_courses_by_semester.items()): if i > 0: selected_courses_filtering += "\n------" selected_courses_filtering += f"\n{semester}:" diff --git a/get_user_info.py b/get_user_info.py index 2c5cb20..625db4a 100644 --- a/get_user_info.py +++ b/get_user_info.py @@ -8,12 +8,7 @@ def get_user_info(student_client, output_type="none"): info = student_client.get_info()["data"] # 整合个人信息 - info = ( - f"个人信息:\n" - f"学号:{info['sid']}\n" - f"班级:{info['class_name']}\n" - f"姓名:{info['name']}" - ) + info = f"个人信息:\n" f"学号:{info['sid']}\n" f"班级:{info['class_name']}\n" f"姓名:{info['name']}" grade = get_grade(student_client, output_type="grade") @@ -21,9 +16,7 @@ def get_user_info(student_client, output_type="none"): 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"------" - ) + gpa_info = f"\n当前GPA:{gpa}\n" f"当前百分制GPA:{percentage_gpa}\n" f"------" integrated_info = f"{info}{gpa_info}" if output_type == "info": diff --git a/main.py b/main.py index 8f71680..7bbdc07 100644 --- a/main.py +++ b/main.py @@ -92,9 +92,7 @@ for _ in range(run_count): old_grade_file.truncate() # 将grade.txt文件中的内容写入old_grade.txt文件内 - with open(grade_file_path, "r") as grade_file, open( - old_grade_file_path, "w" - ) as old_grade_file: + with open(grade_file_path, "r") as grade_file, open(old_grade_file_path, "w") as old_grade_file: old_grade_file.write(grade_file.read()) # 获取成绩信息 @@ -107,9 +105,7 @@ for _ in range(run_count): grade_file.truncate() # 获取整合后的成绩信息 - integrated_grade_info = get_grade( - student_client, output_type="integrated_grade_info" - ) + integrated_grade_info = get_grade(student_client, output_type="integrated_grade_info") if integrated_grade_info == "获取成绩时出错": integrated_grade_info += "\n------" else: @@ -124,9 +120,7 @@ for _ in range(run_count): grade_file.write(encrypted_integrated_grade_info) # 读取grade.txt和old_grade.txt文件的内容 -with open(grade_file_path, "r") as grade_file, open( - old_grade_file_path, "r" -) as old_grade_file: +with open(grade_file_path, "r") as grade_file, open(old_grade_file_path, "r") as old_grade_file: grade_content = grade_file.read() old_grade_content = old_grade_file.read() @@ -137,47 +131,21 @@ integrated_grade_info += f"\n" f"MD5:{encrypted_integrated_grade_info}" selected_courses_filtering = get_selected_courses(student_client) # 工作流信息 -workflow_info = ( - f"------\n" - f"工作流信息:\n" - f"Force Push Message:{force_push_message}\n" - f"Triggered By:{github_event_name}\n" - f"Run By:{github_triggering_actor}\n" - f"Repository Name:{repository_name}\n" - f"Commit SHA:{github_sha}\n" - f"Workflow Name:{github_workflow}\n" - f"Workflow Number:{github_run_number}\n" - f"Workflow ID:{github_run_id}\n" - f"Beijing Time:{beijing_time}" -) +workflow_info = f"------\n" f"工作流信息:\n" f"Force Push Message:{force_push_message}\n" f"Triggered By:{github_event_name}\n" f"Run By:{github_triggering_actor}\n" f"Repository Name:{repository_name}\n" f"Commit SHA:{github_sha}\n" f"Workflow Name:{github_workflow}\n" f"Workflow Number:{github_run_number}\n" f"Workflow ID:{github_run_id}\n" f"Beijing Time:{beijing_time}" # 第一次运行时的提示文本 -first_run_text = ( - "你的程序运行成功\n" - "从现在开始,程序将会每隔 30 分钟自动检测一次成绩是否有更新\n" - "若有更新,将通过微信推送及时通知你\n" - "------" -) +first_run_text = "你的程序运行成功\n" "从现在开始,程序将会每隔 30 分钟自动检测一次成绩是否有更新\n" "若有更新,将通过微信推送及时通知你\n" "------" # 整合所有信息 # 注意此处integrated_send_info保存的是未加密的信息,仅用于信息推送 # 若是在 Github Actions 等平台运行,请不要使用print(integrated_send_info) -integrated_send_info = ( - f"{integrated_info}\n" - f"{integrated_grade_info}\n" - f"{selected_courses_filtering}\n" - f"{workflow_info if github_actions else current_time}" -) +integrated_send_info = f"{integrated_info}\n" f"{integrated_grade_info}\n" f"{selected_courses_filtering}\n" f"{workflow_info if github_actions else current_time}" # 整合首次运行时需要使用到的所有信息 first_time_run_integrated_send_info = f"{first_run_text}\n" f"{integrated_send_info}" # 整合成绩已更新时需要使用到的所有信息 -grades_updated_push_integrated_send_info = ( - f"{'强制推送信息成功' if force_push_message else '教务管理系统成绩已更新'}\n" - f"------\n" - f"{integrated_send_info}" -) +grades_updated_push_integrated_send_info = f"{'强制推送信息成功' if force_push_message else '教务管理系统成绩已更新'}\n" f"------\n" f"{integrated_send_info}" # 如果是第一次运行,则提示程序运行成功 if run_count == 2: @@ -229,9 +197,7 @@ if run_log: print(run_log) # 整合JobSummary信息 - github_step_summary_run_log = ( - f"# 正方教务管理系统成绩推送\n{run_log}\n{workflow_info}" - ) + github_step_summary_run_log = f"# 正方教务管理系统成绩推送\n{run_log}\n{workflow_info}" if github_actions: # 将任意个数的换行替换为两个换行 diff --git a/zfn_api.py b/zfn_api.py index 8bc4eb0..ee08b83 100644 --- a/zfn_api.py +++ b/zfn_api.py @@ -47,12 +47,8 @@ class Client: self.kaptcha_url = urljoin(self.base_url, "kaptcha") self.headers = requests.utils.default_headers() self.headers["Referer"] = self.login_url - self.headers["User-Agent"] = ( - "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" - ) - self.headers["Accept"] = ( - "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3" - ) + self.headers["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36" + self.headers["Accept"] = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3" self.sess = requests.Session() self.sess.keep_alive = False self.cookies = cookies @@ -62,9 +58,7 @@ class Client: need_verify = False try: # 登录页 - req_csrf = self.sess.get( - self.login_url, headers=self.headers, timeout=self.timeout - ) + req_csrf = self.sess.get(self.login_url, headers=self.headers, timeout=self.timeout) if req_csrf.status_code != 200: return {"code": 2333, "msg": "教务系统挂了"} # 获取csrf_token @@ -72,9 +66,7 @@ class Client: csrf_token = doc("#csrftoken").attr("value") pre_cookies = self.sess.cookies.get_dict() # 获取publicKey并加密密码 - req_pubkey = self.sess.get( - self.key_url, headers=self.headers, timeout=self.timeout - ).json() + req_pubkey = self.sess.get(self.key_url, headers=self.headers, timeout=self.timeout).json() modulus = req_pubkey["modulus"] exponent = req_pubkey["exponent"] if str(doc("input#yzm")) == "": @@ -107,9 +99,7 @@ class Client: } # 需要验证码,返回相关页面验证信息给用户,TODO: 增加更多验证方式 need_verify = True - req_kaptcha = self.sess.get( - self.kaptcha_url, headers=self.headers, timeout=self.timeout - ) + req_kaptcha = self.sess.get(self.kaptcha_url, headers=self.headers, timeout=self.timeout) kaptcha_pic = base64.b64encode(req_kaptcha.content).decode() return { "code": 1001, @@ -143,9 +133,7 @@ class Client: msg = "获取验证码时未记录的错误" if need_verify else "登录时未记录的错误" return {"code": 999, "msg": f"{msg}:{str(e)}"} - def login_with_kaptcha( - self, sid, csrf_token, cookies, password, modulus, exponent, kaptcha, **kwargs - ): + def login_with_kaptcha(self, sid, csrf_token, cookies, password, modulus, exponent, kaptcha, **kwargs): """需要验证码的登陆""" try: encrypt_password = self.encrypt_password(password, modulus, exponent) @@ -263,9 +251,7 @@ class Client: """获取个人信息""" url = urljoin(self.base_url, "xsxxxggl/xsgrxxwh_cxXsgrxx.html?gnmkdm=N100801") try: - req_info = self.sess.get( - url, headers=self.headers, cookies=self.cookies, timeout=self.timeout - ) + req_info = self.sess.get(url, headers=self.headers, cookies=self.cookies, timeout=self.timeout) if req_info.status_code != 200: return {"code": 2333, "msg": "教务系统挂了"} doc = pq(req_info.text) @@ -301,32 +287,12 @@ class Client: # "status": "无" if pending_result.get("学籍状态:") == '' else pending_result["学籍状态:"], # "entry_date": "无" if pending_result.get("入学日期:") == '' else pending_result["入学日期:"], # "graduation_school": "无" if pending_result.get("毕业中学:") == '' else pending_result["毕业中学:"], - "domicile": ( - "无" - if pending_result.get("籍贯:") == "" - else pending_result["籍贯:"] - ), - "phone_number": ( - "无" - if pending_result.get("手机号码:") == "" - else pending_result["手机号码:"] - ), + "domicile": ("无" if pending_result.get("籍贯:") == "" else pending_result["籍贯:"]), + "phone_number": ("无" if pending_result.get("手机号码:") == "" else pending_result["手机号码:"]), "parents_number": "无", - "email": ( - "无" - if pending_result.get("电子邮箱:") == "" - else pending_result["电子邮箱:"] - ), - "political_status": ( - "无" - if pending_result.get("政治面貌:") == "" - else pending_result["政治面貌:"] - ), - "national": ( - "无" - if pending_result.get("民族:") == "" - else pending_result["民族:"] - ), + "email": ("无" if pending_result.get("电子邮箱:") == "" else pending_result["电子邮箱:"]), + "political_status": ("无" if pending_result.get("政治面貌:") == "" else pending_result["政治面貌:"]), + "national": ("无" if pending_result.get("民族:") == "" else pending_result["民族:"]), # "education": "无" if pending_result.get("培养层次:") == '' else pending_result["培养层次:"], # "postal_code": "无" if pending_result.get("邮政编码:") == '' else pending_result["邮政编码:"], # "grade": int(pending_result["学号:"][0:4]), @@ -335,21 +301,9 @@ class Client: # 如果在个人信息页面获取到了学院班级 result.update( { - "college_name": ( - "无" - if pending_result.get("学院名称:") == "" - else pending_result["学院名称:"] - ), - "major_name": ( - "无" - if pending_result.get("专业名称:") == "" - else pending_result["专业名称:"] - ), - "class_name": ( - "无" - if pending_result.get("班级名称:") == "" - else pending_result["班级名称:"] - ), + "college_name": ("无" if pending_result.get("学院名称:") == "" else pending_result["学院名称:"]), + "major_name": ("无" if pending_result.get("专业名称:") == "" else pending_result["专业名称:"]), + "class_name": ("无" if pending_result.get("班级名称:") == "" else pending_result["班级名称:"]), } ) else: @@ -370,32 +324,15 @@ class Client: # 通过学生证补办申请入口,来补全部分信息 for ul_item in _doc.find("div.col-sm-6").items(): content = pq(ul_item).find("div.form-group") - key = ( - pq(content).find("label.col-sm-4.control-label").text() - + ":" - ) # 为了保持格式一致,这里加个冒号 - value = ( - pq(content).find("div.col-sm-8 label.control-label").text() - ) + key = pq(content).find("label.col-sm-4.control-label").text() + ":" # 为了保持格式一致,这里加个冒号 + value = pq(content).find("div.col-sm-8 label.control-label").text() # 到这一步,解析到的数据基本就是一个键值对形式的html数据了,比如"[学号:]:123456" pending_result[key] = value result.update( { - "college_name": ( - "无" - if pending_result.get("学院:") is None - else pending_result["学院:"] - ), - "major_name": ( - "无" - if pending_result.get("专业:") is None - else pending_result["专业:"] - ), - "class_name": ( - "无" - if pending_result.get("班级:") is None - else pending_result["班级:"] - ), + "college_name": ("无" if pending_result.get("学院:") is None else pending_result["学院:"]), + "major_name": ("无" if pending_result.get("专业:") is None else pending_result["专业:"]), + "class_name": ("无" if pending_result.get("班级:") is None else pending_result["班级:"]), } ) return {"code": 1000, "msg": "获取个人信息成功", "data": result} @@ -422,11 +359,7 @@ class Client: """ url = urljoin( self.base_url, - ( - "cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005" - if use_personal_info - else "cjcx/cjcx_cxXsgrcj.html?doType=query&gnmkdm=N305005" - ), + ("cjcx/cjcx_cxDgXscj.html?doType=query&gnmkdm=N305005" if use_personal_info else "cjcx/cjcx_cxXsgrcj.html?doType=query&gnmkdm=N305005"), ) temp_term = term term = term**2 * 3 @@ -576,9 +509,7 @@ class Client: self.base_url, "xsxy/xsxyqk_cxXsxyqkIndex.html?gnmkdm=N105515&layout=default", ) - url_info = urljoin( - self.base_url, "xsxy/xsxyqk_cxJxzxjhxfyqKcxx.html?gnmkdm=N105515" - ) + url_info = urljoin(self.base_url, "xsxy/xsxyqk_cxJxzxjhxfyqKcxx.html?gnmkdm=N105515") try: req_main = self.sess.get( url_main, @@ -595,9 +526,7 @@ class Client: if str(doc_main("div.alert-danger")) != "": return {"code": 998, "msg": doc_main("div.alert-danger").text()} sid = doc_main("form#form input#xh_id").attr("value") - display_statistics = ( - doc_main("div#alertBox").text().replace(" ", "").replace("\n", "") - ) + display_statistics = doc_main("div#alertBox").text().replace(" ", "").replace("\n", "") sid = doc_main("input#xh_id").attr("value") statistics = self.get_academia_statistics(display_statistics) type_statistics = self.get_academia_type_statistics(req_main.text) @@ -623,9 +552,7 @@ class Client: "course_id": i.get("KCH"), "title": i.get("KCMC"), "situation": self.parse_int(i.get("XDZT")), - "display_term": self.get_display_term( - sid, i.get("JYXDXNM"), i.get("JYXDXQMC") - ), + "display_term": self.get_display_term(sid, i.get("JYXDXNM"), i.get("JYXDXQMC")), "credit": self.align_floats(i.get("XF")), "category": self.get_course_category(type, i), "nature": i.get("KCXZMC"), @@ -765,12 +692,7 @@ class Client: timeout=self.timeout, ) # 生成PDF文件URL - pdf = ( - req_file.text.replace("#成功", "") - .replace('"', "") - .replace("/", "\\") - .replace("\\\\", "/") - ) + pdf = req_file.text.replace("#成功", "").replace('"', "").replace("/", "\\").replace("\\\\", "/") # 下载PDF文件 req_pdf = self.sess.get( urljoin(self.base_url, pdf), @@ -901,10 +823,7 @@ class Client: if doc("h5").text() == "用户登录" or "错误" in doc("title").text(): return {"code": 1006, "msg": "未登录或已过期,请重新登录"} notifications = req_notification.json() - result = [ - {**self.split_notifications(i), "create_time": i.get("cjsj")} - for i in notifications.get("items") - ] + result = [{**self.split_notifications(i), "create_time": i.get("cjsj")} for i in notifications.get("items")] return {"code": 1000, "msg": "获取消息成功", "data": result} except exceptions.Timeout: return {"code": 1003, "msg": "获取消息超时"} @@ -960,17 +879,7 @@ class Client: "year": year, "term": temp_term, "count": len(selected), - "courses": [ - { - "class_id": i.get("jxb_id"), - "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"] - ], + "courses": [{"class_id": i.get("jxb_id"), "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"]], } return {"code": 1000, "msg": "获取已选课程成功", "data": result} except exceptions.Timeout: @@ -1035,9 +944,7 @@ class Client: value = head_data_content.attr("value") head_data[str(name)] = str(value) - url_display = urljoin( - self.base_url, "xsxk/zzxkyzb_cxZzxkYzbDisplay.html?gnmkdm=N253512" - ) + url_display = urljoin(self.base_url, "xsxk/zzxkyzb_cxZzxkYzbDisplay.html?gnmkdm=N253512") display_req_data = { "xkkz_id": head_data[f"bkk{block}_xkkz_id"], "xszxzt": "1", @@ -1059,12 +966,8 @@ class Client: head_data.update(display_data) # 获取课程列表 - url_kch = urljoin( - self.base_url, "xsxk/zzxkyzb_cxZzxkYzbPartDisplay.html?gnmkdm=N253512" - ) - url_bkk = urljoin( - self.base_url, "xsxk/zzxkyzb_cxJxbWithKchZzxkYzb.html?gnmkdm=N253512" - ) + url_kch = urljoin(self.base_url, "xsxk/zzxkyzb_cxZzxkYzbPartDisplay.html?gnmkdm=N253512") + url_bkk = urljoin(self.base_url, "xsxk/zzxkyzb_cxJxbWithKchZzxkYzb.html?gnmkdm=N253512") term = term**2 * 3 kch_data = { "bklx_id": head_data["bklx_id"], @@ -1173,9 +1076,7 @@ class Client: ): """选课""" try: - url_select = urljoin( - self.base_url, "xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512" - ) + url_select = urljoin(self.base_url, "xsxk/zzxkyzb_xkBcZyZzxkYzb.html?gnmkdm=N253512") term = term**2 * 3 select_data = { "jxb_ids": do_id, @@ -1228,9 +1129,7 @@ class Client: def cancel_course(self, do_id: str, course_id: str, year: int, term: int): """取消选课""" try: - url_cancel = urljoin( - self.base_url, "xsxk/zzxkyzb_tuikBcZzxkYzb.html?gnmkdm=N253512" - ) + url_cancel = urljoin(self.base_url, "xsxk/zzxkyzb_tuikBcZzxkYzb.html?gnmkdm=N253512") term = term**2 * 3 cancel_data = { "jxb_ids": do_id, @@ -1422,14 +1321,7 @@ class Client: content, ) finder_list = list({}.fromkeys(finder).keys()) - academia_list = [ - list(i) - for i in finder_list - if i[0] != "" # 类型名称不为空 - and len(i[0]) <= 20 # 避免正则到首部过长类型名称 - and "span" not in i[-1] # 避免正则到尾部过长类型名称 - and i[0] not in cls.ignore_type # 忽略的类型名称 - ] + academia_list = [list(i) for i in finder_list if i[0] != "" and len(i[0]) <= 20 and "span" not in i[-1] and i[0] not in cls.ignore_type] # 类型名称不为空 # 避免正则到首部过长类型名称 # 避免正则到尾部过长类型名称 # 忽略的类型名称 result = { i[0]: { "id": i[-1], @@ -1473,47 +1365,22 @@ class Client: for index in range(len(schedule["courses"])): if (schedule["courses"]).index(items) == count: # 如果对比到自己就忽略 continue - elif ( - items["course_id"] - == schedule["courses"][index]["course_id"] # 同周同天同课程 - and items["weekday"] == schedule["courses"][index]["weekday"] - and items["weeks"] == schedule["courses"][index]["weeks"] - ): + elif items["course_id"] == schedule["courses"][index]["course_id"] and items["weekday"] == schedule["courses"][index]["weekday"] and items["weeks"] == schedule["courses"][index]["weeks"]: # 同周同天同课程 repetIndex.append(index) # 满足条件记录索引 count += 1 # 记录当前对比课程的索引 - if ( - len(repetIndex) % 2 != 0 - ): # 暂时考虑一天两个时段上同一门课,不满足条件不进行修改 + if len(repetIndex) % 2 != 0: # 暂时考虑一天两个时段上同一门课,不满足条件不进行修改 return schedule for r in range(0, len(repetIndex), 2): # 索引数组两两成对,故步进2循环 fir = repetIndex[r] sec = repetIndex[r + 1] if len(re.findall(r"(\d+)", schedule["courses"][fir]["sessions"])) == 4: - schedule["courses"][fir]["sessions"] = ( - re.findall(r"(\d+)", schedule["courses"][fir]["sessions"])[0] - + "-" - + re.findall(r"(\d+)", schedule["courses"][fir]["sessions"])[1] - + "节" - ) - schedule["courses"][fir]["list_sessions"] = cls.list_sessions( - schedule["courses"][fir]["sessions"] - ) - schedule["courses"][fir]["time"] = cls.display_course_time( - schedule["courses"][fir]["sessions"] - ) + schedule["courses"][fir]["sessions"] = re.findall(r"(\d+)", schedule["courses"][fir]["sessions"])[0] + "-" + re.findall(r"(\d+)", schedule["courses"][fir]["sessions"])[1] + "节" + schedule["courses"][fir]["list_sessions"] = cls.list_sessions(schedule["courses"][fir]["sessions"]) + schedule["courses"][fir]["time"] = cls.display_course_time(schedule["courses"][fir]["sessions"]) - schedule["courses"][sec]["sessions"] = ( - re.findall(r"(\d+)", schedule["courses"][sec]["sessions"])[2] - + "-" - + re.findall(r"(\d+)", schedule["courses"][sec]["sessions"])[3] - + "节" - ) - schedule["courses"][sec]["list_sessions"] = cls.list_sessions( - schedule["courses"][sec]["sessions"] - ) - schedule["courses"][sec]["time"] = cls.display_course_time( - schedule["courses"][sec]["sessions"] - ) + schedule["courses"][sec]["sessions"] = re.findall(r"(\d+)", schedule["courses"][sec]["sessions"])[2] + "-" + re.findall(r"(\d+)", schedule["courses"][sec]["sessions"])[3] + "节" + schedule["courses"][sec]["list_sessions"] = cls.list_sessions(schedule["courses"][sec]["sessions"]) + schedule["courses"][sec]["time"] = cls.display_course_time(schedule["courses"][sec]["sessions"]) return schedule @classmethod