超星 To Csv

将你的超星学习通里的作业数据、随堂练习导出成为 Csv 文件,方便导入 Anki 背题

当前为 2021-11-26 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name 超星 To Csv
  3. // @version 0.1.0
  4. // @description 将你的超星学习通里的作业数据、随堂练习导出成为 Csv 文件,方便导入 Anki 背题
  5. // @author Nexmoe
  6. // @namespace https://nexmoe.com/
  7. // @match *://*.chaoxing.com/*
  8. // @grant GM_setValue
  9. // @grant GM_getValue
  10. // @license MIT
  11. // ==/UserScript==
  12.  
  13. // 在此处键入代码……
  14. let css = () => {
  15. let style = document.createElement("style");
  16. style.type = "text/css";
  17. let text = document.createTextNode("textarea { border: 1px solid; width: 100%; resize: none;}");
  18. style.appendChild(text);
  19. let head = document.getElementsByTagName("head")[0];
  20. head.appendChild(style);
  21. }
  22.  
  23. let generateTextArea = (data) => {
  24. let node = document.createElement("textarea");
  25. let textnode = document.createTextNode(data);
  26. node.appendChild(textnode);
  27. if (document.getElementsByClassName("detailsHead").length > 0) {
  28. document.getElementsByClassName("detailsHead")[0].appendChild(node);
  29. } else {
  30. document.getElementsByClassName("top-box")[0].appendChild(node);
  31. }
  32. }
  33.  
  34. function ConvertToCSV(objArray) {
  35. var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
  36. var str = '';
  37.  
  38. for (var i = 0; i < array.length; i++) {
  39. var line = '';
  40. for (var index in array[i]) {
  41. if (line != '') line += ','
  42.  
  43. line += array[i][index];
  44. }
  45.  
  46. str += line + '\r\n';
  47. }
  48.  
  49. return str;
  50. }
  51.  
  52. let saveFile = (data) => {
  53. const blob = new Blob([data], { type: 'text/csv;charset=utf-8;' });
  54. const Url = URL.createObjectURL(blob);
  55. let link = document.createElement('a');
  56. link.download = `data.csv`; //文件名字
  57. link.href = Url;
  58. link.appendChild(document.createTextNode('下载题目数据'));
  59. if (document.getElementsByClassName("detailsHead").length > 0) {
  60. document.getElementsByClassName("detailsHead")[0].appendChild(link);
  61. } else {
  62. document.getElementsByClassName("top-box")[0].appendChild(link);
  63. }
  64. }
  65.  
  66. let getData = (i, data = []) => {
  67. let questions, selections, answers;
  68. if (document.getElementsByClassName("mark_name").length > 0) {
  69. questions = document.getElementsByClassName("mark_name");
  70. selections = document.getElementsByClassName("mark_letter");
  71. answers = document.getElementsByClassName("colorGreen");
  72. } else {
  73. questions = document.getElementsByClassName("topic-title");
  74. selections = document.getElementsByClassName("topic-options");
  75. answers = document.getElementsByClassName("color-green");
  76.  
  77. }
  78.  
  79. for (i = 0; i < questions.length; i++) {
  80. data.push({
  81. question: questions[i].innerText.replace(
  82. new RegExp(",", "gm"),
  83. ","
  84. ).replace(
  85. new RegExp("\n", "gm"),
  86. ""
  87. ),
  88. selection: selections[i].innerText.replace(
  89. new RegExp("\n", "gm"),
  90. "***"
  91. ).replace(
  92. new RegExp(",", "gm"),
  93. ","
  94. ),
  95. answer: answers[i].innerText.replace("正确答案: ", "").replace(
  96. new RegExp(",", "gm"),
  97. ","
  98. ).replace(
  99. new RegExp("对", "gm"),
  100. "A"
  101. ).replace(
  102. new RegExp("错", "gm"),
  103. "B"
  104. )
  105. })
  106. }
  107. console.log(data)
  108. return data;
  109. }
  110.  
  111. (function () {
  112. 'use strict';
  113. css();
  114. if (document.getElementsByClassName("mark_name").length > 0) {
  115. generateTextArea(JSON.stringify(getData()));
  116. saveFile(ConvertToCSV(JSON.stringify(getData())));
  117. } else {
  118. setTimeout(() => {
  119. generateTextArea(JSON.stringify(getData()));
  120. saveFile(ConvertToCSV(JSON.stringify(getData())));
  121. }, 1000)
  122. }
  123. })();