Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
以下是所有**可能**支持的浏览器:

- Firefox
- Chrome
- Chrome(如果你是 Chromium,也请在下面的浏览器名中填写 Chrome)
- Ie
- Edge
- Safari
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@ dependencies = [
]

[[tool.uv.index]]
url = "https://mirrors.aliyun.com/pypi/simple"
url = "https://pypi.tuna.tsinghua.edu.cn/simple"
default = true
19 changes: 14 additions & 5 deletions src/auto_base.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@ def read_config() -> dict:
config = yaml.load(f, yaml.FullLoader)
# 密码可能是纯数字
config['password'] = str(config['password'])
# 如果转换延迟倍率为浮点数,失败(不存在或不合法)则报错并默认1.0
try:
config['delay_multiplier'] = float(config.get('delay_multiplier'))
except ValueError:
logging.warning('配置文件中 delay_multiplier 不是合法的浮点数,将使用默认值 1.0')
config['delay_multiplier'] = 1.0
except TypeError:
logging.info('配置文件中未设置 delay_multiplier,将使用默认值 1.0')
config['delay_multiplier'] = 1.0
# 便携版特有默认配置
config['browser'] = 'Chrome'
config['driver_path'] = r'.\chromedriver.exe'
Expand Down Expand Up @@ -80,7 +89,7 @@ def login(self) -> str:
self.driver.find_element(By.ID, 'login__password_password').send_keys(self.config['password'])
self.driver.find_element(By.CLASS_NAME, 'ant-btn-block').submit()
# 等待一段时间,确保页面加载完成并生成 token
time.sleep(3)
time.sleep(3 * self.config.get('delay_multiplier'))
# 获取所有 cookie
cookies = self.driver.get_cookies()
token = None
Expand All @@ -105,22 +114,22 @@ def click_and_switch(self, btn: WebElement) -> None:
:param btn: 要点击的按钮
"""
self.click(btn)
time.sleep(1) # 给新页面反应一会
time.sleep(1 * self.config.get('delay_multiplier')) # 给新页面反应一会
# 切换到当前页面
handles = self.driver.window_handles
self.driver.switch_to.window(handles[1])
time.sleep(3)
time.sleep(3 * self.config.get('delay_multiplier'))

def close_and_switch(self) -> None:
"""关闭当前页面并返回到首页"""
handles = self.driver.window_handles
self.driver.close()
self.driver.switch_to.window(handles[0])
time.sleep(1)
time.sleep(1 * self.config.get('delay_multiplier'))

def finish_days_list(self) -> None:
"""完成所有天"""
time.sleep(5)
time.sleep(5 * self.config.get('delay_multiplier'))
days = self.driver.find_elements(By.CSS_SELECTOR, 'li[data-active="true"], li[data-active="false"]')
logging.info(f'一共有 {len(days)} 天的任务')
for i in range(self.config['day_to_start_on'] - 1, len(days)):
Expand Down
18 changes: 9 additions & 9 deletions src/auto_paper/auto_paper.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
class AutoPaper(AutoBase):
def finish_a_day(self, day: WebElement) -> None:
self.click(day)
time.sleep(2)
time.sleep(2 * self.config.get('delay_multiplier'))
btns = self.driver.find_elements(
By.XPATH,
"//div[contains(@class, 'btn-AoqsA')][contains(., '测一测') or contains(., '继续答')]")
Expand Down Expand Up @@ -53,7 +53,7 @@ def finish_a_test(self, btn: WebElement):
for q in questions:
q_id = q.get_attribute('id')[13:] # 截断前面的 ewt-question-
answers |= get_answer(biz_code, paper_id, str(self.config['report_id']), q_id, self.token)
time.sleep(0.2)
time.sleep(0.2 * self.config.get('delay_multiplier'))

# 完成选择题
options_uls = self.driver.find_elements(By.CLASS_NAME, 'pm-question-options')
Expand All @@ -69,25 +69,25 @@ def finish_a_test(self, btn: WebElement):
self.click(ul.find_element(
By.XPATH, f".//span[contains(@class, 'pm-tag-letter') and text()='{letter}']"
))
time.sleep(0.2)
time.sleep(0.2 * self.config.get('delay_multiplier'))

time.sleep(1)
time.sleep(1 * self.config.get('delay_multiplier'))

# 提交
self.click(self.driver.find_element(By.CLASS_NAME, 'ant-btn-primary'))
time.sleep(1)
time.sleep(1 * self.config.get('delay_multiplier'))
self.click(self.driver.find_element(By.CLASS_NAME, 'confirm-right'))
time.sleep(5)
time.sleep(5 * self.config.get('delay_multiplier'))

# 自批满分(不一定有此环节)
n = len(self.driver.find_elements(By.CSS_SELECTOR, '.content-left-scroll > ul > li'))
if n != 0:
for i in range(n):
self.click(self.driver.find_element(By.CSS_SELECTOR, '.content-right-scroll > ul > li:last-child'))
time.sleep(2)
time.sleep(2 * self.config.get('delay_multiplier'))
self.click(self.driver.find_element(By.CLASS_NAME, 'content-main-footer_submit_btn_full'))
time.sleep(1)
time.sleep(1 * self.config.get('delay_multiplier'))
self.click(self.driver.find_element(By.CLASS_NAME, 'confirm-right'))
time.sleep(3)
time.sleep(3 * self.config.get('delay_multiplier'))

self.close_and_switch()
2 changes: 1 addition & 1 deletion src/auto_paper/get_corret_answer_v2.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ def get_answer(bizCode: str, paperId: str, reportId: str, questionId: str, token

通过调用EWT360 API获取指定用户的作业报告,解析并返回题目ID与正确答案的映射

很多地方写的很不规范,一部分是不得不和 ewt 统一,还其它的看到就改一下吧qwq
很多地方写得很不规范,一部分是不得不和 ewt 统一,还其它的看到就改一下吧qwq

:param bizCode: 业务ID
:param paperId: 试卷ID
Expand Down
7 changes: 4 additions & 3 deletions src/auto_video/auto_video.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ def finish_a_day(self, day: WebElement) -> None:
:return: None
"""
self.click(day)
time.sleep(2)
time.sleep(2 * self.config.get('delay_multiplier'))
btns = self.driver.find_elements(
By.XPATH,
"//div[contains(@class, 'btn-AoqsA') "
Expand Down Expand Up @@ -56,7 +56,7 @@ def finish_a_lesson(self, btn: WebElement) -> None:

# 有时需要手动点播放
try:
time.sleep(3)
time.sleep(3 * self.config.get('delay_multiplier'))
self.driver.find_element(By.CLASS_NAME, 'vjs-big-play-button').click()
logging.info('手动开始播放视频')
except:
Expand All @@ -71,8 +71,9 @@ def finish_a_lesson(self, btn: WebElement) -> None:
els = [e for e in els if e.is_displayed()]
for e in els:
self.click(e)
logging.info('点击了检查点')

time.sleep(1)
time.sleep(1 * self.config.get('delay_multiplier'))

logging.info('好诶~完成啦~')

Expand Down
5 changes: 4 additions & 1 deletion src/config.yml.default
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,7 @@
# 修改时不要删掉冒号后的空格 (任何标点符号用英文输入法输入)
username: 用户名
password: 密码
list_url: 课程列表页面的链接
list_url: 课程列表页面的链接

# 延迟倍率(默认1.0,如需修改请输入浮点数)
delay_multiplier: 1.0
2 changes: 1 addition & 1 deletion src/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,4 @@
retry_count += 1
logging.info(f'第 {retry_count} 次重试,将在 {retry_interval} 秒后进行')
time.sleep(retry_interval)
retry_interval *= 2 # 每次重试间隔时间翻倍
retry_interval = min(retry_interval * 2, 300) # 300s 熔断
Loading