JUST EVO

Patches & tools for JUST Website

目前为 2021-12-03 提交的版本。查看 最新版本

// ==UserScript==
// @name        JUST EVO
// @description Patches & tools for JUST Website
// @namespace   https://greasyfork.org/users/197529
// @version     0.1.10
// @author      kkocdko
// @license     Unlicense
// @match       *://*.just.edu.cn/*
// @match       *://*.just.edu.cn:8080/*
// @match       *://*.just.edu.cn:80/*
// @match       *://10.250.255.34/*
// @match       *://10.250.255.34/authentication/*
// ==/UserScript==
"use strict";

const { addFloatButton, waitValue, saveStr } = {
  addFloatButton(text, onClick) /* 20200707-1237 */ {
    if (!document.addFloatButton) {
      const container = document.body
        .appendChild(document.createElement("div"))
        .attachShadow({ mode: "open" });
      container.innerHTML =
        "<style>:host{position:fixed;top:3px;left:3px;z-index:2147483647;height:0}#i{display:none}*{float:left;margin:4px;padding:1em;outline:0;border:0;border-radius:5px;background:#1e88e5;box-shadow:0 1px 4px rgba(0,0,0,.1);color:#fff;font-size:14px;line-height:0;transition:.3s}:active{background:#42a5f5;box-shadow:0 2px 5px rgba(0,0,0,.2)}button:active{transition:0s}:checked~button{visibility:hidden;opacity:0;transform:translateY(-3em)}label{border-radius:50%}:checked~label{opacity:.3;transform:translateY(3em)}</style><input id=i type=checkbox><label for=i></label>";
      document.addFloatButton = (text, onClick) => {
        const button = document.createElement("button");
        button.textContent = text;
        button.addEventListener("click", onClick);
        return container.appendChild(button);
      };
    }
    return document.addFloatButton(text, onClick);
  },
  waitValue(fn, interval = 200, timeout = 3000) /* 20210928-1143 */ {
    return new Promise((resolve, reject) => {
      const intervalHandle = setInterval(() => {
        try {
          const value = fn();
          if (!value) return;
          clearInterval(intervalHandle);
          clearTimeout(timeoutHandle);
          resolve(value);
        } catch {}
      }, interval);
      const timeoutHandle = setTimeout(() => {
        clearInterval(intervalHandle);
        reject();
      }, timeout);
    });
  },
  saveStr(name, str) /* 20211203-1130 */ {
    const el = document.createElement("a");
    el.download = name;
    el.href = URL.createObjectURL(new Blob([str]));
    el.click();
  },
};

// Auto login
waitValue(() => document.querySelector(".login_btn")).then((e) => e.click());

// Fix JUST P.E.
waitValue(() => leftFrame.document.readyState === "complete").then(() =>
  leftFrame.document.querySelectorAll("[onclick]").forEach((el) => {
    const v = el.getAttribute("onclick").replace("href(", "href=(");
    el.setAttribute("onclick", v);
  })
);

// Health clock in
waitValue(() => input_zwtw).then(() =>
  addFloatButton("Clock in", () => {
    input_tw.value = input_zwtw.value = 36;
    post.click();
  })
);

// Shedule dump
waitValue(() => kbtable).then((el) =>
  addFloatButton("Dump schedule", () =>
    saveStr(
      `schedule_${zc.value}_${Date.now()}.html`,
      `<!DOCTYPE html><meta name="viewport" content="width=device-width">` +
        el.outerHTML
    )
  )
);

// Fix `window.showModalDialog` for book purchase page
(this.unsafeWindow || self).showModalDialog = async (url, args, opt = "") => {
  // Thanks for github.com/niutech/showModalDialog
  const dialog = document.body.appendChild(document.createElement("dialog"));
  dialog.style = `padding:0;${opt.replace(/dialog/gi, "")}`;
  const iframe = dialog.appendChild(document.createElement("iframe"));
  iframe.style = "width:100%;height:100%;border:0";
  iframe.src = url;
  dialog.showModal();
  await new Promise((r) => (iframe.onload = r));
  iframe.contentWindow.close = dialog.remove;
  iframe.contentWindow.dialogArguments = args;
};

// Free WLAN?
// (this.unsafeWindow || self).XMLHttpRequest = new Proxy(XMLHttpRequest, {
//   construct: (T, args) => {
//     const ret = new T(...args);
//     let inner = null;
//     Object.defineProperty(ret, "onreadystatechange", {
//       value(...args) {
//         if (
//           ret.readyState == 4 &&
//           ret.responseURL === "http://10.250.255.34/api/v1/login"
//         ) {
//         }
//         if (inner) inner(...args);
//       },
//       set: (n) => (inner = n),
//     });
//     return ret;
//   },
// });
// if (property == "responseText") {
//   if (target.responseURL === "http://10.250.255.34/api/v1/login") {
//     const json = JSON.parse(target.responseText);
//     if (json?.data?.policy?.pagenumb === "mondaypage") {
//       json.data.policy.channels.push({ name: "XSWK", id: "1" });
//       target.responseText = JSON.stringify(json);
//     }
//     let b = target.responseText;
//     let a = {
//       code: 200,
//       message: "ok",
//       data: {
//         reauth: true,
//         policy: {
//           pagenumb: "mondaypage",
//           channels: [
//             { name: "中国移动", id: "2" },
//             { name: "中国电信", id: "3" },
//             { name: "中国联通", id: "4" },
//           ],
//         },
//       },
//     };
//   }
// }

/*
Useful addresses

http://ids2.just.edu.cn/cas/logout
http://jwgl.just.edu.cn:8080/jsxsd/framework/xsMain.jsp
https://client.v.just.edu.cn/http/webvpn764a2e4853ae5e537560ba711c0f46bd/_s2/students_sy/main.psp

http://hqgy.just.edu.cn
http://hqgy.just.edu.cn/sg/wechat/index.jsp

http://tyxy.just.edu.cn/

http://my.just.edu.cn/
*/