JUST Kit

用于江苏科技大学网站的补丁与工具。

目前为 2022-04-18 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name JUST Kit
  3. // @description Patches & tools for JUST Website.
  4. // @description:zh-CN 用于江苏科技大学网站的补丁与工具。
  5. // @namespace https://greasyfork.org/users/197529
  6. // @version 0.1.56
  7. // @author kkocdko
  8. // @license Unlicense
  9. // @match *://*.just.edu.cn/*
  10. // @match *://*.just.edu.cn:8080/*
  11. // @match *://10.250.255.34/*
  12. // @match *://202.195.195.198/*
  13. // @match *://202.195.206.36:8080/*
  14. // @match *://202.195.206.37:8080/*
  15. // ==/UserScript==
  16. "use strict";
  17.  
  18. const { addFloatButton, saveStr } = {
  19. addFloatButton(text, onclick) /* 20220324-0950 */ {
  20. if (!document.addFloatButton) {
  21. const host = document.body.appendChild(document.createElement("div"));
  22. const root = host.attachShadow({ mode: "open" });
  23. root.innerHTML = `<style>:host{position:fixed;top:4px;left:4px;z-index:2147483647;height:0}#i{display:none}*{float:left;padding:1em;margin:4px;line-height:0;color:#fff;user-select:none;background:#28e;border:1px solid #fffa;border-radius:8px;transition:.3s}[for]~:active{background:#4af;transition:0s}:checked~*{opacity:.3;transform:translateY(-3em)}:checked+*{transform:translateY(3em)}</style><input id=i type=checkbox><label for=i>`;
  24. document.addFloatButton = (text, onclick) => {
  25. const el = document.createElement("label");
  26. el.textContent = text;
  27. el.addEventListener("click", onclick);
  28. return root.appendChild(el);
  29. };
  30. }
  31. return document.addFloatButton(text, onclick);
  32. },
  33. saveStr(name, str) /* 20211203-1130 */ {
  34. const el = document.createElement("a");
  35. el.download = name;
  36. el.href = URL.createObjectURL(new Blob([str]));
  37. el.click();
  38. },
  39. };
  40.  
  41. const urlMatch = /* match url prefix, supports webvpn */ ([s]) =>
  42. location.href.includes(s);
  43.  
  44. // Styles
  45. document.lastChild.appendChild(document.createElement("style")).textContent = `
  46. input.button { background-color: #07e; }
  47. .iradio_square-green.checked { box-shadow: inset 0 0 4px; border-radius: 50%; }
  48. `.replace(/;/g, "!important;");
  49.  
  50. // Force page to scroll on x axis
  51. if (
  52. top === self &&
  53. (urlMatch`/_s2/students_` || urlMatch`/TeachingCenterStudentWeb`)
  54. ) {
  55. document.documentElement.style.cssText +=
  56. ";min-width: 1280px !important; overflow-x: auto !important;";
  57. }
  58.  
  59. // Auto login
  60. if (urlMatch`/cas/login`) {
  61. setInterval(() => {
  62. if (!rememberPassword.checked) return;
  63. const el = document.querySelector(".login_btn");
  64. el.click();
  65. el.click = () => {};
  66. }, 100);
  67. }
  68.  
  69. // Fix P.E. page left panel
  70. if (urlMatch`/menu.asp?menu`) {
  71. setTimeout(() => {
  72. for (const el of document.querySelectorAll("[onclick]")) {
  73. const v = el.getAttribute("onclick").replace("href(", "href=(");
  74. el.setAttribute("onclick", v);
  75. }
  76. }, 900);
  77. }
  78.  
  79. // Health clock in (old)
  80. if (urlMatch`/default/work/jkd/jkxxtb/jkxxcj.jsp`) {
  81. addFloatButton("Clock in", () => {
  82. input_tw.value = input_zwtw.value = 36;
  83. post.click();
  84. });
  85. }
  86.  
  87. // Health clock in
  88. if (urlMatch`#/dform/genericForm/zGO2n4p7`) {
  89. const key = "just-kit-clock-in-location";
  90. addFloatButton("Clock in", () => {
  91. if (!localStorage[key]) return alert("please set the location first");
  92. // github.com/facebook/react/issues/11488#issuecomment-347775628
  93. const el = document.querySelector("input[placeholder$=定位]");
  94. el.value = localStorage[key];
  95. el._valueTracker.setValue("");
  96. el.dispatchEvent(new Event("input", { bubbles: true }));
  97. setTimeout(() => document.querySelector("form+*>*").click());
  98. });
  99. addFloatButton("Set location", () => {
  100. const value = prompt("", localStorage[key] || "");
  101. if (value) localStorage[key] = value;
  102. });
  103. }
  104.  
  105. // Schedule dump
  106. if (urlMatch`/jsxsd/xskb/xskb_list.do`) {
  107. addFloatButton("Dump schedule", () => {
  108. const date = Date.now().toString(36).slice(0, -2);
  109. const name = `schedule_${zc.value || 0}_${date}.html`;
  110. const prefix = `<!DOCTYPE html><meta charset="utf-8"><meta name="viewport" content="width=device-width"><style>body{margin:2px -1px;font-family:sans-serif}table{border:0}</style>`;
  111. const content = prefix + kbtable.outerHTML;
  112. document.documentElement.innerHTML = content;
  113. document.title = name;
  114. saveStr(name, content);
  115. });
  116. }
  117.  
  118. // Teaching evaluation
  119. if (urlMatch`/jsxsd/xspj/xspj_edit.do`) {
  120. addFloatButton("Fill form", () => {
  121. for (const el of document.querySelectorAll("[type=radio]:first-child"))
  122. el.click();
  123. document.querySelector("[type=radio]:not(:first-child)").click();
  124. });
  125. }
  126.  
  127. // Fix `window.showModalDialog`
  128. (this.unsafeWindow || this).showModalDialog = (url) => open(url);
  129.  
  130. // GPA Estimation
  131. // github.com/mikai233/fstar-client/blob/e387e2948f158968e01d0497375ef60faccc589e/lib/utils/utils.dart
  132. // if (location.pathname.endsWith("/cjcx_list")) {
  133. // addFloatButton("Estimate GPA", () => {});
  134. // }
  135.  
  136. // Free WLAN?
  137. // (this.unsafeWindow || self).XMLHttpRequest = new Proxy(XMLHttpRequest, {
  138. // construct: (T, args) => {
  139. // const ret = new T(...args);
  140. // let inner = null;
  141. // Object.defineProperty(ret, "onreadystatechange", {
  142. // value(...args) {
  143. // if (ret.readyState == 4 &&ret.responseURL === "http://10.250.255.34/api/v1/login") {}
  144. // if (inner) inner(...args);
  145. // },
  146. // set: (n) => (inner = n),
  147. // });
  148. // return ret;
  149. // },
  150. // });
  151. // if (property == "responseText" && target.responseURL === "http://10.250.255.34/api/v1/login") {
  152. // const json = JSON.parse(target.responseText);
  153. // if (json?.data?.policy?.pagenumb === "mondaypage") {
  154. // json.data.policy.channels.push({ name: "XSWK", id: "1" });
  155. // target.responseText = JSON.stringify(json);
  156. // }
  157. // let b = target.responseText;
  158. // let a = `{"code":200,"message":"ok","data":{"reauth":true,"policy":{"pagenumb":"mondaypage","channels":[{"name":"中国移动","id":"2"},{"name":"中国电信","id":"3"},{"name":"中国联通","id":"4"}]}}}`;
  159. // }
  160.  
  161. // http://www.gaoxiaokaoshi.com/Study/LibraryStudyList.aspx
  162. // const grid=document.body.appendChild(document.createElement('parallel-grid'))
  163. // grid.style="display:grid;grid:1fr 1fr 1fr 1fr/ 1fr 1fr 1fr;width:100vw;height:100vh"
  164. // showframe=(p_Name, p_Id)=>{grid.appendChild(document.createElement('iframe')).src="../Study/LibraryStudy.aspx?tmp=1&Id=" + p_Id + "&PlanId=" + ddlClass.value}
  165.  
  166. /* ===== Notes ===== *
  167.  
  168. 个人主页: my.just.edu.cn
  169. VPN2反代: vpn2.just.edu.cn
  170. 360SO VPN2: client.v.just.edu.cn/https/webvpnb153e15136e234229309c84507966ea4
  171. 教务管理: jwgl.just.edu.cn:8080/jsxsd/
  172. 教务管理(单点登录): jwgl.just.edu.cn:8080/sso.jsp
  173. 教务管理(内网1): 202.195.206.36:8080/jsxsd
  174. 教务管理(内网2): 202.195.206.37:8080/jsxsd
  175. 后勤管理: hqgy.just.edu.cn/sg/wechat/index.jsp
  176. 查寝得分: hqgy.just.edu.cn/sg/wechat/healthCheck.jsp
  177. 健康打卡(旧): ehall.just.edu.cn/default/work/jkd/jkxxtb/jkxxcj.jsp
  178. 健康打卡: dc.just.edu.cn/jkdk.html
  179. 体育: tyxy.just.edu.cn
  180. 网课: teach.just.edu.cn
  181. 实验课成绩: 202.195.195.198/sy/
  182. 退出登录: ids2.just.edu.cn/cas/logout
  183. 奇怪的管理界面: client.v.just.edu.cn/enlink/#/client/app
  184. 智慧树: portals.zhihuishu.com/just
  185. 超星: just.fanya.chaoxing.com
  186. 安全微伴: weiban.mycourse.cn/pharos/login/jskjdx/21200002/loginByJskjdx.do
  187. 国防教育: www.gaoxiaokaoshi.com
  188.  
  189. VPN2 使用笔记:
  190. 使用 `360SO via VPN2` 搜索要访问的网址。记得加上 `http / https` 前缀。
  191. 搜索结果页出现“找不到该 URL,可以直接访问 `http://x.x`”后点击直接访问链接即可。
  192. 遇“无效网关”等奇怪错误时,请检查协议前缀是否正确,如 http 可能误写为 https。
  193. 当前(20220110)VPN2 似乎不支持流式传输,因而下载大文件可能出错,记得校验 Hash。
  194.  
  195. /* ================= */