// ==UserScript== // @name 我就是积极分子 // @namespace laoxin.top // @version 2.5.0 // @description 党旗飘飘学习平台刷课工具,支持所有网站,可自定义视频播放网站(默认已添加西南石油大学,华北理工大学) // @author 老新 // @match *://*/* // @grant unsafeWindow // @grant GM_getValue // @grant GM_setValue // @grant GM_xmlhttpRequest // @require https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js // @icon http://www.gov.cn/ztzl/17da/183d03632724084a01bb02.jpg // @downloadURL none // ==/UserScript== // let settings = { // // 1表示开启,0表示关闭 // // 视频播放相关 // video: 1, // 视频弹窗自动关闭,默认开启 // jump: 1, // 自动切换下一个视频任务点,默认开启(需要开启视频弹窗自动关闭) // back: 1, // 視頻播放完成自動回到章節列表,默认关闭(需要开启自动切换到下一个任务点) // class: 1, // 自动切换到未播放的章节,默认开启(需要开启視頻播放完成自動回到章節列表) // // 章节测试及综合测试 // copy: 1, // 允许右键复制,开启右键菜单 // answer: 1, // 显示“查答案”按钮(网络题库不保证准确性) // // 期末测试 // test: 1 // 期末测试允许复制,未验证!!! // }, // // 从存储中加载设置,如果没有则使用默认值 let defaultSettings = { // 1表示开启,0表示关闭 // 视频播放相关 video: 1, // 视频弹窗自动关闭,默认开启 jump: 1, // 自动切换下一个视频任务点,默认开启(需要开启视频弹窗自动关闭) back: 1, // 視頻播放完成自動回到章節列表,默认关闭(需要开启自动切换到下一个任务点) class: 1, // 自动切换到未播放的章节,默认开启(需要开启視頻播放完成自動回到章節列表) autoPage: 1, // 自动翻页,默认开启 autoLesson: 1, // 自动切换章节,默认开启 // 章节测试及综合测试 copy: 1, // 允许右键复制,开启右键菜单 answer: 1, // 显示"查答案"按钮(网络题库不保证准确性) // 期末测试 test: 1 // 期末测试允许复制,未验证!!! }; let settings = GM_getValue("script_settings", defaultSettings); // 默认支持的网站列表 let defaultSites = [ 'rdjy.swpu.edu.cn', 'ncst.dangqipiaopiao.com', ]; // 获取用户配置的网站列表 let enabledSites = GM_getValue("enabled_sites", defaultSites); // 检查当前网站是否在启用列表中 function isCurrentSiteEnabled() { const currentHost = window.location.hostname; return enabledSites.some(site => currentHost.includes(site)); } // 添加当前网站到启用列表 function addCurrentSite() { const currentHost = window.location.hostname; if (!enabledSites.includes(currentHost)) { enabledSites.push(currentHost); GM_setValue("enabled_sites", enabledSites); addLog(`已添加网站: ${currentHost}`, 'success'); return true; } addLog(`网站已存在: ${currentHost}`, 'info'); return false; } // 从启用列表移除网站 function removeSite(site) { const index = enabledSites.indexOf(site); if (index > -1) { enabledSites.splice(index, 1); GM_setValue("enabled_sites", enabledSites); addLog(`已移除网站: ${site}`, 'success'); return true; } return false; } let _self = unsafeWindow, url = location.pathname, classLists = [], videoLists = []; let $$ = top.jQuery; // 日志系统 let logMessages = []; const MAX_LOGS = 100; function addLog(message, type = 'info') { const timestamp = new Date().toLocaleTimeString(); const log = { time: timestamp, message, type }; logMessages.unshift(log); if (logMessages.length > MAX_LOGS) { logMessages.pop(); } updateLogDisplay(); console.log(`[${timestamp}] ${message}`); } function updateLogDisplay() { const logContainer = $$('#script-log-content'); if (logContainer.length > 0) { let html = ''; logMessages.forEach(log => { const colorClass = log.type === 'error' ? 'log-error' : log.type === 'success' ? 'log-success' : 'log-info'; html += `
[${log.time}] ${log.message}
`; }); logContainer.html(html || '
暂无日志
'); } } // 保存设置 function saveSettings() { GM_setValue("script_settings", settings); addLog('设置已保存', 'success'); } // 创建设置面板UI function createSettingsPanel() { const panelHTML = `
⚙️
`; const styleHTML = ` `; $$('body').append(styleHTML + panelHTML); // 绑定事件 bindPanelEvents(); addLog('脚本已启动,设置面板已加载', 'success'); } // 绑定面板事件 function bindPanelEvents() { // 悬浮按钮点击 $$('#script-float-btn').on('click', function() { $$('#script-settings-panel').fadeIn(200); updateLogDisplay(); updateSitesDisplay(); }); // 关闭按钮 $$('#close-btn').on('click', function() { $$('#script-settings-panel').fadeOut(200); }); // 最小化按钮 $$('#minimize-btn').on('click', function() { $$('#script-settings-panel').toggleClass('minimized'); }); // 标签页切换 $$('.tab-btn').on('click', function() { const tab = $$(this).data('tab'); $$('.tab-btn').removeClass('active'); $$(this).addClass('active'); $$('.tab-content').removeClass('active'); $$('#' + tab + '-tab').addClass('active'); // 切换到网站管理时更新显示 if (tab === 'sites') { updateSitesDisplay(); } }); // 添加当前网站 $$('#add-current-site-btn').on('click', function() { if (addCurrentSite()) { updateSitesDisplay(); alert('当前网站已添加!页面将刷新以应用新设置。'); location.reload(); } else { alert('当前网站已经在启用列表中!'); } }); // 保存设置 $$('#save-settings-btn').on('click', function() { settings.video = $$('#setting-video').is(':checked') ? 1 : 0; settings.jump = $$('#setting-jump').is(':checked') ? 1 : 0; settings.back = $$('#setting-back').is(':checked') ? 1 : 0; settings.class = $$('#setting-class').is(':checked') ? 1 : 0; settings.autoPage = $$('#setting-autoPage').is(':checked') ? 1 : 0; settings.autoLesson = $$('#setting-autoLesson').is(':checked') ? 1 : 0; settings.copy = $$('#setting-copy').is(':checked') ? 1 : 0; settings.answer = $$('#setting-answer').is(':checked') ? 1 : 0; settings.test = $$('#setting-test').is(':checked') ? 1 : 0; saveSettings(); alert('设置已保存!页面将刷新以应用新设置。'); location.reload(); }); // 恢复默认设置 $$('#reset-settings-btn').on('click', function() { if (confirm('确定要恢复默认设置吗?')) { settings = Object.assign({}, defaultSettings); saveSettings(); addLog('已恢复默认设置', 'success'); alert('已恢复默认设置!页面将刷新。'); location.reload(); } }); // 清空日志 $$('#clear-logs-btn').on('click', function() { logMessages = []; updateLogDisplay(); addLog('日志已清空', 'info'); }); // 拖动面板 makeDraggable(); } // 更新网站列表显示 function updateSitesDisplay() { // 显示当前网站 $$('#current-site-display').text(window.location.hostname); const sitesListContainer = $$('#sites-list'); if (sitesListContainer.length === 0) return; let html = ''; if (enabledSites.length === 0) { html = '
暂无启用的网站
'; } else { enabledSites.forEach((site, index) => { const isDefault = defaultSites.includes(site); const badgeHtml = isDefault ? '默认' : ''; const disabledAttr = isDefault ? 'disabled' : ''; html += `
${site} ${badgeHtml}
`; }); } sitesListContainer.html(html); // 绑定移除按钮事件 $$('.remove-site-btn').on('click', function() { const site = $$(this).data('site'); if (confirm(`确定要移除网站 "${site}" 吗?`)) { if (removeSite(site)) { updateSitesDisplay(); alert('网站已移除!页面将刷新以应用新设置。'); location.reload(); } } }); } // 使面板可拖动 function makeDraggable() { let isDragging = false; let currentX; let currentY; let initialX; let initialY; const panel = document.getElementById('script-settings-panel'); const header = document.getElementById('script-panel-header'); header.addEventListener('mousedown', dragStart); document.addEventListener('mousemove', drag); document.addEventListener('mouseup', dragEnd); function dragStart(e) { if (e.target.tagName === 'BUTTON') return; initialX = e.clientX - (parseInt(window.getComputedStyle(panel).left) || 0); initialY = e.clientY - (parseInt(window.getComputedStyle(panel).top) || 0); isDragging = true; panel.style.transform = 'none'; } function drag(e) { if (isDragging) { e.preventDefault(); currentX = e.clientX - initialX; currentY = e.clientY - initialY; panel.style.left = currentX + 'px'; panel.style.top = currentY + 'px'; } } function dragEnd() { isDragging = false; } } // 页面加载完成后创建设置面板 $$(document).ready(function() { createSettingsPanel(); // 如果当前网站未启用,只显示设置面板,不执行其他功能 if (!isCurrentSiteEnabled()) { addLog(`当前网站(${window.location.hostname})未启用脚本功能,请在"网站管理"中添加`, 'info'); return; } addLog(`当前网站(${window.location.hostname})已启用脚本功能`, 'success'); }); // 处理 /jjfz/lesson 主页面,自动选择未完成的章节 if (url == "/jjfz/lesson" && settings.autoLesson && isCurrentSiteEnabled()) { addLog('进入课程主页,开始检测未完成章节', 'info'); if (GM_getValue("dont_note")) { let checkInterval = setInterval(() => { // 查找所有章节 const lessonItems = $$('.lesson_c_ul li'); if (lessonItems.length > 0) { addLog(`检测到 ${lessonItems.length} 个章节`, 'info'); // 查找第一个未完成的章节 let foundIncomplete = false; lessonItems.each((index, item) => { if (foundIncomplete) return false; // 如果已找到,跳出循环 const $item = $$(item); const lessonTitle = $item.find('.lesson_ul_title h2').text().trim(); // 获取必读课件数和已完成数 const dlItems = $item.find('.lesson_center_dl dd'); if (dlItems.length >= 2) { const totalText = dlItems.eq(0).text(); // "必读课件:7" const completedText = dlItems.eq(1).text(); // "已完成必读课件:0" const totalMatch = totalText.match(/(\d+)/); const completedMatch = completedText.match(/(\d+)/); if (totalMatch && completedMatch) { const total = parseInt(totalMatch[1]); const completed = parseInt(completedMatch[1]); addLog(`${lessonTitle}: ${completed}/${total} 已完成`, 'info'); // 如果有必读课件且未完成 if (total > 0 && completed < total) { const studyBtn = $item.find('.lesson_center_a a.study'); const studyUrl = studyBtn.attr('url'); if (studyUrl) { addLog(`发现未完成章节: ${lessonTitle},准备开始学习`, 'success'); foundIncomplete = true; clearInterval(checkInterval); // 延迟1秒后跳转 setTimeout(() => { addLog(`正在进入章节: ${lessonTitle}`, 'info'); window.location.href = studyUrl; }, 1000); return false; // 跳出循环 } } } } }); // 如果没有找到未完成的章节 if (!foundIncomplete) { addLog('所有章节均已完成!🎉', 'success'); clearInterval(checkInterval); } } }, 1000); } else { video_note(); } } //console.log(url) if (url == "/jjfz/lesson/video" && settings.class && isCurrentSiteEnabled()) { //console.log("测试") addLog('进入章节列表页面,开始检测课程', 'info'); if (GM_getValue("dont_note")) { let passNum = 0; let cl = setInterval(() => { getClassList(); passNum = $$(".lesson_pass").length; console.log(passNum) if (classLists.length) { addLog(`检测到课程列表,已完成: ${passNum}/${classLists.length}`, 'info'); // 检查当前页所有课程是否都已完成 if (passNum >= classLists.length && settings.autoPage) { addLog('当前页所有课程已完成,检查是否需要翻页', 'info'); clearInterval(cl); // 当前页全部完成,尝试翻到下一页 if (!goToNextPage()) { // 没有下一页了,检查是否只有单页 const currentPageBtn = $$('.pages a.page_btn'); if (currentPageBtn.length === 0) { // 单页且全部完成,直接返回主页 addLog('单页课程全部完成!准备返回课程列表主页...', 'success'); setTimeout(() => { addLog('正在返回课程列表主页 /jjfz/lesson', 'info'); window.location.href = '/jjfz/lesson'; }, 2000); } } return; } jumpToVideoFromClass(passNum) } if (classLists.length) clearInterval(cl); }, 1000); } else { video_note(); } } if (url.indexOf("play") != -1&& settings.video && isCurrentSiteEnabled()) { addLog('进入视频播放页面', 'info'); playVideo(); let nextVideoFlag = false, nextClassFlag = false; console.log("这是视频播放方法") let vp = setInterval(() => { if (!videoLists.length) { getVideoList(); } nextVideoFlag = closeAlert(); if (settings.jump) { nextClassFlag = jumpToVideo(videoLists); if (nextVideoFlag) nextClassFlag = nextVideo(videoLists); } if (settings.back) { if (nextClassFlag) goBack(); } }, 1000) } if (url == "/jjfz/lesson/exam" && isCurrentSiteEnabled()) { addLog('进入章节测试页面', 'info'); if (settings.copy) { openCopy(); test_note(); addLog('已开启复制功能', 'success'); } if (settings.answer) { addLog('答案查询功能已启用', 'success'); let ga = setInterval(() => { if ($$("#get_answer").length == 0) { $$("#next_question").after("查答案"); $$("#next_question").after("        "); $$("#get_answer").click(function () { getAnswer(); }) } }, 250) } } if (url == "/jjfz/exam_center/end_exam" && isCurrentSiteEnabled()) { addLog('进入期末考试页面', 'info'); if (settings.copy) { openCopy(); test_note(); addLog('已开启复制功能', 'success'); } if (settings.answer) { addLog('答案查询功能已启用', 'success'); let ga = setInterval(() => { if ($$("#get_answer").length == 0) { $$("#next_question").after("查答案"); $$("#next_question").after("        "); $$("#get_answer").click(function () { getAnswer(); }) } }, 250) } } if (/\/exam\//.test(url) && isCurrentSiteEnabled()) { addLog('进入考试页面', 'info'); openCopy(); if (GM_getValue("exam_note")) { } else { exam_note(); } } settings.type = { '单选题': "单选题", '多选题': '多选题', '填空题': '填空题', '问答题': '问答题', '分析题/解答题/计算题/证明题': 5, '阅读理解(选择)/完型填空': 9, '判断题': '判断题' }; function getClassList() { let classList = [] if ($$(".l_list_right")) { $$(".l_list_right").each((ind, ele) => { if ($$(ele).find("div .r_read").text() == " 必 修 ") { classList.push($$(ele).find("h2 a")) } }) } classLists = classList; } function getVideoList() { if ($$(".video_lists li").length) { console.log("当前视频" + $$(".video_red1").text()) addLog(`当前视频: ${$$(".video_red1").text()}`, 'info'); videoLists = $$(".video_lists li"); } } function jumpToVideoFromClass(passNum) { if (passNum != classLists.length) { addLog(`正在跳转到第 ${passNum + 1} 个章节`, 'info'); $$(classLists[passNum]).attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); } else { addLog('所有章节已完成!', 'success'); } } // 自动翻页功能 function goToNextPage() { // 获取当前页码按钮(带class="page_btn"的是当前页) const currentPageBtn = $$('.pages a.page_btn'); if (currentPageBtn.length === 0) { addLog('未找到分页信息,可能是单页或页面结构变化', 'info'); return false; } // 查找"下一页"按钮 const nextPageLink = $$('.pages a:contains("下一页")'); if (nextPageLink.length > 0 && nextPageLink.attr('href')) { const nextPageHref = nextPageLink.attr('href'); addLog(`正在翻到下一页: ${nextPageHref}`, 'info'); // 使用临时元素点击跳转 nextPageLink.attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); return true; } else { // 没有"下一页"按钮,说明已经是最后一页,所有课程已完成 addLog('已到达最后一页,所有课程已完成!准备返回课程列表主页...', 'success'); // 延迟2秒后返回主页,让用户看到提示 setTimeout(() => { addLog('正在返回课程列表主页 /jjfz/lesson', 'info'); window.location.href = '/jjfz/lesson'; }, 2000); return false; } } function closeAlert() { //console.log("测试") if ($$(".public_submit").length) { //console.log("视频数量" + $$(".video_lists li")) let text = $$(".public_text").text(); if (text.indexOf("当前视频播放完毕") >= 0) { addLog('视频播放完毕', 'success'); return true; } else if (text.indexOf("该课程视频你上次观看到") >= 0) { addLog('检测到继续播放提示,自动取消', 'info'); $$(".public_cancel").attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); return false; } else { addLog('自动关闭弹窗', 'info'); $$(".public_submit").attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); return false; } } } function nextVideo(videoList) { let index = $$(videoList).index($$(".video_red1")); if (videoList[index + 1]) { addLog(`切换到下一个视频 (${index + 2}/${videoList.length})`, 'info'); $$(videoList[index + 1]).children("a").attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); return false; } else { addLog('当前章节所有视频已播放完毕', 'success'); return true; } } function jumpToVideo(videoList) { if ($$(".video_red1").find("a").attr("style") == "width:70%;color:red") { let index = $$(videoList).index($$(".video_red1")); if (videoList[index + 1]) { addLog(`跳过已完成的视频,切换到第 ${index + 2} 个`, 'info'); $$(videoList[index + 1]).children("a").attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); } else { return true; } } } function goBack() { addLog('返回章节列表', 'info'); $$(".video_goback").attr('id', 'aRemoveAllTxt'); document.getElementById("aRemoveAllTxt").click(); } function playVideo() { _self.studyTime = function () { var diff_time = 5000; $.ajax({ type: "POST", cache: false, dataType: "json", url: "/jjfz/lesson/study_time", data: { rid: "630089", study_time: diff_time, _xsrf: $(":input[name='_xsrf']").val() }, success: function () { } }); flag = setTimeout("studyTime()", diff_time); } _self.player.on('pause', function (event) { if ($$(".public_submit").length) { } else _self.player.play(); }); } function getAnswer() { let question = $$(".exam_h2").text(), type = String(settings.type[$$(".e_cont_title span").text()]); let postData = { question: filterImg($$(".exam_h2"), this).replace(/^(\S*)/, '').replace(/^【.*?】\s*/, '').replace(/\s*(\d+\.\d+分)$/, '').replace(/[(]\s*[)]。$/, '').replace(/(\s*)。$/, '').replace(/[(]\s*[)]$/, '').replace(/(\s*)$/, ''), option: "政治", type: Boolean(type) ? type : 10 } addLog(`正在查询答案: ${postData.question.substring(0, 30)}...`, 'info'); console.log(postData.question); console.log(postData.type); GM_xmlhttpRequest({ method: 'POST', url: 'http://api.902000.xyz:88/wkapi.php', headers: { 'Content-type': 'application/x-www-form-urlencoded', }, data: 'q=' +encodeURIComponent(postData.question) + '&type=' + postData.type, timeout: 5000, onload: function (xhr) { //console.log(xhr) if (xhr.status == 200) { let obj = $$.parseJSON(xhr.responseText) || {}; //return obj.answer; let answer = obj.answer; if (answer && answer !== "网络题库目前没有答案哦,推荐使用学小易或百度查询!(搜不出来可以多点几次,后台会在百度搜索答案)") { addLog(`查询到答案: ${answer.substring(0, 50)}...`, 'success'); } else { addLog('题库中未找到答案', 'info'); } if ($$(".e_cont_title").find("span").text() == "判断题") { if (answer != "网络题库目前没有答案哦,推荐使用学小易或百度查询!(搜不出来可以多点几次,后台会在百度搜索答案)" & answer.indexOf("无答案") == -1) { if (question.indexOf(answer) != -1) { answer = "提示:" + answer + "——可根据提示自行判断正误!" } else { answer = "提示:" + answer + "——可根据提示自行判断正误!" } } } if ($$(".fuck_answer").length == 0) { $$(".answer_list").after("
" + answer + "
"); $$(".answer_list_box").after("
" + answer + "
"); } else { $$(".fuck_answer").text(answer); } } else { addLog('答案查询失败,请稍后重试', 'error'); } }, onerror: function() { addLog('答案查询请求失败', 'error'); } }) } function openCopy() { $$(document).ready(new function () { document.oncontextmenu = new Function("event.returnValue=true"); document.onselectstart = new Function("event.returnValue=true"); document.oncopy = new Function("return true"); }) } function exam_note() { alert_note(2, ["不同意", "同意"], "考试说明及免责声明", '

期末考试未经测试,不保证可用性!!!

' + '

请仔细阅读以下内容

' + '

考试平台目前无法测试,脚本是否可以还不清楚

' + '

当前实现方式由推测而来

' + '

你使用脚本造成的损失自行承担

' + '

你点击同意视为遵守以上内容!

' + '

欢迎捐赠,对于你的捐赠表示由衷感谢   |点击向我捐赠|

', 'public_cont1', function () { $(".public_close").click(); //此为关闭方法 GM_setValue("exam_note", false) err_note() }, function () { $(".public_close").click(); //此为关闭方法 GM_setValue("exam_note", true) location.href = "https://greasyfork.org/zh-CN/scripts/414487-%E6%88%91%E5%B0%B1%E6%98%AF%E7%A7%AF%E6%9E%81%E5%88%86%E5%AD%90"; }); } function video_note() { alert_note(2, ["关闭", "不在提示"], "我就是积极分子脚本使用说明", + '

详细设置请修改源代码

' + '

欢迎捐赠,对于你的捐赠表示由衷感谢   |点击向我捐赠|

' + '

本脚本免费使用严谨倒卖

' + '

如果你是以收费方式获得此脚本

' + '

请立即退款并在官方页面下载原版   |点我下载原版|

', 'public_cont1', function () { $(".public_close").click(); //此为关闭方法 GM_setValue("dont_note", false) }, function () { $(".public_close").click(); //此为关闭方法 GM_setValue("dont_note", true) location.href = "https://greasyfork.org/zh-CN/scripts/414487-%E6%88%91%E5%B0%B1%E6%98%AF%E7%A7%AF%E6%9E%81%E5%88%86%E5%AD%90"; }); } function test_note() { alert_note(1, ["关闭"], "我就是积极分子答题使用说明", '

由于精力有限,实在无法提供用户界面

' + '

题库来源于网络,不保证准确性!!!

' + '

这个题库的无延迟查询通道已经关了,免费的果然一般(哈哈)

' + '

作者没钱搞服务器整题库,所以你懂的

' + '

将就用一下就好,建议打开复制自行搜索!

' + '

推荐使用学小易,非常准确,或者百度,欢迎向我捐赠

' + //'

欢迎捐赠,对于你的捐赠表示由衷感谢   |点击向我捐赠|

', + '', 'public_cont1', function () { $(".public_close").click(); //此为关闭方法 }); } function err_note() { alert_note(1, ["关闭"], "如果要继续使用脚本请点击同意", '

如果要继续使用脚本请点击同意

' + //'

欢迎捐赠,对于你的捐赠表示由衷感谢   |点击向我捐赠|

', + '', 'public_cont1', function () { $(".public_close").click(); //此为关闭方法 exam_note(); }); } function alert_note(btn_num, btn_text, note_text, public_text, public_cont_class, submit_fun, cancel_fun) { if (btn_num == 1) { var public_a = '' + btn_text[0] + ''; } else { var public_a = '' + btn_text[0] + ' ' + btn_text[1] + ''; } var public_html = '

' + note_text + '

' + public_text + '
' + public_a + '
'; $("body").append(public_html); $(".public_close").click(function () { $(".public_mask").remove(); $(".public_cont").remove(); }); $(".public_mask").click(function () { $(".public_mask").remove(); $(".public_cont").remove(); }); if (btn_num == 1) { $(".public_submit").click(function () { submit_fun(); }) } else { $(".public_submit").click(function () { submit_fun(); }); $(".public_cancel").click(function () { cancel_fun(); }) } } function filterImg(dom) { return $$(dom).clone().find("img[src]").replaceWith(function () { return $$("

").text(''); }).end().find("iframe[src]").replaceWith(function () { return $$("

").text('