前言
任选课居然还有平时分要求,真的难蚌
不会真有啥b期末考试满分结果平时分就一分然后挂科吧😎👌😭
学校你没有心😡
于是这个程序应运而生
查看更新请前往
https://github.com/AnyMoonS/AutoFinishLessons
正文
众所周知,智慧树是有脚本检测的,所以采取selenium这种模拟用户点击的方式相对来说要安全许多
导入所需包
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains import time import threading # 开辟多线程用
打开智慧树的登录界面,进行一个自动登录(实际上这一步完全可以自动打开页面后手动登录,因为就算是自动登录你仍然要手动过滑动验证)
driver = webdriver.Firefox() actions = ActionChains(driver) driver.get("https://onlineweb.zhihuishu.com/") # 打开智慧树官网 driver.maximize_window() time.sleep(5) def login(): phonenumber = driver.find_element(By.ID, "lUsername") pw = driver.find_element(By.ID, "lPassword") loginbutton = driver.find_element(By.CLASS_NAME, "wall-sub-btn") phonenumber.send_keys(config.userid) # 账号 pw.send_keys(config.password) # 密码 loginbutton.click()
检测是否打开课程,并且设置1.5倍速(直接调网页可以达到很高的倍数播放,不过因为怕被检测,我也没试过😰)
def lesson(): while 1: if driver.current_url.__contains__("studyvideoh5"): # 检测打开视频播放页 time.sleep(10) # 等待手动关闭弹窗 video = driver.find_element(By.CLASS_NAME, "videoArea") # 定位视频窗口 video.click()#播放视频 try: ActionChains(driver).move_to_element(video).perform() speedbox = driver.find_element(By.CLASS_NAME, "speedBox") speedbox.click() time.sleep(1) speedtab15 = driver.find_element(By.CLASS_NAME, "speedTab15") # 1.5倍播放 speedtab15.click() break except: pass
在视频播放过程中,难免会有弹题验证,不过所幸智慧树比较仁慈,答题不需要正确就可以过关,所以我们直接定位A选项,不管啥题都选A就完事了
def test(): while 1: try: question = driver.find_element(By.CLASS_NAME, "topic-item") # 找到第一个选项 question.click() time.sleep(1) close = driver.find_element(By.XPATH, "/html/body/div[1]/div/div[6]/div/div[3]/span/div") # 关闭答题界面 close.click() video = driver.find_element(By.CLASS_NAME, "videoArea") # 定位窗口 video.click() except: pass time.sleep(10)
最后是一个难点,获取视频播放的进度,检测是否播放完,我选择了一种比较笨的方案,直接读取进度条的当前时间与视频时长,相等之后单击下一个视频
这里有一个坑,使用get_attribute获取元素内的文本时,网上的教程大多都是使用textcontent,但是我实测之后发现textcontent会返回None,于是我采用了innerText,成功获取文本
def videoend(): while 1: video = driver.find_element(By.CLASS_NAME, "videoArea") # 定位窗口 try: ActionChains(driver).move_to_element(video).perform() current_time = driver.find_element(By.CLASS_NAME, "currentTime") # 当前视频播放时间 total_time = driver.find_element(By.CLASS_NAME, "duration") # 总时间 time1 = current_time.get_attribute('innerText') time2 = total_time.get_attribute('innerText') if time1 == time2: video.click() nextvideo = driver.find_element(By.CLASS_NAME, "nextButton") #定位下一个视频按钮 nextvideo.click()#切换到下一个视频 lesson() except: pass time.sleep(10)
因为答题和视频播放是否结束都是要循环判定的,所以需要开设多线程
login() lesson() t1 = threading.Thread(target=test) t2 = threading.Thread(target=videoend) t2.start() t1.start()
完工😋
Comments NOTHING