Cqupt党旗飘飘积极分子自动学习脚本

背景

最近遇到积极分子网课学习,按照惯例来说上油猴发现根本没有可以用的脚本,于是打算自己写一个脚本来进行自动学习。

思路

  1. 在课程中心, 获取当前所有课程链接,

  2. 通过课程链接进行拼接到课程必修界面,在课程必修界面获取所有的播放链接。

  3. 获取到播放链接之后,选取第一个进行播放,播放结束即调回课程中心。

  4. 重复1-3,直到获取不到可播放链接

    image-20240621175802393

遇到的问题及其解决

  1. 脚本整体运行思路,脚本会在每个页面来执行,如何保证跳转到课程介绍页面后,又跳转到播放页面?

完整代码

// ==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");
            }
}