Cqupt党旗飘飘积极分子自动学习脚本
背景
最近遇到积极分子网课学习,按照惯例来说上油猴发现根本没有可以用的脚本,于是打算自己写一个脚本来进行自动学习。
思路
-
在课程中心, 获取当前所有课程链接,
-
通过课程链接进行拼接到课程必修界面,在课程必修界面获取所有的播放链接。
-
获取到播放链接之后,选取第一个进行播放,播放结束即调回课程中心。
-
重复1-3,直到获取不到可播放链接
遇到的问题及其解决
- 脚本整体运行思路,脚本会在每个页面来执行,如何保证跳转到课程介绍页面后,又跳转到播放页面?
完整代码
// ==UserScript==
// @name Cqupt党旗飘飘积极分子刷课脚本
// @namespace http://tampermonkey.net/
// @version v1.0
// @description 学习新思想,争做新青年,Cqupt党旗飘飘积极分子刷课脚本。点击个人空间,到课程中心脚本将自动运行。作者保留脚本相关所有权利,代码供广大用户研究使用。
// @author MirrorML
// @match http://zhdj.cqupt.edu.cn/jjfz/lesson
// @match http://zhdj.cqupt.edu.cn/jjfz/lesson/video*
// @match http://zhdj.cqupt.edu.cn/jjfz/play*
// @icon data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @grant GM_xmlhttpRequest
// ==/UserScript==
let url_lessons = []
let videos = []
let url=window.location.href
if(url=="http://zhdj.cqupt.edu.cn/jjfz/lesson"){
document.title = "正在学习新思想";
getLessonList();
//console.log(url_lessons);
url_lessons.forEach(url_lesson => {
GM_xmlhttpRequest({
method: 'GET',
url: url_lesson,
onload: function(response) {
var parser = new DOMParser();
var doc = parser.parseFromString(response.responseText, 'text/html');
// console.log(doc)
getVideoList(doc);
}
});
});
await delay(10000);
//console.log(videos);
window.location.href = videos[0];
// window.location.href = videos[0];
}
async function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function waitForPageLoad() {
return new Promise(resolve => {
window.addEventListener('load', resolve);
});
}
if(url.startsWith("http://zhdj.cqupt.edu.cn/jjfz/play")){
console.log('播放视频链接:', url);
await waitForPageLoad();
setInterval(()=>{
if(!document.querySelector(".public_cancel")){
document.querySelector(".public_cancel").click()
}
if(document.querySelector(".public_submit")){
document.querySelector(".public_submit").click()
}
if( !(/color:red/.test(document.querySelector("li.video_red1 a").getAttribute('style'))) && document.querySelector(".plyr__control.plyr__control--overlaid") && document.querySelector(".plyr__control.plyr__control--overlaid").getAttribute('aria-label')==="Play"){
document.querySelector(".plyr__control.plyr__control--overlaid").click()
}
if(/color:red/.test(document.querySelector("li.video_red1 a").getAttribute('style'))){
window.location.href ="http://zhdj.cqupt.edu.cn/jjfz/lesson"
}
//document.querySelector("plyr__controls__item plyr__control").click()
},5000);
let x = document.querySelector("li.video_red1 span").textContent;
x = timeStringToSeconds(x);
await delay(x);
while(!(/color:red/.test(document.querySelector("li.video_red1 a").getAttribute('style')))){
await delay(10000);
}
window.location.href ="http://zhdj.cqupt.edu.cn/jjfz/lesson"
}
function timeStringToSeconds(timeString) {
// Split the time string into an array of [hours, minutes, seconds]
let timeParts = timeString.split(':');
// Parse hours, minutes, and seconds to integers
let hours = parseInt(timeParts[0], 10);
let minutes = parseInt(timeParts[1], 10);
let seconds = parseInt(timeParts[2], 10);
// Calculate the total number of seconds
let totalSeconds = (hours * 3600) + (minutes * 60) + seconds;
// 每次刷完一次视频等90s
return totalSeconds*1200+90000;
}
// 获取课程地址
async function getLessonList(){
const lessonList = document.querySelector('ul.lesson_c_ul');
// 检查是否找到了元素
if (lessonList) {
// 获取所有 <a> 元素
const links = lessonList.querySelectorAll('a');
// 遍历所有 <a> 元素并输出链接
links.forEach(link => {
let url_lesson = link.href;
// 如果链接有 http 或 https 前缀,则添加 http 前缀
if (url_lesson.startsWith('http://') || url_lesson.startsWith('https://')) {
url_lesson = url_lesson.replace(
/http:\/\/zhdj\.cqupt\.edu\.cn\/jjfz\/lesson\/lecture\?lesson_id=(\d+)/,
'http://zhdj.cqupt.edu.cn/jjfz/lesson/video?lesson_id=$1&required=1'
);
// console.log(url_lesson);
url_lessons.push(url_lesson)
}
});
} else {
console.log('未找到 <ul class="lesson_c_url"> 元素');
}
}
// 获取视频地址
function getVideoList(doc){
const VideoList = doc.querySelector('div.lesson1_lists');
if(VideoList){
// 1. 有子视频的视频
const video_links = VideoList.querySelectorAll('dd');
// 遍历所有 <a> 元素并输出链接
video_links.forEach(video_link => {
video_link = video_link.querySelector('a');
if(!video_link.classList.contains('dd_cut_on')){
const video_ = video_link.href;
videos.push(video_);
console.log(video_);
}
});
// 2. 没有子视频的视频
const video_links2 = VideoList.querySelectorAll('ul li');
video_links2.forEach(video_link => {
video_link = video_link.querySelector('a');
// 判断是否完成
if(!video_link.querySelector('div')){
const video_ = video_link.href;
videos.push(video_);
console.log(video_);
}
});
}else{
console.log("fasle");
}
}