• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

使用python Selenium实现智慧树界面化自动刷网课 chromehandless实现智慧树无界面化自动刷网课

武飞扬头像
我所向往的美好
帮助1

      最近看到隔壁室友在学习python,再加上那句“爬虫学得好,监狱进的早”,于是有了一个大胆的想法,刷网课。我是通过使用selenium驱动真实的浏览器来实现

        1.自动点击播放

        2.自动切换到流畅画质(省流量)

        3.自动1.5倍速

        4.自动静音

        4.自动检查当前播放时间,结束后调到下一集

由于是驱动真实的浏览器来实现一系列操作,所以理论上不会有封号危险 (祝你好运)

  1.  
    # _*_ codeing utf-8 _*_
  2.  
    # @TIME : 2021/11/6 22:30
  3.  
    # @Author : wust Qiuyu
  4.  
    # @File : test_selenium
  5.  
    # @Project : 代码
  6.  
     
  7.  
     
  8.  
    from selenium import webdriver
  9.  
    from selenium.webdriver.common.by import By
  10.  
    import time
  11.  
    from selenium.webdriver import ActionChains
  12.  
    from selenium.webdriver.chrome.options import Options
  13.  
     
  14.  
     
  15.  
    # 无界面
  16.  
    def share_browser(): # 初始化
  17.  
    chrome_options = Options()
  18.  
    chrome_options.add_argument('--headless')
  19.  
    chrome_options.add_argument('--disable-gpu')
  20.  
     
  21.  
    # 浏览器的安装路径 打开文件位置 #这个路径是你谷歌浏览器的路径
  22.  
    # chrome浏览器的安装位置 Chromedriver需在当前py文件的相同路径下
  23.  
    path = r'C:\Users\19436\AppData\Local\Google\Chrome\Application\chrome.exe'
  24.  
    chrome_options.binary_location = path
  25.  
    browser = webdriver.Chrome(chrome_options=chrome_options)
  26.  
    return browser
  27.  
     
  28.  
    # 取消下方注释即可使用有界面
  29.  
    # # # # # # # # # # # # # # # # # # # # # #
  30.  
    # 加载驱动 有界面 #
  31.  
    path = './chromedriver.exe' #
  32.  
    browser = webdriver.Chrome(path) #
  33.  
    # # # # # # # # # # # # # # # # # # # # # #
  34.  
     
  35.  
     
  36.  
    # # # # # # # # # # # # # # # # # # # # # #
  37.  
    # # 加载驱动 无界面 #
  38.  
    # browser = share_browser() #
  39.  
    # # # # # # # # # # # # # # # # # # # # # #
  40.  
     
  41.  
     
  42.  
     
  43.  
    # 答题
  44.  
    def response():
  45.  
    try:
  46.  
    #检查是否有弹窗检验
  47.  
    browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[7]/div[@class="el-dialog"]')
  48.  
    option = browser.find_elements(By.XPATH, '//ul[@class="topic-list"]/li')
  49.  
    for i in range(len(option)):
  50.  
    option[i].click()
  51.  
     
  52.  
    # 获取正确答案
  53.  
    answer = browser.find_element(By.XPATH,"//p[@class='answer']/span").text.split(',')
  54.  
    print('正确答案是:' str(answer))
  55.  
     
  56.  
    # 点击正确答案
  57.  
     
  58.  
    for i in range(len(option)):
  59.  
    print('选项' str(i) ':' option[i].text)
  60.  
    flag=False
  61.  
    for j in range(len(answer)):
  62.  
    if option[i].text.find(answer[j])!=-1:
  63.  
    flag=True
  64.  
    break
  65.  
    if(flag==False):
  66.  
    option[i].click()
  67.  
    # 点击关闭
  68.  
    close = browser.find_element(By.XPATH,'//div[@class="btn"]')
  69.  
    close.click()
  70.  
    print("答题成功!\t\t\t√")
  71.  
    play()
  72.  
    return True
  73.  
    except:
  74.  
    print("未找到弹窗测验\t\t✘")
  75.  
    return False
  76.  
     
  77.  
     
  78.  
    # 点击我知道了
  79.  
    def clickIknow():
  80.  
    try:
  81.  
    # 检测是否有我知道了
  82.  
    browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[6]')
  83.  
    # 点击我知道了
  84.  
    iKnow = browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[6]/div[1]/div[3]/span/button')
  85.  
    iKnow.click()
  86.  
    print("关闭我知道成功!\t√")
  87.  
    return True
  88.  
    except:
  89.  
    print("未发现我知道了\t\t✘")
  90.  
    return False
  91.  
     
  92.  
     
  93.  
    # 点击学前必读
  94.  
    def clickBeforeRead():
  95.  
    try:
  96.  
    # 检测是否有学前必读
  97.  
    browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[7]')
  98.  
    # 点击×
  99.  
    close = browser.find_element(By.XPATH,'//div[@id="app"]/div[1]/div[7]/div[2]/div[1]/i')
  100.  
    close.click()
  101.  
    print("关闭学前必读成功!\t√")
  102.  
    return True
  103.  
    except:
  104.  
    print("未发现学前必读\t\t✘")
  105.  
    return False
  106.  
     
  107.  
     
  108.  
    # 获取当前播放时间
  109.  
    def getCurrentTime():
  110.  
    openControlsBar()
  111.  
    time = browser.find_element(By.XPATH,'//div[@class="nPlayTime"]/span[1]').text
  112.  
    print('当前播放时间为:' time)
  113.  
    return time
  114.  
     
  115.  
    # 获取当前视频总时间
  116.  
    def getTotalTime():
  117.  
    openControlsBar()
  118.  
    time = browser.find_element(By.XPATH,'//div[@class="nPlayTime"]/span[2]').text
  119.  
    print('本集视频时间为:' time)
  120.  
    return time
  121.  
     
  122.  
    # 播放下一个视频
  123.  
    def nextVideo():
  124.  
    openControlsBar()
  125.  
    nextBtn = browser.find_element(By.XPATH,'//div[@id="nextBtn"]')
  126.  
    nextBtn.click()
  127.  
    print('\n切换下一个视频\n')
  128.  
     
  129.  
    # 1.5速度
  130.  
    def fasterPlay():
  131.  
    try:
  132.  
    openControlsBar()
  133.  
    speed = browser.find_element(By.XPATH,' //div[@class="speedBox"]/div/div[1]')
  134.  
    speedbox = browser.find_element(By.XPATH,'//div[@class="speedBox"]')
  135.  
    time.sleep(5)
  136.  
    openControlsBar()
  137.  
    ActionChains(browser).move_to_element(speedbox).perform()
  138.  
    speed.click()
  139.  
    print('成功切换成' speed.text '倍速\t√')
  140.  
    except:
  141.  
    print('切换成' speed.text '倍速失败,稍后将重试\t✘')
  142.  
     
  143.  
    # 点击开始播放
  144.  
    def play():
  145.  
    start_status = browser.find_element(By.XPATH,'//div[@id="playButton"]').get_attribute('class')
  146.  
    start_button = browser.find_element(By.XPATH,'//div[@id="playButton"]')
  147.  
    time.sleep(10)
  148.  
    if start_status.find('playButton')!=-1:
  149.  
    print('当前静止')
  150.  
    openControlsBar()
  151.  
    time.sleep(1)
  152.  
    start_button.click()
  153.  
    print('点击播放成功\t\t√')
  154.  
     
  155.  
    # 点击静音
  156.  
    def noVoice():
  157.  
    try:
  158.  
    voice_status = browser.find_element(By.XPATH,'//div[@id="vjs_container"]/div[10]/div[6]').get_attribute('class')
  159.  
    voice_buttton= browser.find_element(By.XPATH,'//div[@id="vjs_container"]/div[10]/div[6]/div[1]')
  160.  
    print(voice_status)
  161.  
    if voice_status.find('volumeNone')==-1:
  162.  
    print('此时非静音')
  163.  
    time.sleep(5)
  164.  
    openControlsBar()
  165.  
    voice_buttton.click()
  166.  
    print('静音成功\t\t\t√')
  167.  
    except:
  168.  
    print('静音失败,稍后将重试\t\t✘')
  169.  
     
  170.  
     
  171.  
    # 切换流畅画质
  172.  
    def changeVideoQuality():
  173.  
    try:
  174.  
    openControlsBar()
  175.  
    videoQuality = browser.find_element(By.XPATH,' //div[@class="definiBox"]/div/b[1]')
  176.  
    definiBox = browser.find_element(By.XPATH,' //div[@class="definiBox"]')
  177.  
    time.sleep(5)
  178.  
    openControlsBar()
  179.  
    ActionChains(browser).move_to_element(definiBox).perform()
  180.  
    videoQuality.click()
  181.  
    print('成功切换到流畅画质\t√')
  182.  
    checkWindow()
  183.  
    except:
  184.  
    print('切换到流畅画质失败,稍后将重试\t\t✘')
  185.  
     
  186.  
    # 打开ControlsBar
  187.  
    def openControlsBar():
  188.  
    checkWindow()
  189.  
    controlsBar = browser.find_element(By.XPATH,' //div[@id="container"]')
  190.  
    ActionChains(browser).move_to_element(controlsBar).perform()
  191.  
     
  192.  
    # 检测弹窗
  193.  
    def checkWindow():
  194.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '正在播放:' getUnitName())
  195.  
    clickIknow()
  196.  
    clickBeforeRead()
  197.  
    response()
  198.  
    print('\n\n')
  199.  
     
  200.  
    # 获取当前章节
  201.  
    def getUnitName():
  202.  
    try:
  203.  
    name = browser.find_element(By.XPATH,'//*[@id="app"]/div/div[2]/div[1]/div[1]/div[1]')
  204.  
    return name.text
  205.  
    except:
  206.  
    return '暂未加载'
  207.  
    if __name__ == '__main__':
  208.  
    # 访问网站 课程的地址
  209.  
    url = 'https://studyh5.zhihuishu.com/videoStudy.html#/studyVideo?recruitAndCourseId=4b595c5c435d4859454a5859584259455f'
  210.  
    # 账号密码
  211.  
    userName = "**************"
  212.  
    passWord = "**************"
  213.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '开始学习\n')
  214.  
    browser.get(url)
  215.  
    # 元素定位 输入用户名密码
  216.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '正在输入账号\n')
  217.  
    inputUsername = browser.find_element(By.XPATH,'//input[@id="lUsername"]')
  218.  
    inputUsername.send_keys(userName)
  219.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '账号输入成功\n')
  220.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '正在输入密码\n')
  221.  
    inputPassword = browser.find_element(By.XPATH,'//input[@id="lPassword"]')
  222.  
    inputPassword.send_keys(passWord)
  223.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '密码输入成功\n')
  224.  
     
  225.  
    # 点击登录
  226.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '正在登陆\n')
  227.  
    login = browser.find_element(By.XPATH,"//span[@class='wall-sub-btn']")
  228.  
    login.click()
  229.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '登陆成功\n')
  230.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '正在进入课程\n\n')
  231.  
     
  232.  
    print('----------------------------------')
  233.  
     
  234.  
    import threading
  235.  
    from threading import Lock,Thread
  236.  
    import time,os
  237.  
    while(True):
  238.  
     
  239.  
    # 有时进入视频会直接弹出窗口,且窗口显示顺序不定,故检测三次,保证再开始播放之前关闭
  240.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n' '正在在执行视频播放前检查')
  241.  
    for i in range(3):
  242.  
    print('\n第' str(i) '检测')
  243.  
    checkWindow()
  244.  
    time.sleep(2)
  245.  
     
  246.  
     
  247.  
    print(time.strftime('%Y-%m-%d %H:%M:%S') '\n检查完毕\n\n\n开始优化播放\n')
  248.  
    # 避免在前三次中未检测出窗口,开始操作前全部检查一次
  249.  
    checkWindow()
  250.  
    play()
  251.  
    print('正在修改画质')
  252.  
    time.sleep(2)
  253.  
    checkWindow()
  254.  
    changeVideoQuality()
  255.  
    print('画质修改成功\t\t\t√')
  256.  
    print('正在修该播放速度')
  257.  
    checkWindow()
  258.  
    fasterPlay()
  259.  
    print('播放速度修改成功\t\t\t√')
  260.  
    print('正在修改静音')
  261.  
    checkWindow()
  262.  
    noVoice()
  263.  
    print('静音修改成功\t\t√\n\n')
  264.  
     
  265.  
    # 每隔5秒检测是否有我知道了,学前必读,是否播放完
  266.  
    while(True):
  267.  
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
  268.  
    # 播放完毕,下一集
  269.  
    if getCurrentTime() == getTotalTime():
  270.  
    print('\n\n')
  271.  
    checkWindow()
  272.  
    nextVideo()
  273.  
    break
  274.  
     
  275.  
    print('\n\n')
  276.  
    checkWindow()
  277.  
    print('\n\n')
  278.  
    time.sleep(5)
  279.  
     
  280.  
     
  281.  
     
  282.  
     
  283.  
     
  284.  
     
  285.  
     
  286.  
     
  287.  
     
  288.  
     
  289.  
     
  290.  
     
  291.  
     
