本人声明:仅作学习交流使用
前言:雨课堂支持多开同时播放,视频一个一个播放反而效率低,因此这个视频自动播放脚本意图不在于刷课,仅仅是用雨课堂平台作为实验对象进行编程练习而已。
脚本主要功能和实现方法
功能:根据用户给定的课程,自动播放课程内的所有视频。
实现方法:使用python的selenium库在chromeDriver驱动程序下操作chrome浏览器,根据脚本逻辑实现视频播放。
代码
注意:chromedriver.exe驱动程序要放在文件目录下,下载地址根据本地chrome版本选择适合的驱动程序
from selenium import webdriver
import time
import os
import re
from configparser import ConfigParser
class AutoPlay:
def __init__(self):
self.filepath = os.getcwd()
self.driver = webdriver.Chrome(executable_path=self.filepath + r'\chromedriver.exe') # r表示后面的字符串不转义
self.id, self.pwd = "", ""
self.class_list = []
self.url = "https://www.yuketang.cn/web"
self.get_user_info()
self.driver.implicitly_wait(30) # 隐式等待30s,等待所有文件加载完成
def get_user_info(self): # 读取配置文件
cf = ConfigParser()
cf.read(self.filepath + r'\config.ini', encoding='utf-8') # 有中文的话,要加上encoding='utf-8'
self.id = cf.get('userinfo', 'uid')
self.pwd = cf.get('userinfo', 'pwd')
for i in cf.options('classinfo'):
self.class_list.append(cf.get('classinfo', i))
def rate(self, speed=2):
"""
选择播放速度
:param self:
:param speed: 默认二倍速。可选 0.5,1,1.25,1.5,2
:return:
"""
script = f"""
var mousemove = document.createEvent("MouseEvent");
mousemove.initMouseEvent("mousemove", true, true, window, 0, 10, 10, 10, 10, 0, 0, 0, 0, 0, null);
document.getElementsByClassName('xt_video_player_speed')[0].dispatchEvent(mousemove);
document.querySelector("[data-speed='{speed}']").click();
"""
self.driver.execute_script(script)
def start(self):
browser = self.driver
browser.get(self.url)
browser.find_element_by_xpath('/html/body/div[2]/div[1]/div[2]/div[1]/img').click()
browser.find_element_by_xpath(
'/html/body/div[2]/div[1]/div[2]/div[2]/div[2]/div[1]/div[1]/div[1]/div[1]/input').send_keys(self.id)
browser.find_element_by_xpath(
'/html/body/div[2]/div[1]/div[2]/div[2]/div[2]/div[1]/div[2]/div[1]/div/input').send_keys(self.pwd)
browser.find_element_by_xpath('/html/body/div[2]/div[1]/div[2]/div[2]/div[2]/div[5]').click()
browser.find_element_by_xpath('/html/body/div[4]/div[2]/div/div[1]/div[1]/div/div/div/div[3]').click()
class_list = browser.find_elements_by_class_name('el-card__body') # 目前所学的所有课程
# 存储出需要刷视频的课索引
target_class_index = [i for i in range(len(class_list)) if
class_list[i].find_element_by_tag_name('h1').text in self.class_list]
print(target_class_index)
finished_class = 0
for class_index in target_class_index:
browser.find_elements_by_class_name('el-card__body')[class_index].click()
browser.find_elements_by_css_selector('span[class="blue ml20"]')[0].click() # 展开课程
video_list = browser.find_elements_by_css_selector(
'div[class="activity-info el-tooltip"] > span[class="tag"] > svg[class="icon"]')
# 存储出课程所有的视频索引
video_list = [i for i in range(len(video_list)) if
video_list[i].find_element_by_css_selector('use').get_attribute(
'xlink:href') == '#icon-shipin']
finished_video = 0
for video_index in video_list:
browser.find_elements_by_css_selector('div[class="activity-info el-tooltip"]')[video_index].click()
# 播放视频
play_button = browser.find_elements_by_xpath(
'//*[@id="video-box"]/div/xt-wrap/xt-controls/xt-inner/xt-playbutton')[0]
while True:
# #选择二倍速
self.rate()
if play_button.find_element_by_css_selector('.play-btn-tip').get_attribute(
'innerText') == '播放': # 如果视频是暂停状态,点击播放按钮
play_button.click()
finish_monitor = browser.find_element_by_xpath(
'/html/body/div[4]/div[2]/div/div[2]/div/div/div/section[1]/div[2]/div/div/span')
comp = re.compile(r'\d+(\.\d+)?')
finish = comp.search(finish_monitor.get_attribute('innerText')).group()
if float(finish) > 99: # 视频播放完成 虽然存在播放完成但是进度条没有100%的情况,实际上已经播放完成了
finished_video = finished_video + 1
print(f'第{finished_video}个视频已看完')
browser.back() # 返回上一层,即课程列表
browser.refresh() # 刷新页面,避免假死
browser.find_elements_by_css_selector('span[class="blue ml20"]')[0].click() # 展开课程
break
time.sleep(30) # 每30s检测一次是否播放完成
finished_class = finished_class + 1
print(f'==============第{finished_class}个课程已看完==============')
browser.back()
browser.refresh()
print('=======================全部课程已看完=======================')
if __name__ == '__main__':
ap = AutoPlay()
ap.start()
配置文件config.ini格式:
[userinfo]
#填写手机号和密码
uid=
pwd=
# 填写需要看的课程名称(要准确,不然找不到)
[classinfo]
classname1=基础写作(一)
classname2=学术规范与论文写作
classname3=研究生的压力应对与心理健康