SIT上应大教务 - 生成json文件

通过对课表页面进行解析,生成一个json文件,随后即可将此json文件导入到小应生活中以查看课程表

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         SIT上应大教务 -  生成json文件
// @namespace    http://tampermonkey.net/
// @version      1.0.1
// @description  通过对课表页面进行解析,生成一个json文件,随后即可将此json文件导入到小应生活中以查看课程表
// @author       洛狼狼
// @license      MIT
// @match      *://jwxt.sit.edu.cn/*
// @match      *://jwxt.sit.edu.cn/jwglxt/*
// @run-at       document-start
// ==/UserScript==

var ClassScheduleToJSONURL = "kbcx/xskbcx_cxXskbcxIndex.html"; // 学生课表查询页面

var setTimeout_ = 3000;
(function () {
    'use strict';
    console.log("Loading...");
    unsafeWindow.addEventListener("load", main);

})();

function main() {
    var windowURL = window.location.href;
    if (windowURL.indexOf(ClassScheduleToJSONURL) != -1) {
        ClassScheduleToJSON();
    }
}

function ClassScheduleToJSON() {
    // 在课表上方创建一个点击按钮
    // --------------------------------------------------------------------------
    // unsafeWindow.addEventListener ("load", pageFullyLoaded);
    pageFullyLoaded();
    //加载完成后运行
    function pageFullyLoaded() {
        console.log("Get timetable page ...");
        let div = document.getElementsByClassName("btn-toolbar pull-right")[0];
        let btn = document.createElement("button");
        btn.className = "btn btn-default";
        btn.id = "exportbtn";
        let sp = document.createElement("span");
        sp.innerText = "下载课程表文件";
        sp.className = "bigger-120 glyphicon glyphicon-file";
        btn.append(sp);
        div.appendChild(btn);

        btn.onclick = function () {
            let xnm = document.getElementById("xnm").value;
            let xqm = document.getElementById("xqm").value;
            generateJson(xnm, xqm);
        }
    }

    // 默认超时时间是5秒
    function timeoutFetch(timeout = 5000) {
        return (url, option = {}) => {
            const controller = new AbortController()
            option.signal = controller.signal
            // 设置一个定时器,超时后调用abort方法结束当前请求
            const tid = setTimeout(() => {
                console.error(`Fetch timeout: ${url}`)
                controller.abort('timeout')
            }, timeout)
            return fetch(url, option).finally(() => {
                clearTimeout(tid) // 得到请求结果后,要清除定时器
            })
        }
    }
  

    function saveData(e, t) {
        var a = document.createElement("a");
        document.body.appendChild(a), a.style = "display: none";
        var n = JSON.stringify(e),
            c = new Blob([n], { type: "octet/stream" }),
            d = window.URL.createObjectURL(c);
        a.href = d, a.download = t, a.click(), window.URL.revokeObjectURL(d);
        alert("json文件已生成,可将该生成的文件导入到小应生活中,即可查看课程表");
    }

    function generateJson(xnm, xqm) {
        (async () => {
            let e = new FormData;
            e.append("xnm", xnm), e.append("xqm", xqm);
            try {
                let t = await timeoutFetch()("http://jwxt.sit.edu.cn/jwglxt/kbcx/xskbcx_cxXsgrkb.html?gnmkdm=N253508", { method: "POST", body: e }), a = await t.json();
                console.log(a), a && saveData(a, "Timetable.json")
            } catch (e) {
                console.error(e)
                alert("下载失败,可能是服务器连接超时或其他错误,请刷新或稍后再试");
            }
        })();
    }
}