学新通

需要更换的是账号密码以及url路径,url路径是你先在浏览器中登录进智慧树,点击课程,在播放界面复制地址栏中的URL即可,具体看注释即可

需要安装selenium包 和chrome浏览器驱动下载地址chrome.exe,注意版本相匹配,该驱动器的路径与py文件在同一目录即可

运行结果

C:\Users\19436\Desktop\邱哥\学习资料\Python\代码\venv\Scripts\python.exe C:/Users/19436/Desktop/邱哥/学习资料/Python/代码/test/selenium_ZhiHuiShu.py
C:\Users\19436\Desktop\邱哥\学习资料\Python\代码\test\selenium_ZhiHuiShu.py:25: DeprecationWarning: use options instead of chrome_options
  browser = webdriver.Chrome(chrome_options=chrome_options)
2021-11-15  12:56:45
开始学习

2021-11-15  12:56:48
正在输入账号

2021-11-15  12:56:48
账号输入成功

2021-11-15  12:56:48
正在输入密码

2021-11-15  12:56:49
密码输入成功

2021-11-15  12:56:49
正在登陆

2021-11-15  12:56:49
登陆成功

2021-11-15  12:56:49
正在进入课程


----------------------------------
2021-11-15  12:56:49
正在在执行视频播放前检查

