-
Notifications
You must be signed in to change notification settings - Fork 0
/
zhihuishu.js
executable file
·201 lines (191 loc) · 5.55 KB
/
zhihuishu.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/**
* @file zhihuishu.js
* @author perhaps(perhapszql@gmail.com)
* @date 2017-11-17
* @description 智慧树视频自动播放下一集,并以1.5倍速度,无声播放
*/
/**
* dom 加载完毕的5s后才开始执行脚本
*/
window.onload = function () {
setTimeout(() => begin(), 5000)
}
/**
* 主程序
*/
async function begin() {
let list = null // 整个视频播放列表
let video = null // video播放器
let count = 0
// 60s内获取播放列表,若失败,则插件不能使用
//list = getElement('list')
list = document.getElementsByClassName('file-item')
while (1) {
if (list !== null || count >= 12) break
count++
await wait1s(5)
list = document.getElementsByClassName('file-item')
}
if (list !== null) { // 播放下一集
playVideo(list)
}
// 60s内获取video元素,若失败,则插件不能使用
await wait1s(5)
video = getElement('video')
count = 0
while (1) {
if (video !== null || count >= 12) break
count++
await wait1s(5)
video = getElement('video')
}
if (video !== null) { // 特殊效果重新播放视频
await specialEffect(video)
}
// 隔10s就检查视频是否播放完毕,是否弹出'测试'对话框
background()
console.log('脚本成功运行中...')
}
/**
* 自动播放下一集
* @param {Array} list 视频播放列表
* @returns void
*/
function playVideo(list) {
list = document.getElementsByClassName('file-item')
title = document.getElementById('sourceTit')
console.log(title.innerText)
for (let i = 0; i < list.length; ++ i) {
try {
if (list[i].children[2].children[0].className != 'icon-finish')
throw("NO")
} catch {
console.log(list[i].innerText)
if (!list[i].innerText.includes(title.innerText.substring(0, title.innerText.lastIndexOf('.')))) {
console.log("开始播放:", list[i].innerText)
list[i].click()
}
return true
}
}
}
/**
* 按要求播放视频: 1.5倍速度,无声播放
* @param {Element} video 视频元素
* @returns void
*/
async function specialEffect(video) {
try {
return new Promise((resolve) => { // 3s后按要求播放视频
setTimeout(() => {
video.currentTime = 2 // 视频重新播放
if (video.paused && typeof video.play === 'function') video.play() // 视频停止的话,继续播放
let volumn = getElement('volumn')
let speedTab = getElement('speedTab')
// let sharpness = getElement('sharpness')
if (volumn !== null) volumn.click() // 关闭声音
if (speedTab !== null) speedTab.click() // 1.5倍加速
// if (sharpness !== null) sharpness.click() // 标清
resolve()
}, 3000)
})
} catch (error) {
console.log(error)
}
}
/**
* 隔10s就检查视频是否播放完毕,是否弹出'测试'对话框
* @returns void
*/
function background() {
// 每10s检查视频是否播放完毕,是的话,刷新页面
setInterval(() => {
let video = getElement('video') // 需要不断的获取video元素
if (video.ended) {
console.log('正在刷新页面...')
wait1s(1)
window.location.reload()
}
}, 10000)
// 每10s检查是否弹出'测试'对话框,并关闭
setInterval(() => {
let close = getElement('close') // 对话框的关闭按钮
let choose = getElement('choose')
if (choose && close) {
choose.click()
close.click()
console.log('已关闭了测试弹窗')
}
if (close && !choose) {
console.log('答题失败')
}
}, 10000)
}
/**
* 获取指定元素
* @param {string} ele 指定的元素名称
* @returns {Element} 返回指定元素
*/
function getElement(ele) {
switch (ele) {
case 'list':
{ // 视频列表
let list = document.getElementById('chapterList').getElementsByTagName('li')
if (list === null) console.log('网速太慢啦,无法获取视频播放列表,请刷新页面')
return list
}
case 'video':
{ // 播放器
let video = document.querySelector('.vjs-tech')
if (video === null) console.log('网速太慢啦,无法获取video元素,请刷新页面')
return video
}
case 'volumn':
{ // 播放器的声音控件
let volumn = document.querySelector('.volumeIcon')
if (volumn === null) console.log('网速太慢啦,无法获取功能控件,请刷新页面')
return volumn
}
case 'speedTab':
{ // 播放器的速度控件
let speedTab = document.querySelector('.speedTab15')
return speedTab
}
case 'sharpness':
{ // 播放器的清晰度控件
let sharpness = document.querySelector('.line1bq')
return sharpness
}
case 'close':
{ // '测试'对话框的关闭按钮
let close = document.querySelector('.popboxes_close')
// let close = document.querySelector('.popbtn_cancel')
return close
}
case 'choose':
{
let chooseInput
let chooseDiv
let iframeContent = document.querySelector('#tmDialog_iframe')
if (iframeContent) {
chooseDiv = iframeContent.contentWindow.document.querySelector('.answerOption')
if(chooseDiv) {
chooseInput = chooseDiv.getElementsByTagName('input')[0]
}
}
return chooseInput
}
}
}
/**
* 延时函数
* @param {number} sec 延时多少秒
* @returns {Promise} 异步执行
*/
async function wait1s(sec) {
return new Promise(resolve => {
setTimeout(() => {
resolve()
}, sec * 1000)
})
}