// ==UserScript== // @name 华中农业大学网课脚本 // @namespace http://hzau.sccchina.net/ // @version 0.1 // @description 华中农业大学网课 自动刷课软件 // @author Doom // @license MIT // @match *://*.sccchina.net/* // @match *://*.chinaedu.net/* // @run-at document-idle // @grant unsafeWindow // @require http://code.jquery.com/jquery-migrate-1.2.1.min.js /* globals jQuery, $, waitForKeyElements */ // @downloadURL https://update.greasyfork.icu/scripts/520873/%E5%8D%8E%E4%B8%AD%E5%86%9C%E4%B8%9A%E5%A4%A7%E5%AD%A6%E7%BD%91%E8%AF%BE%E8%84%9A%E6%9C%AC.user.js // @updateURL https://update.greasyfork.icu/scripts/520873/%E5%8D%8E%E4%B8%AD%E5%86%9C%E4%B8%9A%E5%A4%A7%E5%AD%A6%E7%BD%91%E8%AF%BE%E8%84%9A%E6%9C%AC.meta.js // ==/UserScript== (function() { 'use strict'; $(document).ready(function() { if(window.self == window.top){ console.log('当前不在iframe中'); return ; } console.log('当前在iframe中'); window.onload =()=>{ if(isleftIframe(window)){ console.log('预期自动刷课'); console.log('課程加载完成'); popClose(); const all_videos = videos(); if(all_videos == undefined || all_videos.length <= 0){ console.log('未加载到课程'); return; } console.log("所有课程:",all_videos); let video_index = 0; console.log("play:", video_index); play(all_videos[video_index]); window.addEventListener("message", function(event){ console.log("iframe接受到消息:", event.data); if(event.data == 'playCompleted'){ if(video_index == all_videos.length-1) { console.log("所有video已经全部播放完成"); } else { console.log("play:", ++video_index); play(all_videos[video_index]); } } }); } if(isVideoFrame(window)){ window.addEventListener("message", function(event) { console.log("videoFrame接受到消息:", event.data); if(event.data == 'playVideo'){ playVideo(); } }); } }; function isleftIframe(window){ // 判断当期是否是 'iframe': 通过判断 iframe:'frameVideo'是否存在来确认的 if(undefined != window.frames['frameVideo'] && null !=window.frames['frameVideo'] ){ return true; } return false; } function isVideoFrame(window){ // 有个一个div: 'videoFrame' const video = document.getElementById('videoFrame'); if(video && video.tagName == 'DIV'){ return true; } return false; } function popClose(){ const pop_close = document.querySelector('#pop > h2 > em'); const clickEvent = new MouseEvent('click', { bubbles: true, cancelable: true }); console.log('关闭pop遮罩'); pop_close.dispatchEvent(clickEvent); } function videos(){ // 获取所有的课件列表 let videos = []; const topLevelItems = document.querySelectorAll('li.leftOneLevel'); topLevelItems.forEach(item => { // 查找该 li 元素下的所有 a 标签 const allAnchors = item.querySelectorAll('a'); // 遍历每个 a 标签,排除含有 的标签 return Array.from(allAnchors).filter(anchor=>{ let isVideo = !anchor.querySelector('span.arrow'); if(isVideo){ console.log(anchor.title); videos.push(anchor); } }); return allAnchors; }); return videos; } function isActive(video){ const activeLi = anchor.closest('li.active.activeState'); console.log('课件:', anchor.title || anchor.href ); if(activeLi){ console.log("正在播放中"); } return activeLi; } function getFirst(videos){ // 已经在播放中,从当前播放中开始 for(let i=0;i{ if(playCompleted()){ window.parent.postMessage( 'playCompleted','*'); return ; } // 如果还没结束,则/2s定时检查一次 const intervalId = setInterval(()=>{ if(playCompleted()){ window.parent.postMessage( 'playCompleted','*'); clearInterval(intervalId); } }, 5000); }, 2000); } function play(video){ console.log('start播放课件:', video.title || video.href ); // video.click(); const clickEvent = new MouseEvent('click', { bubbles: true, // 事件是否冒泡 cancelable: true // 事件是否可取消 }); video.dispatchEvent(clickEvent); // 因为跨域了所以这里的clickEvent并不能传导到 iframe: 'frameVideo'中 // 需要用到跨iframe通讯 const videoFrame = window.frames['frameVideo'] if(undefined == videoFrame || null == videoFrame){ console.log('iframe: frameVideo找不到'); } videoFrame.onload = ()=>{ // 未加载完成的话,消息发出去也接受不到 console.log('videoFrame加载完成,then playVideo'); videoFrame.contentWindow.postMessage('playVideo', '*'); }; console.log('end播放课件:', video.title || video.href ); } function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function timeToSeconds(timeStr) { const timeParts = timeStr.split(':'); // 分割分钟和秒 const minutes = parseInt(timeParts[0], 10); // 获取分钟 const seconds = parseInt(timeParts[1], 10); // 获取秒数 return (minutes * 60) + seconds; // 转换为秒 } function playCompleted(){ const currentTimeDiv = document.querySelector('div.vjs-current-time-display'); const durationDiplay = document.querySelector('div.vjs-duration-display'); // 检查是否成功找到元素 if (currentTimeDiv) { // 获取时间值 const currentTimeValue = currentTimeDiv.textContent.trim().replace('当前时间', '').trim(); // 包含 "当前时间 3:21" const durationValue = durationDiplay.textContent.trim().replace('时长', '').trim();; // 包含 "时长 3:21" console.log('当前时间的值:', currentTimeValue); // 输出 "3:21" console.log('时长:', durationValue); // 输出 "3:21" if(currentTimeValue == durationValue){ console.log("播放完成"); return true; } if(currentTimeValue =='0:00'){ console.log("未播放"); } if(timeToSeconds(currentTimeValue) > 0 && timeToSeconds(currentTimeValue) < timeToSeconds(durationValue) ){ console.log("已播放部分"); } } else { console.log('未找到目标 div'); } return false; } }); })();