def login(self): """登录""" sid = GLOBAL_CONFIG.get_user_sid() token = GLOBAL_CONFIG.get_user_token() # 尝试使用 cookies 登录 if sid and token and self._mgr.login_by_cookie(sid, token): GLOBAL_CONFIG.set_user_sid(sid) GLOBAL_CONFIG.set_user_token(token) info("使用 Cookie 登录成功!") self._stu_info = self._mgr.get_stu_info() self._gpa_info = self._mgr.get_gpa_info() return # cookies 无效, 用户名密码登录 username = input("输入学号: ") password = input("输入密码: ") if username and password and self._mgr.login(username, password): cookies = self._mgr.get_cookies() GLOBAL_CONFIG.set_user_sid(cookies.get("sid")) GLOBAL_CONFIG.set_user_token(cookies.get("token")) info("登录成功, Cookie 已保存!") self._stu_info = self._mgr.get_stu_info() self._gpa_info = self._mgr.get_gpa_info() return error("登录失败!")
def _ask_for_choice(lst: List[T]) -> Optional[T]: try: choose = input("\n选择序号: ") except KeyboardInterrupt: return if not choose or not choose.isdigit(): error("序号有误") return choose = int(choose) - 1 if choose < 0 or choose >= len(lst): error("序号有误") return return lst[choose]
def auto_select_course(self, courses: List[Course], interval: float): """一直选课, 直到成功""" if interval < 1: info("太快了, 慢点啊兄弟! 时间间隔不能小于 1s") count = 1 try: while True: if self._mgr.select_courses(courses): info("选课成功!") break error(f"{count} 选课失败, {interval}s 后重试...") count += 1 sleep(interval) except KeyboardInterrupt: pass
def print_task_courses(self, task: TeachTask) -> Optional[List[Course]]: course_list = self._mgr.get_task_courses(task) if not course_list: error("获取课程信息失败") return None for i, course in enumerate(course_list, 1): selected = "[√]" if course.is_selected else "[ ]" max_stu = course.max_stu_num if course.max_stu_num > 0 else "∞" remains = course.max_stu_num - course.cur_stu_num text = f"[{i}] {course.course_type_value}\t{course.tech_class:<4} {course.cur_stu_num:>4}/{max_stu:<4}\t剩余: {remains:>4}\t已选: {selected}\t{course.teachers}\t备注: {course.brief}" if course.is_selected: color_print(text, "green") else: print(text) return course_list
def exit_courses(self): """ 退课操作 """ selected_tasks = self._mgr.get_selected_task() for i, task in enumerate(selected_tasks, 1): text = f"[{i}] {text_align(task.course_name, 28)}\t{task.task_type_value}\t学分: {task.credit:<3}\t{task.choose_status_value}\t{task.status_value}" color_print(text, "green") print(f"\t{task.t_class_info} \t {task.s_class_info}\n") task = self._ask_for_choice(selected_tasks) if not task: return if self._mgr.exit_course(task): info(f"{task.course_name}: 退课成功!") else: error(f"{task.course_name}: 退课失败,该课程选课已关闭或已结束")
def select_task(self, is_must): """打印课程信息列表""" tasks = self._mgr.get_teach_tasks(is_must) if not tasks: error("获取信息失败, 请检查网络连接并重试!") return for i, task in enumerate(tasks, 1): selected = "[√]" if task.is_selected else "[ ]" max_stu = task.max_stu_num if task.max_stu_num > 0 else "∞" text = f"[{i}]\t{text_align(task.course_name, 28)}\t学分: {task.credit:<8}{task.cur_stu_num:>4}/{max_stu:<4} {task.task_type_value} {task.choose_status_value} 已选: {selected}" if task.is_selected: color_print(text, "green") else: print(text) task = self._ask_for_choice(tasks) if not task: return courses_list = self.print_task_courses(task) if not courses_list: return task_nums = input("\n选择课程编号(多个编号用空格分开): ") or "" if not task_nums: info("放弃选课") return task_nums = [int(n) - 1 for n in task_nums.split()] for n in task_nums: if n < 0 or n >= len(courses_list): error("包含无效课程编号, 请检查") return courses = [courses_list[n] for n in task_nums] if self._mgr.select_courses(courses): info("选课成功!") return error("选课失败!") choose = input("是否需要挂机抢课(y/n): ") or "n" if choose.lower() == "y": interval = float(input("挂机抢课时间间隔(秒): ") or "3") self.auto_select_course(courses, interval)
def inner(self, *args, **kwargs): if not self._stu_info: error("请先登录!") return return func(self, *args, **kwargs)