第0检测
2021-11-15  12:56:49
正在播放:暂未加载
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘


第1检测
2021-11-15  12:56:53
正在播放:第三章
3.1、辅音(下)
关闭我知道成功!    √
关闭学前必读成功!    √
未找到弹窗测验        ✘


第2检测
2021-11-15  12:56:56
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

2021-11-15  12:56:58
检查完毕


开始优化播放

2021-11-15  12:56:58
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

正在修改画质
2021-11-15  12:57:10
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

切换到流畅画质失败,稍后将重试        ✘
画质修改成功            √
正在修该播放速度
2021-11-15  12:57:16
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

切换成倍速失败,稍后将重试    ✘
播放速度修改成功            √
正在修改静音
2021-11-15  12:57:22
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

volumeBox
此时非静音
静音成功            √
静音修改成功        √


2021-11-15  12:57:28
当前播放时间为:00:03:56
本集视频时间为:00:25:56

2021-11-15  12:57:28
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘


2021-11-15  12:57:34
当前播放时间为:00:04:01
本集视频时间为:00:25:56

2021-11-15  12:57:34
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘


2021-11-15  12:57:39
当前播放时间为:00:04:07
本集视频时间为:00:25:56

2021-11-15  12:57:40
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘


2021-11-15  12:57:45
当前播放时间为:00:04:13
本集视频时间为:00:25:56

2021-11-15  12:57:46
正在播放:第三章
3.1、辅音(下)
未发现我知道了        ✘
未发现学前必读        ✘
未找到弹窗测验        ✘

进程已结束,退出代码为 -1
 

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfkaak
系列文章
更多 icon
同类精品
更多 icon
继续加载