您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
2023/4/23 10:57:33
// ==UserScript== // @name 象课堂视频学习 // @namespace wwj // @match http://xxt-gupt.coolcollege.cn/ // @grant none // @version 1.0 // @author wwj // @description 2023/4/23 10:57:33 // @license MIT // ==/UserScript== const waitSecond = 2000; const tipSecond = 2000; // 等待几秒后执行匹配并点击的操作 // 第一次进入的时间需要设置的长一些 setTimeout(matchAndClick, 5000); (function() { // 保存原始的 open 和 send 方法 var originalOpen = XMLHttpRequest.prototype.open; var originalSend = XMLHttpRequest.prototype.send; var originalSetRequestHeader = XMLHttpRequest.prototype.setRequestHeader; // 定义变量保存请求的 method 和 url var requestMethod; var requestUrl; // 拦截 open 方法,保存请求的 method 和 url XMLHttpRequest.prototype.open = function(method, url) { requestMethod = method; requestUrl = url; originalOpen.call(this, method, url, true); }; XMLHttpRequest.prototype.setRequestHeader = function(header, value) { if (requestMethod === 'POST' && requestUrl.indexOf('save_progress') !== -1) { if (header.toLowerCase() === 'x-data-sign') { // 删除请求头中的x-data-sign参数 console.log("删除请求头") return; } } // 调用原始的setRequestHeader方法 originalSetRequestHeader.call(this, header, value); }; // 拦截 send 方法,修改请求数据和请求头 XMLHttpRequest.prototype.send = function(data) { // 如果是 POST 请求并且路径包含 "save_progress" if (requestMethod === 'POST' && requestUrl.indexOf('save_progress') !== -1) { // 修改请求数据中的 progress 字段为 100 console.log("修改请求数据") var requestData = JSON.parse(data); requestData.progress = 100; data = JSON.stringify(requestData); // 添加请求成功后的提示框 var originalOnReadyStateChange = this.onreadystatechange; this.onreadystatechange = function() { if (this.readyState === 4 && this.status === 200) { showNotification("视频完成学习") setTimeout(matchReturnAndClick, waitSecond); } if (originalOnReadyStateChange) { originalOnReadyStateChange.apply(this, arguments); } }; } // 调用原始的 send 方法 originalSend.call(this, data); }; })(); // 弹窗提示 function showNotification(message, timeout = tipSecond) { const notification = document.createElement('div'); notification.innerHTML = message; notification.style.cssText = ` position: fixed; top: 10px; right: 10px; padding: 10px; border-radius: 5px; background-color: rgba(0, 128, 0, 0.8); color: #fff; z-index: 99999; transition: opacity 0.5s; opacity: 0; `; document.body.appendChild(notification); setTimeout(() => { notification.style.opacity = 1; }, 100); setTimeout(() => { notification.style.opacity = 0; setTimeout(() => { document.body.removeChild(notification); }, 500); }, timeout); } // 定义一个函数,用于匹配元素并点击 function matchAndClick() { // 通过querySelectorAll方法获取所有匹配的元素 var elements = document.querySelectorAll('.cl-primary'); console.log("设置一个定时器") var timer = setInterval(function() { // 遍历所有匹配的元素 let i = 0; for (; i < elements.length; i++) { var element = elements[i]; // 判断元素内容是否为“开始学习” if (element.textContent === '开始学习') { // 触发元素的点击事件 console.log("点击进入视频页面 i:"+i) element.click(); clearInterval(timer); break; } } if(i == elements.length){ showNotification("所有视频已完成学习") clearInterval(timer); } }, 5000); } function matchReturnAndClick() { // 通过querySelectorAll方法获取所有匹配的元素 const element = document.querySelector('.anticon.anticon-left'); if(element){ element.click() console.log("点击退出视频页面") // 等待几秒后执行匹配并点击的操作 setTimeout(matchAndClick, waitSecond); } } // 以上代码均由ChatGPT提供,本人仅作调整