// ==UserScript== // @name 更好用的NXU // @namespace http://tampermonkey.net/ // @version 0.0.6 // @description 让NXU更好用! // @author H // @license Apache Licence // @match https://webvpn.nxu.edu.cn/* // @match https://jwgl.nxu.edu.cn/* // @grant unsafeWindow // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_listValues // @grant GM_getResourceText // @grant GM_getResourceURL // @grant window.close // @require https://cdn.jsdelivr.net/npm/tesseract.js@4/dist/tesseract.min.js // @require https://greasyfork.org/scripts/469717-nxu%E5%82%A8%E5%AD%98%E5%BA%93/code/NXU%E5%82%A8%E5%AD%98%E5%BA%93.js?version=1212570 // @connect webvpn.nxu.edu.cn/* // @resource svg-logo https://cdn.bootcdn.net/ajax/libs/font-awesome/6.2.1/css/all.min.css // @noframes // @downloadURL none // ==/UserScript== //==需要调用的函数== //关闭窗口 function closeWindow() { try { window.opener = window; var win = window.open("", "_self"); win.close(); top.close(); } catch (error) { console.log("关闭窗口:失败\n错误信息:"+error); } } //随机数 function random(min, max){ return parseInt(Math.random()*(max-min+1)+min,10); } //等待执行 function justWait(min, max, log = true){ var waitmsg,waittime; if (max == 0) { waittime = min; waitmsg = "==等待了:"+(waittime / 1000)+" 秒=="; } else { waittime = random(min, max); waitmsg = "==随机等待了:"+(waittime / 1000)+" 秒=="; } return new Promise(function (resolve, reject) { setTimeout(function () { if (log) { console.log(waitmsg); } resolve(); }, waittime); }); } //toast输出 function createToast(id, mes, time = 5) { const notifications = document.querySelector('.notifications'); const toastDetails = { success:{ icon: 'fa-circle-check', text: 'Success: This is a success toast.' }, error:{ icon: 'fa-circle-xmark', text: 'Error: This is a error toast.' }, warning:{ icon: 'fa-circle-exclamation', text: 'Warning: This is a warning toast.' }, info:{ icon: 'fa-circle-info', text: 'Info: This is a info toast.' } }; if (document.querySelector("style.i"+time.toString().replace(".", "\\."))){ document.querySelector("style.i"+time.toString().replace(".", "\\.")).innerHTML = ".toast.i"+time+"::before{animation-duration: "+time+"s;}"; } else { var style = document.createElement("style"); style.className = "i"+time; style.innerHTML = ".toast.i"+time+"::before{animation-duration: "+time+"s;}"; document.getElementsByTagName("head")[0].appendChild(style); } // console.log(id) const {icon, text} = toastDetails[id]; let txt; if (mes == "" || mes == null || typeof(mes) == "undefined"){ txt = text; } else { txt = mes; } const toast = document.createElement('li') // 创建li元素 toast.setAttribute("time", time); toast.setAttribute("style", "::before{animation-duration: "+time+"}") toast.className = `toast ${id} i${time}` // 为li元素新增样式 toast.innerHTML = `
${txt}
` notifications.appendChild(toast) // 添加元素到 notifications ul // 隐藏toast if (time != 0){ toast.timeoutId = setTimeout(()=> removeToast(toast), time * 1000); } } //toast移除 function removeToast(toast) { toast.classList.add('hide') if( toast.timeoutId) clearTimeout(toast.timeoutId) // 清楚setTimeout // 移除li元素 setTimeout(() => { toast.remove() },500) } //创建XHR function createXHR() { var xmlHttp; try { // Firefox, Opera 8.0+, Safari xmlHttp = new XMLHttpRequest(); } catch (e) { // Internet Explorer try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) { console.log("您的浏览器不支持AJAX!"); return false; } } } return xmlHttp; } function titleChange(dom) { //console.log("更改视图...") if (dom.id == "plugin-settings") { //document.querySelector(".anchor__item.is-active").classList.remove("is-active"); //dom.classList.add("is-active"); //var scrollableDiv = document.querySelector("div.portal-content__block").querySelector(".el-scrollbar__view"); //var contentDiv = document.querySelector("div#plugin-settings-content"); //document.querySelector("div#plugin-settings-content").scrollIntoView({ behavior: 'auto', inline: 'center' }); let div = document.querySelector("div#plugin-settings-content"); let div_parent = document.querySelector("div.portal-content__block").querySelector(".el-scrollbar__wrap"); document.querySelector("div.portal-content__block").querySelector(".el-scrollbar__wrap").scrollBy(0, div.getBoundingClientRect().top - div_parent.getBoundingClientRect().top) } else { //dom.classList.add("is-active"); //document.querySelector("div.anchor__item#plugin-settings").classList.remove("is-active"); } } //绑定 unsafeWindow.createToast = createToast; unsafeWindow.removeToast = removeToast; unsafeWindow.window.close = window.close; unsafeWindow.titleChange = titleChange; //==/需要调用的函数== //==预关闭== if (!document.querySelector("title")){ if (GM_getValue("auto-close")) { window.close(); } else { return; } } //==/预关闭== //==常量== const url = window.location.href; const type = document.querySelector("title").innerHTML; const load_message = {"loading tesseract core":"核心加载","initializing tesseract":"初始化","loading language traineddata":"加载语言训练数据","initializing api":"初始化接口","recognizing text":"识别验证码"}; //==/常量== //==开始== console.log("插件运行..."); //添加css样式 GM_addStyle(css_content); GM_addStyle(GM_getResourceText("svg-logo").replace(/\.\.\/webfonts/g, "https://cdn.bootcdn.net/ajax/libs/font-awesome/6.2.1/webfonts")); //插入toast列表 var ul = document.createElement("ul"); ul.className = "notifications"; document.getElementsByTagName("body")[0].appendChild(ul); //createToast("success", "测试消息", 0); //自动关闭处理 if ((document.querySelector("body").innerHTML.indexOf("啊呀,服务器开小差了。3秒后自动返回上一页") != -1) || (document.querySelector("body").innerHTML.indexOf("出错啦!该网站无法访问!") != -1) || (url.indexOf("/login.action") != -1 && url != "https://jwgl.nxu.edu.cn/login.action")){ if (GM_getValue("auto-close")) { window.close(); } else { return; } } else if (url.indexOf("/index.action?wrdrecordvisit") != -1) { if (type == "宁夏大学教务管理信息系统") { let div = document.createElement("div"); div.setAttribute("style", "z-index: 9999;padding: 2em 3em;white-space: nowrap;;font-size: 16px;position: fixed;top: 50%;left: 50%;transform: translate(-50%,-50%);border-radius: 10px;border: 1px white solid;background: #49d3ef;background: -webkit-linear-gradient(to left, #49d3ef, #016ba9);background: linear-gradient(to right bottom, #49d3ef, #016ba9);display: flex;flex-direction: column;align-items: center;color: white;justify-content: center;"); div.innerHTML = jwgl_error; document.querySelector("body").appendChild(div); GM_addElement(document.querySelector("div#control-button"), "button", {textContent: '立即跳转', onclick: "location.href = 'https\:\/\/jwgl.nxu.edu.cn'", style: "height: auto;margin: 0.5em 1em;padding: 0.5em 1em;border: 1px white solid;border-radius: 4px;font-weight: bold;color: white;background:#2193b0;background: -webkit-linear-gradient(to right bottom, #6dd5ed, #2193b0);background: linear-gradient(to right bottom, #6dd5ed, #2193b0);"}); } } //网页判断 if (url == "https://jwgl.nxu.edu.cn/index.action" || url == "https://jwgl.nxu.edu.cn/login.action" ) { console.log("检测到教务系统登录页面"); //自动登录 if (!GM_getValue("auto-login") || GM_getValue("username") == undefined || GM_getValue("username") == "" || GM_getValue("username") == null || GM_getValue("password") == undefined || GM_getValue("password") == "" || GM_getValue("password") == null) { return; } createToast("info", "自动登录...", 5); //自动识别验证码 Tesseract.recognize( 'https://jwgl.nxu.edu.cn/captcha/image.action', 'eng', { logger: m => load_message[m.status] ? (createToast("info", load_message[m.status], 1)) : (null) } ).then(({ data: { text } }) => { jwglLogin(text); }) } else if (url.indexOf("https-443") != -1) { if (document.getElementsByTagName("h1")[0] && document.getElementsByTagName("h1")[0].innerHTML) { if (document.getElementsByTagName("h1")[0].innerHTML == 'An error occurred.') { console.log("检测到服务器错误页面"); if (GM_getValue("auto-close")) { window.close(); } else { return; } } } else if (type == "宁夏大学教务管理信息系统"){ console.log("检测到宁夏大学教务管理信息系统页面"); console.log("等待800ms"); if (document.getElementsByName("loginForm.name")[0]) { if (GM_getValue("auto-close")) { window.close(); } return; } //成功进入,监听课表页面 isIframeChange(); } } else if (url.indexOf("login") != -1){ console.log("疑似登录页面,确认中..."); if (document.querySelector("title").innerHTML.indexOf("503 Service Temporarily Unavailable") != -1) { location.reload(); } if (!document.querySelector(".auth_tab")) { return; } console.log("登录页面"); if (GM_getValue("username") == undefined || GM_getValue("username") == "" || GM_getValue("username") == null || GM_getValue("password") == undefined || GM_getValue("password") == "" || GM_getValue("password") == null) { return; } //自动登录 if (GM_getValue("auto-login")) { console.log("自动登录..."); createToast("info", "自动登录...", 5); if (document.querySelector("#msg.auth_error")) { createToast("error", "输入的学号密码有误", 5); return; } document.querySelector("input#username").value = GM_getValue("username"); document.querySelector("input#password").value = GM_getValue("password"); document.querySelector("button.auth_login_btn").click(); } else { return; } } else if (url == "https://webvpn.nxu.edu.cn/" || url == "https://webvpn.nxu.edu.cn"){ console.log("资源访问控制系统首页"); resourceIndex(); } async function jwglLogin(text) { document.getElementsByName("loginForm.captcha")[0].onfocus(); //document.querySelector("input#textfield.loginput").value = ""; //document.querySelector("input#textfield2.loginput").value = ""; document.querySelector("input#textfield.loginput").value = GM_getValue("username"); document.querySelector("input#textfield2.loginput").value = GM_getValue("password"); document.querySelector("input#textfield3.loginput").value = text; document.querySelector("input#submitButton").click(); } async function resourceIndex() { //等待标签加载完毕 while(true) { if (document.querySelector("div.el-scrollbar__view") && document.querySelector("div.el-scrollbar__view").innerHTML) { break; } await justWait(100, 0); } var div_title = document.querySelector("div.el-scrollbar__view"); var div_setting_title = document.createElement("div"); div_setting_title.innerHTML = "插件设置"; div_setting_title.classList.add("anchor__item"); div_setting_title.id = "plugin-settings"; div_title.appendChild(div_setting_title); var div_settings = document.createElement("div"); div_settings.innerHTML = settings_div; div_settings.id = "plugin-settings-content"; document.querySelector("div.portal-content__block").querySelector(".el-scrollbar__view").appendChild(div_settings); var div_option = document.querySelectorAll("div.anchor__item"); for (let i = 0; i < div_option.length; i++) { div_option[i].setAttribute("onclick", "titleChange(this)"); } document.querySelector("div.portal-content__block").querySelector(".el-scrollbar__wrap").onscroll = () => { let div = document.querySelector("div#plugin-settings-content"); let div_parent = document.querySelector("div.portal-content__block").querySelector(".el-scrollbar__wrap"); if (div.getBoundingClientRect().top <= div_parent.getBoundingClientRect().top) { document.querySelector("div.anchor__item#plugin-settings").classList.add("is-active"); } else { document.querySelector("div.anchor__item#plugin-settings").classList.remove("is-active"); } } var button = document.querySelector("#reflash-user-info"); var input_username = document.querySelector("input#username"); var input_password = document.querySelector("input#password"); if (GM_getValue("username") == undefined || GM_getValue("username") == "" || GM_getValue("username") == null || GM_getValue("password") == undefined || GM_getValue("password") == "" || GM_getValue("password") == null) { input_username.value = ""; input_password.value = ""; } else { input_username.value = GM_getValue("username"); input_password.value = GM_getValue("password"); } reflashUserInfoCheck() try { // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本 button.addEventListener("click", function(){ reflashUserInfo(); }, false); input_username.addEventListener("input", function(){ reflashUserInfoCheck(); }, false); input_password.addEventListener("input", function(){ reflashUserInfoCheck(); }, false); } catch (error) { try { // IE8.0及其以下版本 button.attachEvent("onclick", function(){ reflashUserInfo(); }, false); input_username.addEventListener("oninput", function(){ reflashUserInfoCheck(); }, false); input_password.addEventListener("oninput", function(){ reflashUserInfoCheck(); }, false); } catch (error) { // 早期浏览器 alert("错误: 按钮绑定事件失败\n很抱歉,该脚本并不适合您的浏览器\n请尝试安装最新版Edge、Chrome、FireFox、Opera、Safari或其他浏览器后获得支持"); return; } } var input_switch_total = document.querySelectorAll("label.switch"); for (let i = 0; i < input_switch_total.length; i++) { var input_switch = input_switch_total[i].querySelector("input"); input_switch.checked = GM_getValue(input_switch.id); try { // Chrome、FireFox、Opera、Safari、IE9.0及其以上版本 input_switch.addEventListener("input", function(){ switchHandle(this); }, false); } catch (error) { try { // IE8.0及其以下版本 input_switch.addEventListener("oninput", function(input_switch){ switchHandle(this); }, false); } catch (error) { // 早期浏览器 alert("错误: 按钮绑定事件失败\n很抱歉,该脚本并不适合您的浏览器\n请尝试安装最新版Edge、Chrome、FireFox、Opera、Safari或其他浏览器后获得支持"); return; } } } } function reflashUserInfo() { var warning = document.querySelectorAll("p.warning"); for (let i = 0; i < warning.length; i++) { warning[i].style.display = "none"; } var username = document.querySelector("input#username").value; var password = document.querySelector("input#password").value; //console.log(username); var pass = true; if (username == null || username == "") { document.querySelector("p.warning#username-empty").style.display = "block"; pass = false; } else if (!/^1\d{9}\d$/.test(username)) { console.log(username); document.querySelector("p.warning#username-error").style.display = "block"; pass = false; } if (password == null || password == "") { document.querySelector("p.warning#password-empty").style.display = "block"; } if (pass) { //console.log("pass"); GM_setValue("username", username); GM_setValue("password", password); createToast("success", "账号设置成功!", 2); document.querySelector("#reflash-user-info").disabled = true; } } function reflashUserInfoCheck() { var username = document.querySelector("input#username").value; var password = document.querySelector("input#password").value; if (GM_getValue("username") == undefined || GM_getValue("username") == "" || GM_getValue("username") == null || GM_getValue("password") == undefined || GM_getValue("password") == "" || GM_getValue("password") == null) { return; } //console.log(username) //console.log(password) if (username == GM_getValue("username") && password == GM_getValue("password")) { document.querySelector("#reflash-user-info").disabled = true; } else { document.querySelector("#reflash-user-info").disabled = false; } } function switchHandle(input) { GM_setValue(input.id, input.checked); var message = input.parentNode.parentNode.querySelector("p").innerHTML; if (input.checked) { message += "    开"; } else { message += "    关"; } createToast("info", message, 2); } function isIframeChange() { var elemIfram = document.querySelector("iframe#main"); if (window.MutationObserver || window.webkitMutationObserver) { // chrome var callback = function(mutations) { mutations.forEach(function() { iframeChange(); }); }; var observer if (window.MutationObserver) { observer = new MutationObserver(callback); } else { observer = new webkitMutationObserver(callback); } observer.observe(elemIfram, { subtree: true, attributes: true, attributeOldValue: true }); } else if (elemIfram.addEventListener) { // Firefox, Opera and Safari elemIfram.addEventListener("DOMAttrModified", function(){iframeChange();}, false); } else if (elemIfram.attachEvent) { // Internet Explorer elemIfram.attachEvent("onpropertychange", function(){iframeChange();}); } } function iframeChange() { console.log("111"); } async function needLogin() { GM_xmlhttpRequest({ method: "GET", url: "https://webvpn.nxu.edu.cn/", onload: function(response) { console.log(response); } }); await justWait(1000 * 60 * 10, 0); } document.onvisibilitychange = ()=>{console.log(document.visibilityState)}