// ==UserScript== // @name 🧰蓝墨云工具箱 Mosoteach Toolkit // @namespace http://github.com/ellean/ // @version 1.4.0 // @description 让蓝墨云更加强大、易用!Make Mosoteach more powerfull & user-friendly ! // @author Younntone // @match https://www.mosoteach.cn/web/index.php?c=interaction_quiz&m=person_quiz_result&clazz_course_id=*&id=*&order_item=group&user_id=* //@match https://www.mosoteach.cn/web/index.php?c=interaction_quiz&m=reply&clazz_course_id=*&id=*&order_item=group // @match https://www.mosoteach.cn/web/index.php?c=interaction&m=index&clazz_course_id=* // @match https://www.mosoteach.cn/web/index.php?c=res&m=index&clazz_course_id=* // @grant none // @downloadURL none // ==/UserScript== (function () { 'use strict'; // 获取 当前页面 const a = $('', { href: window.location.search }); const c = a.prop('search').split('?c=')[1].split('&')[0] const m = a.prop('search').split('&m=')[1].split('&')[0] // 获取 课程 id let clazzCourseId = a.prop('search').split('&clazz_course_id=')[1].split('&')[0] // 判断 当前页面 switch (c) { case 'interaction': /** * *---------------------------------------* * * 为 已结束 的 测试活动 添加直接查看分析的按钮 * * *---------------------------------------* */ // 获取 活动节点集合 let activities = $('.interaction-row'); // 遍历所有活动 for (let index = 0; index < activities.length; index++) { const activity = activities[index]; const activityType = activity.getAttribute('data-type'); const quizStatus = activity.children[1].children[0].children[0].className; // 判断 每个活动节点是否为测试 if (activityType === 'QUIZ') { let id = activity.getAttribute('data-id'); // 如果 是测试并且已经结束 if (quizStatus === 'interaction-status end') { // 添加 直接打开分析页面的按钮 let url = `https://www.mosoteach.cn/web/index.php?c=interaction_quiz&m=person_quiz_result&clazz_course_id=${clazzCourseId}&id=${id}&order_item=group`; let button = document.createElement('div'); button.className = 'interaction-status processing'; button.innerText = '习题分析'; button.addEventListener('click', () => { window.open(url); event.stopPropagation(); }); activity.children[1].children[0].appendChild(button); } // 如果 是测试并且本地有答案 if (JSON.parse(window.localStorage.getItem(id))) { let button = document.createElement('div'); button.className = 'interaction-status processing'; button.innerText = '有答案'; activity.children[1].children[0].appendChild(button); } } } break; case 'interaction_quiz': /** * *-------------------------------------* * * 为 测试分析 添加导出全部题目到粘贴板的按钮 * * *-------------------------------------* */ const id = a.prop('search').split('&id=')[1].split('&')[0] const quizTitle = $('.manager-active-name-length')[0].innerText; const quizCollection = $('.view-quiz-row'); const quizAnswerCollection = $('.answer-box'); let quizList = []; let answerList = {}; if (m === 'reply') { $('[style="text-align:center;"]').attr('style','position: sticky;text-align:center;bottom: 100px;') let _answersList = JSON.parse(window.localStorage.getItem(id)); let quizList = $('.student-topic-row'); // 创建标示 var copyButton = document.createElement('button'); if (_answersList) { copyButton.innerHTML = '该测试有答案'; copyButton.style = 'width: 100px;height: 50px;position: fixed;top: 400px;left: 30px;background-color: green;'; copyButton.addEventListener('click', function () { for (const key in _answersList) { if (_answersList.hasOwnProperty(key)) { const answers = _answersList[key]; for (let i = 0; i < quizList.length; i++) { const quiz = quizList[i]; if (quiz.children[0].children[1].children[1].innerText.indexOf(key) === 0) { for (let j = 0; j < answers.length; j++) { const answer = answers[j]; switch (answer) { case 'A': quizList[i].children[2].click() break; case 'B': quizList[i].children[3].click() break; case 'C': quizList[i].children[4].click() break; case 'D': quizList[i].children[5].click() break; case 'E': quizList[i].children[6].click() break; case 'F': quizList[i].children[7].click() break; case 'G': quizList[i].children[8].click() break; case 'H': quizList[i].children[9].click() break; case 'I': quizList[i].children[10].click() break; case 'J': quizList[i].children[11].click() break; case 'K': quizList[i].children[12].click() break; case 'L': quizList[i].children[13].click() break; case 'M': quizList[i].children[14].click() break; default: break; } } } } } } }); } else { copyButton.innerHTML = '该测试无答案'; copyButton.style = 'width: 100px;height: 50px;position: fixed;top: 400px;left: 30px;background-color: red;'; } // 挂载 按钮节点 document.body.appendChild(copyButton); } else { // 获取 所有题目 for (let quizIndex = 0; quizIndex < quizCollection.length; quizIndex++) { const quiz = quizCollection[quizIndex]; const num = quiz.children[0].children[0].children[0].children[0].innerHTML; const question = quiz.children[0].children[0].children[0].children[1].children[2] .children[0].innerText; const optionCount = quiz.children[0].children[0].children[2].childElementCount; let options = []; // 获取 该题所有选项 for (let optionIndex = 0; optionIndex < optionCount; optionIndex++) { const optionMark = quiz.children[0].children[0].children[2].children[optionIndex] .children[0].innerText; const option = quiz.children[0].children[0].children[2].children[optionIndex] .children[2].innerText; options.push(` ${optionMark}. ${option}`); } // 获取 答案 let re = /[A-Z]\s/g let answer = quizAnswerCollection[quizIndex * 2].innerHTML.match(re).map(str => (str.replace(' ', ''))); quizList.push(` ${num}. ${question} ${answer} ${options}`); answerList[question] = answer; } // 整理内容 var detail = `题目标题: ${quizTitle} 题目总数: ${quizCollection.length} 题目: ${quizList} `; let _answersList = JSON.parse(window.localStorage.getItem(id)); // 创建 按钮节点 var copyButton = document.createElement('button'); if (_answersList) { copyButton.innerHTML = '该测试已有答案,导出试题'; copyButton.style = 'width: fit-content;padding: 30px;height: 50px;position: fixed;top: 400px;left: 30px;background-color: green;'; } else { copyButton.innerHTML = '该试题无答案,点击导出试题并保存答案'; copyButton.style = 'width: fit-content;padding: 30px;height: 50px;position: fixed;top: 400px;left: 30px;background-color: red;'; } copyButton.addEventListener('click', function () { var oInput = document.createElement('textarea'); oInput.value = detail; document.body.appendChild(oInput); oInput.select(); document.execCommand('Copy'); oInput.className = 'oInput'; oInput.style.display = 'none'; alert('已复制到粘贴板'); window.localStorage.setItem(id, JSON.stringify(answerList)); copyButton.style = 'width: fit-content;padding: 30px;height: 50px;position: fixed;top: 400px;left: 30px;background-color: green;'; }); // 挂载 按钮节点 document.body.appendChild(copyButton); } break; case 'res': /** * *-------------------------------------* * * 为 资源 添加是否可拖动进度条开关 * * *-------------------------------------* */ const dragSwitch = $('视频进度可拖拽') $('div[data-mime=video]').attr('data-drag', 'Y') dragSwitch.click(() => { if ($("#dragable").attr('class') == 'icon-circle-blank') { $("#dragable").attr('class', 'icon-ok-circle') $('div[data-mime=video]').attr('data-drag', 'Y') } else { $("#dragable").attr('class', 'icon-circle-blank') $('div[data-mime=video]').attr('data-drag', 'N') } }) $("div[style='display:inline-block;']").after(dragSwitch) /** * *-------------------------------------* * * 点开视频再关闭即可实现看完 * * * mosoteach本身BUG导致不需要此段代码 * * *-------------------------------------* */ // $.ajaxSetup({ // beforeSend: function () { // console.log(arguments[1].data) // let data = arguments[1].data // let encodedData = '' // for (const key in data) { // if (data.hasOwnProperty(key)) { // let value = data[key]; // if (key.includes('watch_to')) { // value = data.duration // } // encodedData = encodedData.concat(`&${key}=${value}`) // } // } // arguments[1].data = encodedData.substring(1, encodedData.length) // }, // processData: false // }); break; default: break; } })();