【提取学习通作业考试标题答案下载到本地大概POST数据库】 ...

打印 上一主题 下一主题

主题 851|帖子 851|积分 2553

这段油猴(Tampermonkey)脚本是用来提取学习通(Chaoxing)平台上作业和考试标题的个人答案,并将其转换成Excel格式的题库,方便浏览或分享给他人。让我们渐渐分析脚本的功能和结构:
脚本功能概述


  • 样式插入 (insertStyle函数):

    • 功能:插入自定义的CSS样式,美化题库提取工具的界面。
    • 样式包括设置列表无序化、标题容器的样式、logo的样式等。

  • 标题展示 (displayQuestions函数):

    • 功能:根据提取的标题数据,将标题和答案显示在浮动框中。
    • 使用了模板字符串构建标题列表,展示每道题的标题内容、选项、个人答案和正确答案。

  • Excel下载 (downloadExcel函数):

    • 功能:将提取的标题数据转换为Excel文件并下载。
    • 使用了 xlsx.full.min.js 库来实现将数据转换为Excel的功能。

  • 界面创建和拖动支持 (createMenuBox和setupDraggableBox函数):

    • createMenuBox函数:创建了一个浮动的标题显示框,包罗标题、剖析和下载按钮等。
    • setupDraggableBox函数:实现了浮动框的拖动功能,使用户可以移动浮动框的位置。

  • 标题剖析 (parseQuestions函数):

    • 功能:从页面中剖析出所有的标题数据,包括标题名称、选项内容、个人答案和正确答案。
    • 使用了 DOM 查询和操纵来获取并剖析每个标题的相关信息,并将剖析后的数据存储在 allQsObject 和 allStr 中。

  • 初始化 (init函数):

    • 功能:初始化整个脚本,包括插入样式、创建界面、设置按钮点击事件等。
    • 在初始化过程中,将页面中的标题数据提取并显示,同时设置了剖析和下载按钮的点击事件。

留意事项



  • 匹配规则 (@match和@require): 脚本通过 @match 指定了可以运行的页面地址,确保只在学习通平台相关页面上实行。
  • 数据处置惩罚: 脚本通过 DOM 操纵和字符串处置惩罚来提取和展示标题数据,需要包管页面结构和元素的正确性和稳定性。
  • Excel导出: 使用了第三方库 xlsx.full.min.js 来处置惩罚Excel文件的天生,需要确保网络环境能够正常访问该库。
这段脚本的主要功能是资助用户将学习通上的作业和考试标题以Excel的形式整理和导出,便于后续分析或分享。
  1. function displayQuestions(qObject) {
  2.         let qULs = "";
  3.         qObject.forEach(qNode => {
  4.             let qLIs = "";
  5.             qNode.nodeList.forEach(qItem => {
  6.                 let qSltString = qItem.slt.map(slt => `<li>${slt}</li>`).join('');
  7.                 let qLI = `
  8.                     <li style="padding-left: 5px; margin: 10px 0;">
  9.                         <div>${qItem.q}</div>
  10.                         ${qSltString}
  11.                         <div style="color: blue;">${qItem.myAn}</div>
  12.                         <div style="color: red; text-align: right">${qItem.an}</div>
  13.                     </li>
  14.                 `;
  15.                 qLIs += qLI;
  16.             });
  17.             let qUL = `<ul style="padding: 0;">${qNode.nodeName}${qLIs}</ul>`;
  18.             qULs += qUL;
  19.         });
  20.         document.getElementById("qList").innerHTML = qULs;
  21.     }
复制代码
  1. function parseQuestions() {
  2.         allQsObject = [];
  3.         allStr = "";
  4.         const nodeBox = document.getElementsByClassName("mark_item");
  5.         Array.from(nodeBox).forEach(qNode => {
  6.             let node = { nodeName: "", nodeList: [] };
  7.             const typeTitle = qNode.querySelector(".type_tit")?.innerText || "";
  8.             allStr += `${typeTitle}\n`;
  9.             node.nodeName = typeTitle;
  10.             const questions = qNode.querySelectorAll(".questionLi");
  11.             questions.forEach(question => {
  12.                 let qItem = { slt: [], q: "", myAn: "", an: "" };
  13.                 const qName = question.querySelector(".mark_name").innerText;
  14.                 allStr += `${qName}\n`;
  15.                 qItem.q = qName;
  16.                 const qSelectBox = question.querySelector(".mark_letter");
  17.                 if (qSelectBox) {
  18.                     const qSelectItems = qSelectBox.getElementsByTagName("li");
  19.                     Array.from(qSelectItems).forEach(qSelectItem => {
  20.                         const qSelectText = qSelectItem.innerText;
  21.                         if (qSelectText) {
  22.                             allStr += `${qSelectText}\n`;
  23.                             qItem.slt.push(qSelectText);
  24.                         }
  25.                     });
  26.                 }
  27.                 try {
  28.                     const qAnswer = question.querySelector(".mark_answer .colorGreen")?.innerText || "";
  29.                     const qMyAnswer = question.querySelector(".mark_answer .colorDeep")?.innerText || "";
  30.                     allStr += `${qMyAnswer}\n${qAnswer}\n`;
  31.                     qItem.myAn = qMyAnswer;
  32.                     qItem.an = qAnswer;
  33.                 } catch (err) {
  34.                     console.log(err);
  35.                 }
  36.                 node.nodeList.push(qItem);
  37.             });
  38.             allQsObject.push(node);
  39.         });
  40.         displayQuestions(allQsObject);
  41.     }
  42.     function init() {
  43.         insertStyle();
  44.         createMenuBox();
  45.         setupDraggableBox();
  46.         document.getElementById("qTitle").innerHTML = document.querySelector(".mark_title").innerText;
  47.         document.getElementById("jxBtn").onclick = parseQuestions;
  48.         document.getElementById("xzBtn").onclick = () => {
  49.             const filename = document.querySelector(".mark_title").innerText + ".xlsx";
  50.             const data = allQsObject.reduce((arr, qNode) => {
  51.                 qNode.nodeList.forEach(qItem => {
  52.                     arr.push({
  53.                         '题目': qItem.q,
  54.                         '选项': qItem.slt.join("\n"),
  55.                         '我的答案': qItem.myAn,
  56.                         '正确答案': qItem.an
  57.                     });
  58.                 });
  59.                 return arr;
  60.             }, []);
  61.             downloadExcel(data, filename);
  62.         };
  63.     }
  64.     let allQsObject = [];
  65.     let allStr = "";
  66.     init();
  67. })();
复制代码
感爱好的可以根据以上去完善一下基本能实现了

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

惊落一身雪

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表