tampermonkey_script/qingshuxuetang_auto_play.us...

168 lines
4.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// ==UserScript==
// @name 平顶山学院(青书学堂)自动学习脚本
// @namespace http://tampermonkey.net/
// @version 2026-06-03
// @description try to take over the world!
// @author You
// @match https://degree.qingshuxuetang.com/pdsu/Student/Course/CourseStudy*
// @match https://degree.qingshuxuetang.com/pdsu/Student/Course/CourseShow*
// @icon https://www.google.com/s2/favicons?sz=64&domain=qingshuxuetang.com
// @grant none
// ==/UserScript==
(function () {
"use strict";
const url = window.location.href;
const MIN_STUDY_SECONDS = 5 * 60;
const VIDEO_SELECTOR = "#vjs_video_3_html5_api";
const TEXT_SELECTOR = "#easyXDM_default2872_provider";
console.log("插件加载完成,等待界面渲染");
const waitForCondition = (getResult) => {
const result = getResult();
if (result) {
return Promise.resolve(result);
}
return new Promise((resolve) => {
const observer = new MutationObserver(() => {
const result = getResult();
if (result) {
observer.disconnect();
resolve(result);
}
});
observer.observe(document.documentElement, {
childList: true,
subtree: true,
});
});
};
const parseStudySeconds = (text) => {
const hourMatch = text.match(/(\d+)\s*小时/);
const minuteMatch = text.match(/(\d+)\s*分钟/);
const secondMatch = text.match(/(\d+)\s*秒/);
return (
(hourMatch ? Number(hourMatch[1]) * 3600 : 0) +
(minuteMatch ? Number(minuteMatch[1]) * 60 : 0) +
(secondMatch ? Number(secondMatch[1]) : 0)
);
};
const shouldEnterCourseware = (item) => {
const mark = item.querySelector(".study_being");
if (!mark) {
return true;
}
const studiedSeconds = parseStudySeconds(mark.innerText);
return studiedSeconds < MIN_STUDY_SECONDS;
};
const returnToStudyPage = () => {
const backLink = document.querySelector(".back-link");
if (backLink) {
backLink.click();
return;
}
history.back();
};
const waitForCoursewareElement = () =>
waitForCondition(
() =>
document.querySelector(VIDEO_SELECTOR) ||
document.querySelector(TEXT_SELECTOR)
);
const onPageLoad = async () => {
console.log("页面加载完成,开始执行脚本");
if (url.includes("CourseStudy")) {
console.log("进入准备阶段");
const items = await waitForCondition(() => {
const list = document.querySelector("#list");
const items = list ? list.querySelectorAll("li > a.node") : [];
return items.length > 0 ? items : null;
});
console.log("获取到课程数量:", items.length);
for (const item of items) {
if (shouldEnterCourseware(item)) {
const mark = item.querySelector(".study_being");
const studiedSeconds = mark ? parseStudySeconds(mark.innerText) : 0;
console.log(
"点击未完成学习时长的视频:" +
item.querySelector(".title").innerText +
",已学习:" +
studiedSeconds +
"秒"
);
item.click();
return;
}
}
console.log("所有视频均已播放完毕,结束脚本");
} else if (url.includes("CourseShow")) {
console.log("进入学习阶段");
// 学习阶段
const coursewareElement = await waitForCoursewareElement();
if (coursewareElement.matches(TEXT_SELECTOR)) {
console.log("检测到文本课件等待5分钟后返回准备页面");
setTimeout(() => {
console.log("文本课件等待完成,返回准备页面");
returnToStudyPage();
}, MIN_STUDY_SECONDS * 1000);
return;
}
const videoInterval = setInterval(() => {
const video = document.querySelector(VIDEO_SELECTOR);
if (!video) {
console.log("视频元素暂时不可用,继续等待");
return;
}
if (video.paused && video.currentTime === 0) {
video.play();
console.log("视频未播放,开始播放视频");
return;
}
if (video.currentTime >= video.duration - 1) {
console.log("视频播放结束,返回准备页面");
clearInterval(videoInterval);
returnToStudyPage();
}
if (video.playbackRate === 1) {
console.log("将视频倍速设置为2倍速");
video.playbackRate = 2;
}
console.log("视频正在播放,当前时间:" + video.currentTime);
}, 3000);
}
};
// 等待页面加载完成后执行
if (document.readyState === "complete") {
onPageLoad();
} else {
window.addEventListener("load", onPageLoad);
}
})();