您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
支持视频自动切换、自动确认随机弹出的检测点
// ==UserScript== // @name 升学e网通刷课脚本 // @namespace http://tampermonkey.net/ // @version 1.0.2 // @description 支持视频自动切换、自动确认随机弹出的检测点 // @author yghr3a // @match https://*.ewt360.com/* // @license MIT // @icon https://th.bing.com/th?id=ODLS.8f71fab6-d8fc-43f3-a56d-53f87a14d5c8&w=32&h=32&qlt=90&pcl=fffffa&o=6&pid=1.2 // @grant none // ==/UserScript== (function() { 'use strict'; const MaxTryNum = 3; let modal = null; let titleBar = null; let messageList = null; let DraggableModalTitle = "升学e网通刷课脚本" function Wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } function GetCheckButton() { let button = document.querySelector('span[class="btn-3LStS"]'); return button; } function GetTitle() { let titleText = document.querySelector('div[class="title-1dNOi"]'); //return new String(titleDiv.textContent); let text = ''; // 遍历元素的所有子节点 Array.from(titleText.childNodes).forEach(node => { // 检查节点类型 if (node.nodeType === Node.TEXT_NODE) { text += node.textContent.trim(); } }); return text; } async function GetVideoList() { addMessage("开始获取视频列表!"); let divVideoList = document.querySelector('div[class="listCon-N9Rlm"]'); for(let cnt = 1;divVideoList == null && cnt <= MaxTryNum; cnt++) { divVideoList = document.querySelector('div[class="listCon-N9Rlm"]'); addMessage("尝试获取失败,重试中!"); await Wait(1000); } let videoList = divVideoList.children; if(videoList != null) { addMessage("获取视频列表成功!"); return videoList; } else { addMessage("获取视频列表失败!"); return null; } } async function CatchVideo() { let video = document.querySelector('video[class="vjs-tech"]'); //let video = document.querySelector('video[id="vjs_video_3_html5_api"]'); for(let cnt = 1;video == null && cnt <= MaxTryNum; cnt++) { video = document.querySelector('video[class="vjs-tech"]'); //video = document.querySelector('video[id="vjs_video_3_html5_api"]'); addMessage("尝试获取video失败,重试中!"); await Wait(1000); } addMessage("获取video成功!"); return video; } async function Next(title) { await Wait(3000); let videoList = await GetVideoList(); addMessage(title); for(let i = 0; i < videoList.length - 1; i++) { let div = videoList[i]; let divTitle = div.querySelector('div[class="lessontitle-x9B-7"]').textContent; addMessage(divTitle); if(divTitle == title) { if(i >= videoList.length - 2) { addMessage("已经到结尾!"); return; } addMessage("切换到下一个视频"); videoList[i + 1].click(); } } } async function Loading() { await Wait(2000); //let videoList = await GetVideoList(); let title = "hello_world"; // 使用函数来显示悬浮窗 createDraggableModal(); addMessage("加载中!"); while(1) { await Wait(1000); // 通过通过实时获取标题来检测视频是否切换! let newTitle = GetTitle(); if(title !== newTitle) { addMessage("检测到视频切换!"); title = newTitle; await Wait(1000); let video = await CatchVideo(); video.addEventListener('ended', async () => { addMessage(" 准备切换视频!"); await Next(title); }); } let checkButton = GetCheckButton(); if(checkButton != null) { addMessage("找到检测按钮!"); checkButton.click(); } } } // 创建一个函数来生成悬浮窗 function createDraggableModal() { // 模态框容器 modal = document.createElement('div'); modal.id = 'draggableModal'; modal.style.position = 'fixed'; modal.style.top = '50px'; // 初始位置 modal.style.left = '50px'; modal.style.width = '350px'; modal.style.height = '350px'; modal.style.backgroundColor = '#fff'; modal.style.border = '1px solid #ccc'; modal.style.boxShadow = '0 2px 10px rgba(0, 0, 0, 0.1)'; modal.style.zIndex = '1000'; modal.style.overflow = 'hidden'; // 隐藏溢出内容 modal.style.resize = 'both'; // 允许调整大小(可选,但此处为演示目的) modal.style.userSelect = 'none'; // 禁止文本选择' modal.style.resize = 'none'; // 消息列表容器 messageList = document.createElement('div'); messageList.style.height = '300px'; // 固定高度 messageList.style.overflowY = 'auto'; // 垂直滚动条 messageList.style.padding = '10px'; messageList.style.borderBottom = '1px solid #ccc'; // 底部边框分隔 // 标题栏(用于拖动) titleBar = document.createElement('div'); titleBar.style.backgroundColor = '#f0f0f0'; titleBar.style.padding = '10px'; titleBar.style.cursor = 'move'; titleBar.textContent = DraggableModalTitle; // 将元素组合起来 modal.appendChild(titleBar); modal.appendChild(messageList); // 将模态框添加到body元素的末尾 document.body.appendChild(modal); // 拖动逻辑 var isDragging = false; var offsetX, offsetY; titleBar.addEventListener('mousedown', function(e) { isDragging = true; offsetX = e.clientX - modal.offsetLeft; offsetY = e.clientY - modal.offsetTop; document.addEventListener('mousemove', onMouseMove); document.addEventListener('mouseup', onMouseUp); }); function onMouseMove(e) { if (isDragging) { modal.style.left = (e.clientX - offsetX) + 'px'; modal.style.top = (e.clientY - offsetY) + 'px'; } } function onMouseUp() { isDragging = false; document.removeEventListener('mousemove', onMouseMove); document.removeEventListener('mouseup', onMouseUp); } } function addMessage(msg) { var message = document.createElement('div'); message.textContent = msg; message.style.marginBottom = '5px'; messageList.appendChild(message); } window.onload = Loading; })();