超星 To Csv

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

目前為 2022-05-11 提交的版本,檢視 最新版本

// ==UserScript==
// @name         超星 To Csv
// @version      0.1.4
// @description  将你的超星学习通里的作业数据、随堂练习导出成为 Csv 文件,方便导入 Anki 背题
// @author       Nexmoe
// @github       https://github.com/nexmoe/chaoxing2csv
// @namespace     https://nexmoe.com/
// @match        *://*.chaoxing.com/*
// @license      MIT
// ==/UserScript==

// 在此处键入代码……
let css = () => {
    let style = document.createElement("style");
    style.type = "text/css";
    let text = document.createTextNode("textarea { border: 1px solid; width: 100%; resize: none;}");
    style.appendChild(text);
    let head = document.getElementsByTagName("head")[0];
    head.appendChild(style);
}

let generateTextArea = (data) => {
    let node = document.createElement("textarea");
    let textnode = document.createTextNode(data);
    node.appendChild(textnode);
    if (document.getElementsByClassName("detailsHead").length > 0) {
        document.getElementsByClassName("detailsHead")[0].appendChild(node);
    } else {
        document.getElementsByClassName("top-box")[0].appendChild(node);
    }
}

function ConvertToCSV(objArray) {
    var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
    var str = '';

    for (var i = 0; i < array.length; i++) {
        var line = '';
        for (var index in array[i]) {
            if (line != '') line += ','

            line += array[i][index];
        }

        str += line + '\r\n';
    }

    return str;
}

let saveFile = (data) => {
    const blob = new Blob([data], { type: 'text/csv;charset=utf-8;' });
    const Url = URL.createObjectURL(blob);
    let link = document.createElement('a');
    if (document.getElementsByClassName("item-name").length > 0) {
        link.download = document.getElementsByClassName("item-name")[0].innerText + '.csv';	//文件名字
    } else {
        link.download = document.getElementsByClassName("mark_title")[0].innerText + '.csv';	//文件名字
    }

    link.href = Url;
    link.appendChild(document.createTextNode('下载题目数据'));
    if (document.getElementsByClassName("detailsHead").length > 0) {
        document.getElementsByClassName("detailsHead")[0].appendChild(link);
    } else {
        document.getElementsByClassName("top-box")[0].appendChild(link);
    }
}

let optionsFilter = (dom, i = 0, strings = "") => {
    for (i = 0; i < dom.children.length; i++) {
        if (i < (dom.children.length - 1)) {
            strings = strings + dom.children[i].innerText + "||";
        } else {
            strings = strings + dom.children[i].innerText;
        }
    }
    return strings.replace(
        new RegExp(",", "gm"),
        ","
    ).replace(
        new RegExp("\n", "gm"),
        ""
    );
}

let answersFilter = (dom, i = 0, strings = "") => {
    answer = dom.innerText.replace("正确答案: ", "").replace(
        new RegExp(",", "gm"),
        ","
    ).replace(
        new RegExp(" ", "gm"),
        ""
    ).replace(
        new RegExp("对", "gm"),
        "A"
    ).replace(
        new RegExp("错", "gm"),
        "B"
    );

    for (i = 0; i < answer.length; i++) {
        if (i < (answer.length - 1)) {
            strings = strings + (answer.charCodeAt(i) - 64) + "||"
        } else {
            strings = strings + (answer.charCodeAt(i) - 64)
        }

    }

    return strings;
}

let questionsFilter = (dom, answers, i = 0, strings = "") => {
    question = dom.innerHTML.replace(
        new RegExp(",", "gm"),
        ","
    ).replace(
        new RegExp("\n", "gm"),
        ""
    ).replace(
        new RegExp("http://", "gm"),
        "https://"
    );
    answer = answers.innerText.replace("正确答案: ", "").replace(
        new RegExp(",", "gm"),
        ","
    ).replace(
        new RegExp(" ", "gm"),
        ""
    ).replace(
        new RegExp("对", "gm"),
        "A"
    ).replace(
        new RegExp("错", "gm"),
        "B"
    );

    for (i = 0; i < answer.length; i++) {
        strings = strings + "{{c" + (i+ 1) + "::}}"

    }

    return question + strings;
}

let getData = (i, data = []) => {
    let questions, selections, answers, notes;
    if (document.getElementsByClassName("mark_name").length > 0) {
        questions = document.getElementsByClassName("mark_name");
        selections = document.getElementsByClassName("mark_letter");
        answers = document.getElementsByClassName("colorGreen");
    } else {
        questions = document.getElementsByClassName("topic-title");
        selections = document.getElementsByClassName("topic-options");
        answers = document.getElementsByClassName("color-green");

    }

    for (i = 0; i < questions.length; i++) {
        data.push({
            id: String(new Date().getTime()) + String(Math.floor(Math.random() * 100000)),
            question: questionsFilter(questions[i], answers[i]),
            options: optionsFilter(selections[i]),
            answer: answersFilter(answers[i]),
        })
    }
    console.log(data)
    return data;
}

(function () {
    css();
    if (document.getElementsByClassName("mark_name").length > 0) {
        generateTextArea(JSON.stringify(getData()));
        saveFile(ConvertToCSV(JSON.stringify(getData())));
    } else {
        setTimeout(() => {
            generateTextArea(JSON.stringify(getData()));
            saveFile(ConvertToCSV(JSON.stringify(getData())));
        }, 1000)
    }
})();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址