// ==UserScript== // @name 学习通作业题库提取(自用) // @namespace http://tampermonkey.net/ // @version 0.1 // @description 提取学习通写过的作业转成文本题库便于浏览或分享给他人。 // @author 纸鸢花的花语 // @match https://mooc2-ans.chaoxing.com/mycourse/stu?courseid=232877075&clazzid=73045453&cpi=201513846&enc=4f3e29cc8045390ddf0928b103ca9b44&t=1681446633776&pageHeader=0&v=2 // @icon https://p1.xywm.ltd/2023/04/21/a6b79200ba6260e62e9cf4a9f100d2a4.png // @grant none // @include *://mooc1.chaoxing.com/mooc2/work/view* // @downloadURL none // ==/UserScript== (function() { 'use strict'; // 导入菜单栏样式 function insertStyle() { const qStyle = document.createElement("style"); qStyle.setAttribute("type", "text/css"); qStyle.innerHTML = ` ul { list-style: none; } #qBox { min-width: 250px; z-index: 9999; position: fixed; left: 20px; top: 20px; border-radius: 5px; border: 2.5px solid black; background-color: white; } #qBox>div { font-size: 14px; display: flex; align-items: center; justify-content: space-between; padding: 5px 10px; font-weight: bold; } #qBox span { margin: 5px; } #qBox span button { border: 0; display: inline-block; height: 30px; border-radius: 2px; min-width: 30px; } #qList { max-width: 500px; max-height: 100px; overflow: hidden; overflow-y: scroll; } #logo { width: 35px; height: 35px; border-radius: 2.5px; box-shadow: rgba(0, 0, 0, 0.16) 0px 3px 6px, rgba(0, 0, 0, 0.23) 0px 3px 6px; background-image: url('https://p1.xywm.ltd/2023/04/21/a6b79200ba6260e62e9cf4a9f100d2a4.png'); background-size: cover; } `; let headNode = document.querySelector('head'); headNode.appendChild(qStyle); } insertStyle(); // 解析题库后显示在菜单栏 function displayQS(qObject) { let qULs = ""; for (let qNodeIndex = 0; qNodeIndex < qObject.length; qNodeIndex++) { let qNode = qObject[qNodeIndex]; let qLIs = "" for (let qItemIndex = 0; qItemIndex < qNode["nodeList"].length; qItemIndex++) { let qItem = qNode["nodeList"][qItemIndex]; let qLI = `
  • ` + qItem["q"] + `
    ` + qItem["an"] + `
  • `; qLIs += qLI; } let qUL = ` `; qULs += qUL; } const qList = document.getElementById("qList"); qList.innerHTML = qULs; } // 文本转下载成TXT文件 function funDownload(content, filename) { if (content.length == 0) { alert("解析参数为空"); } else { const eleLink = document.createElement('a'); eleLink.download = filename; eleLink.style.display = 'none'; const blob = new Blob([content]); eleLink.href = URL.createObjectURL(blob); document.body.appendChild(eleLink); eleLink.click(); document.body.removeChild(eleLink); } } // 获取作业标题 const qTitle = document.querySelector(".mark_title").innerText; // console.log(qTitle); // 创建小菜单盒子 let qBox = document.createElement("div"); qBox.id = "qBox"; qBox.innerHTML = `
    学习通题库提取:
    标题

    题目信息:
    `; document.body.insertBefore(qBox, document.body.firstElementChild); document.getElementById("qTitle").innerHTML = qTitle; // 获取要拖拽的标签元素 const tag = document.querySelector('#qBox'); let isDragging = false; // 是否正在拖拽 let startX, startY; // 开始拖拽时的鼠标位置 let offsetX, offsetY; // 鼠标点与标签左上角的偏移量 tag.addEventListener('mousedown', e => { startX = e.clientX; startY = e.clientY; offsetX = startX - tag.offsetLeft; offsetY = startY - tag.offsetTop; isDragging = true; }); document.addEventListener('mousemove', e => { if (isDragging) { const x = e.clientX - offsetX; const y = e.clientY - offsetY; tag.style.left = `${x}px`; tag.style.top = `${y}px`; } }); document.addEventListener('mouseup', () => { isDragging = false; }); let jxBtn = document.getElementById("jxBtn"); jxBtn.onclick = function () { mainQuestionS(); } let xzBtn = document.getElementById("xzBtn"); xzBtn.onclick = function () { downloadQStr(); } // 题库对象基本结构 let allQsObject = [ // { // nodeName: "", // nodeList: [ // { // q: "", // slt: [], // an: "", // },{} // ] // },{} ] // 所有题目文本集合 let allStr = ""; // 解析网页标签 function mainQuestionS() { allQsObject = []; allStr = ""; let nodeBox = document.getElementsByClassName("mark_item"); // console.log(nodeBox); // 遍历大题节点 for (let nodeIndex = 0; nodeIndex < nodeBox.length; nodeIndex++) { // 创建每大题节点结构 let node = { nodeName: "", nodeList: [] } // 对象循环定位 let qNode = nodeBox[nodeIndex] let typeTitle = qNode.querySelector(".type_tit").innerText; // console.log(typeTitle); allStr += typeTitle + "\n"; // 标题加入表结构 node["nodeName"] = typeTitle; let questions = qNode.querySelectorAll(".questionLi"); for (let qIndex = 0; qIndex < questions.length; qIndex++) { // 创建每小题结构 let qItem = { slt: [] } // 题目标签定位 let question = questions[qIndex]; // console.log(question); // 题目 let qName = question.querySelector(".mark_name").innerText; // console.log(qName); allStr += qName + "\n"; qItem["q"] = qName; // 题目选项 let qSelectBox = question.querySelector(".mark_letter"); // console.log(qSelectBox); // 判断是否为选择题 if (qSelectBox) { let qSelect = qSelectBox.getElementsByTagName("li"); for (let qSelectItemIndex = 0; qSelectItemIndex < qSelect.length; qSelectItemIndex++) { let qSelectItem = qSelect[qSelectItemIndex].innerText; if (qSelectItem) { // console.log(qSelectItem); allStr += qSelectItem + "\n"; qItem["slt"].push(qSelectItem); } } } // 题目正确答案,答案拼接 let qAnwser = question.querySelector(".mark_answer").querySelectorAll(".colorGreen"); let answerStr = ""; for (let answersIndex = 0; answersIndex < qAnwser.length; answersIndex++) { answerStr += qAnwser[answersIndex].innerText; } // console.log(answerStr); allStr += answerStr + "\n"; qItem["an"] = answerStr; node["nodeList"].push(qItem); } allQsObject.push(node); } // console.log(allQsObject); displayQS(allQsObject); }; // 题库本地下载 function downloadQStr() { funDownload(allStr, qTitle + ".txt"); } })();