You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

135 lines
4.0 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

from kill_course import kill_course
from initialization import init, click_videoes
import json
from get_info import get_info
from collections import *
from loguru import logger
import subprocess
from typing import *
from DrissionPage import ChromiumPage
from DrissionPage.common import *
import time
from get_in import create_login_window
import os
# 录入账号密码
if not os.path.exists('info.json'):
create_login_window()
study_type = json.load(open('info.json', 'r'))['study_type']
# 这里以后会放一个初始化模块
init(study_type=study_type)
# 执行刷课
kill_course()
# 完成刷课后,判定是否存在需要答题或者评分的课程
'''
重新检测各个课程的status参数
1. 对于必修课存在3种情况:未完成,已完成,未答题
2. 对于其他课存在3种情况:未完成,已完成,未评分
'''
# 重新获取课程信息
def new_info() -> DefaultDict[str, List[Tuple[str, int, str]]]:
get_info(first=False)
new_info = json.load(open('course_info.json', 'r'))
# 读取各个类别的课程状态
new_cnt = defaultdict(list)
for k, v in new_info.items():
new_cnt[v['type']].append(
(k, v['rate'], v['status'])) # 课程类型作为键课程id作为值
return new_cnt
new_cnt = new_info()
# 首先检查是否还存在未完成的课程
for k, v in new_cnt.items():
for i in v:
if i[1] < 100:
logger.error('存在未完成的课程:{}! 将重新执行刷课'.format(i[0]))
# 完全关闭进程并重新执行刷课
kill_course(again=True)
subprocess.run(["python", __file__])
exit()
# 若上述检验通过,则重新读取课程信息并检验是否存在未答题或者未评分的课程
new_cnt = new_info()
not_judged = []
not_quiz = []
for k, v in new_cnt.items():
for i in v:
if i[2] == '未评分':
not_judged.append((i[0], k))
elif i[2] == '未答题':
not_quiz.append(i[0], k)
# 实现自动评分
def auto_judge(course_id: str, course_type: str) -> None:
# 根据课程类型和id进行定位
j_page = ChromiumPage() # 接管当前页面
# 判定课程类别
if course_type == '必修':
j_page.ele('@value=1').click()
elif course_type == '选修':
j_page.ele('@value=2').click()
elif course_type == '专题':
j_page.ele('@value=4').click()
elif course_type == '培训':
j_page.ele('@value=5').click()
time.sleep(1)
trs = j_page.ele('#tbody').eles('tag:tr')
for tr in trs:
# 鉴别课程序号
if tr.ele('tag:td').text.split('\t')[0] == course_id:
# 进入评分页面
tr.ele('tag:button@@text():进入评分').click()
j_page.ele('x://*[@id="gradeDetail_score"]/label[1]/input').click()
j_page.ele('tag:a@@text():保存').click()
time.sleep(1)
pass
# 实现自动评分
if not_judged:
for i in not_judged:
logger.info('正在对课程:{}进行评分'.format(i[0]))
auto_judge(i[0], i[1])
logger.success('已完成对课程:{}的评分'.format(i[0]))
else:
logger.info('没有需要评分的课程')
# 实现题目答案显示
def auto_quiz(course_id: str) -> None:
pass
if not_quiz:
for i in not_quiz:
logger.info('正在获取课程:{}的答案'.format(i[0]))
auto_quiz(i[0])
logger.success('已完成对课程:{}的答案获取'.format(i[0]))
else:
logger.info('没有需要答题的课程')
# 重新检验是否存在未评分或者未答题的课程
logger.debug('正在进行最终检验...')
time.sleep(2)
new_cnt = new_info()
not_judged = []
not_quiz = []
for k, v in new_cnt.items():
for i in v:
if i[2] == '未评分':
not_judged.append((i[0], k))
elif i[2] == '未完成作业':
not_quiz.append(i[0], k)
if not not_judged and not not_quiz:
logger.warning('所有课程均已完成,页面即将关闭')
page = ChromiumPage()
page.close_tabs()
else:
subprocess.run(["python", __file__])
exit()