您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
@XiaoYingYo global_module
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/464780/1352660/global_module.js
class global_module { static UrlCache = {}; /** * * @param {*} selector 目标元素选择器 * @param {*} iframe 可选-iframe选择器 可以是字符串选择器或者元素 * @param {*} callback 可选-回调函数 * @param {*} time 可选-每次查询间隔时间 * @param {*} timeout 可选-超时时间 * @param {*} baseElement 可选-基础元素 可以是字符串选择器或者元素 * @returns */ static async waitForElement(selectors, iframe = null, callback = null, time = 100, timeout = 1000 * 30, baseElement = null, index = null, isWrapped = true, startTime = null) { if (time == null) { time = 100; } if (timeout == null) { timeout = 1000 * 30; } if (isWrapped == null) { isWrapped = true; } return new Promise(async (resolve) => { if (!startTime) { startTime = Date.now(); } let iframeElement, base, elements = []; if (typeof selectors === 'string') { selectors = [selectors]; } if (iframe) { try { iframeElement = iframe.getAttribute('id'); iframeElement = iframe; } catch (e) { if (typeof iframe === 'string') { iframeElement = await global_module.waitForElement(iframe); } else { iframeElement = iframe; } } if (!iframeElement) { resolve(null); return; } for (let selector of selectors) { let foundElements = isWrapped ? $(iframeElement).contents().find(selector) : iframeElement.contentDocument.querySelectorAll(selector); if (foundElements.length > 0) { elements = foundElements; break; } } } else if (baseElement) { try { base = baseElement.getAttribute('id'); base = baseElement; } catch (e) { if (typeof baseElement === 'string') { base = await global_module.waitForElement(baseElement); } else { base = baseElement; } } if (!base) { resolve(null); return; } for (let selector of selectors) { let foundElements = isWrapped ? base.find(selector) : base[0].querySelectorAll(selector); if (foundElements.length > 0) { elements = foundElements; break; } } } else { for (let selector of selectors) { let foundElements = null; try { foundElements = document.querySelectorAll(selector); } catch (e) { foundElements = $(selector); if (foundElements.length != 0) { foundElements = [foundElements.eq(0)[0]]; } } if (foundElements.length > 0) { elements = foundElements; break; } } } if (index != null) { elements = elements[index]; if (!elements) { resolve(null); return; } } if (elements.length > 0) { if (isWrapped) { elements = $(elements); } if (callback) { callback(elements); } resolve(elements); } else { if (timeout !== -1 && Date.now() - startTime >= timeout) { resolve(null); return; } setTimeout(async () => { resolve(await global_module.waitForElement(selectors, iframe, callback, time, timeout, baseElement, index, isWrapped, startTime)); }, time); } }); } static copyText(text) { let textarea = document.createElement('textarea'); textarea.value = text; document.body.appendChild(textarea); textarea.select(); document.execCommand('copy'); textarea.remove(); } static stripHtmlTags(html) { return html.replace(/<[^>]+>/g, ''); } static async Http(o) { return new Promise((resolve) => { if (typeof o === 'undefined' || typeof o !== 'object' || typeof o.url === 'undefined') { resolve(null); } if (typeof o.method === 'undefined') { o.method = 'GET'; } if (typeof o.headers === 'undefined') { o.headers = {}; } if (typeof o.data === 'undefined') { o.data = ''; } if (typeof o.timeout === 'undefined') { o.timeout = 10000; } let res = { code: 0, ret: null }; if (!GM_xmlhttpRequest) { let xhr = new XMLHttpRequest(); xhr.open(o.method, o.url, true); for (let i in o.headers) { xhr.setRequestHeader(i, o.headers[i]); } xhr.timeout = o.timeout; xhr.onload = function () { res.code = xhr.status; res.ret = xhr.response; resolve(res); }; xhr.onerror = function (err) { res.code = -1; res.ret = err; resolve(res); }; xhr.send(o.data); } else { GM_xmlhttpRequest({ method: o.method, url: o.url, headers: o.headers, data: o.data, timeout: o.timeout, onload: function (response) { res.code = response.status; res.ret = response; resolve(res); }, onerror: function (err) { res.code = -1; res.ret = err; resolve(res); } }); } }); } static async Ajax_Xhr(url, Way, data) { return new Promise(function (resolve) { let h = ['html', 'txt', 'json', 'xml', 'js', 'css']; if (global_module.UrlCache[url] == null) { if (h.indexOf(Way) == -1) { Way = 'GET'; } let xhr = new XMLHttpRequest(); xhr.open(Way, url, true); xhr.onreadystatechange = function () { if (xhr.readyState == 4 && xhr.status == 200) { let ret = xhr.responseText; let p = url; if (p.indexOf('?') != -1) p = p.substring(0, p.indexOf('?')); p = p.substring(p.lastIndexOf('.') + 1); if (h.indexOf(p) != -1) { global_module.UrlCache[url] = ret; } resolve(ret); return ret; } }; xhr.send(data); } else { resolve(global_module.UrlCache[url]); return global_module.UrlCache[url]; } }) .then(function (result) { return result; }) .catch(function (error) { console.log(error); }); } static decodeHtmlEntities(htmlString = '') { var tempElement = document.createElement('div'); tempElement.innerHTML = htmlString; return tempElement.textContent; } static GetUrlParm(href = null, name) { if (href == null) { href = location.href; } let parms = href.substring(href.indexOf('?') + 1); let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); let r = parms.match(reg); if (r != null) { return decodeURIComponent(r[2]); } return null; } static downloadSvgAsPng(svg, filename) { var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); var svgRect = svg.getBoundingClientRect(); var width = svgRect.width; var height = svgRect.height; canvas.width = width; canvas.height = height; var image = new Image(); var svgData = new XMLSerializer().serializeToString(svg); var svgUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svgData); image.onload = function () { context.drawImage(image, 0, 0, width, height); var link = document.createElement('a'); link.href = canvas.toDataURL('image/png'); link.download = filename; link.click(); canvas = null; }; image.src = svgUrl; } static SetUrlParm(href, name, value) { if (href == null || href == '') { href = location.href; } let index = href.indexOf('?'); if (index == -1) { href += '?' + name + '=' + value; } else { let parms = href.substring(href.indexOf('?') + 1); let reg = new RegExp('(^|&)' + name + '=([^&]*)(&|$)'); let r = parms.match(reg); if (r != null) { href = href.replace(r[0], r[0].replace(r[2], value)); } else { href += '&' + name + '=' + value; } } return href; } // 根据扩展名引入js或css static async LoadJsOrCss(url, scriptStr = '') { return new Promise(function (resolve) { if (Array.isArray(url)) { let count = 0; for (let i = 0; i < url.length; i++) { global_module.LoadJsOrCss(url[i]).then(() => { count++; if (count == url.length) { resolve(); } }); } return; } let p = url; let s = 0; if (p.indexOf('?') != -1) p = p.substring(0, p.indexOf('?')); p = p.substring(p.lastIndexOf('.') + 1); let t; if (p == 'js') { let script = document.createElement('script'); script.type = 'text/javascript'; script.id = url; if (scriptStr == '') { script.src = url; } else { script.innerHTML = scriptStr; s = 1; } t = script; } else if (p == 'css') { if (scriptStr == '') { let link = document.createElement('link'); link.href = url; link.type = 'text/css'; link.rel = 'stylesheet'; link.id = url; t = link; } else { let style = document.createElement('style'); style.type = 'text/css'; style.id = url; style.innerHTML = scriptStr; t = style; s = 1; } } if (t != null) { t.onload = function () { resolve(t); }; } else { resolve(null); } try { document.getElementsByTagName('head')[0].appendChild(t); } catch (e) { document.appendChild(t); } if (s != 0) { resolve(null); } }) .then(function (r) { return r; }) .catch(function (e) { console.log(e); }); } static RemoveJsOrCss(url) { $("[id='" + url + "']").remove(); } static IframeInjectScript(element, type = 'js', Str) { let Dom = $(element).contents().find('body'); if (type == 'js') { $(element)[0].contentWindow.window.eval(Str); } else if (type == 'css') { Dom.append('<style>' + Str + '</style>'); } } static async waitPageLoad() { return new Promise(function (resolve) { if (document.readyState == 'complete') { resolve(); } else { let S = setInterval(function () { if (document.readyState == 'complete') { clearInterval(S); resolve(); } }, 200); } }); } static HOOKFunction(fun, before, after) { if (typeof fun == 'string') { return 'HOOK的对象必须是函数'; } let old = fun; fun = function () { if (typeof before == 'function') { before(); } let result = old.apply(this, arguments); if (typeof after == 'function') { after(); } return result; }; return fun; } static getParentFolderPath(filePath) { var pathSeparator; if (filePath.indexOf('/') !== -1) { pathSeparator = '/'; } else if (filePath.indexOf('\\') !== -1) { pathSeparator = '\\'; } else if (filePath.indexOf('\\\\') !== -1) { pathSeparator = '\\\\'; } var parts = filePath.split(pathSeparator); parts.pop(); return parts.join(pathSeparator); } static RandomIP() { let ip = ''; for (let i = 0; i < 4; i++) { ip += Math.floor(Math.random() * 255) + '.'; } ip = ip.substring(0, ip.length - 1); return ip; } static RandomIPHeader() { let ip = this.RandomIP(); let header = { 'X-Forwarded-For': ip, 'X-Originating-IP': ip, 'X-Remote-Addr': ip, 'X-Remote-IP': ip }; return header; } static MoveElement(obj, GoToX, speed = 10, scope = null) { return new Promise(async (resolve) => { if (obj == null) { resolve(false); return; } if (obj.length > 0) obj = obj[0]; let event = document.createEvent('MouseEvents'); if (scope == null) { scope = window; } event.initMouseEvent('mousedown', true, true, scope, 0, 0, 0, 0, 0, false, false, false, false, 0, null); obj.dispatchEvent(event); let x = 0; let timer = setInterval(function () { x += 5; let event = document.createEvent('MouseEvents'); event.initMouseEvent('mousemove', true, true, scope, 0, 0, 0, x, 0, false, false, false, false, 0, null); obj.dispatchEvent(event); if (x >= GoToX) { clearInterval(timer); let event = document.createEvent('MouseEvents'); event.initMouseEvent('mouseup', true, true, scope, 0, 0, 0, 260, 0, false, false, false, false, 0, null); obj.dispatchEvent(event); resolve(true); } }, speed); }); } static clickElement(element) { if (element == null) return false; let Event = document.createEvent('MouseEvents'); Event.initEvent('click', true, true); element.dispatchEvent(Event); return true; } static simulateMouseEvent(mouseEvent, win, element, eventType) { if (!mouseEvent) { mouseEvent = MouseEvent; } if (!win) { win = window; } let eventName = ''; switch (eventType) { case 0: eventName = ['mouseover', 'mouseenter']; break; case 1: eventName = ['mouseout', 'mouseleave']; break; default: throw new Error('不支持的触发类型'); } for (let i = 0; i < eventName.length; i++) { element.dispatchEvent( new MouseEvent(eventName[i], { bubbles: true, cancelable: true, view: win }) ); } } static getLayerelement(layeri) { return $("div[id^='layui-layer" + layeri + "'][type][times='" + layeri + "']").eq(0); } static getLayerelementIframe(layeri) { return global_module.getLayerelement(layeri).find('iframe').eq(0); } static getLayerelementIframeBody(layeri) { return global_module.getLayerelementIframe(layeri).contents().find('body'); } static getLayerBtn(layeri, index) { return global_module.getLayerelement(layeri).find("a[class^='layui-layer-btn']").eq(index); } static setLayerImgPath(layeri, Path) { if (Path.substr(-1) != '/' && Path.substr(-1) != '\\') { if (Path.indexOf('/') != -1) { Path += '/'; } else { Path += '\\'; } } let element = global_module.getLayerelement(layeri); let i = $(element).find('i'); for (let m = 0; m < i.length; m++) { let className = $(i[m]).attr('class'); if (className.indexOf('ico') == -1) { continue; } let bg = $(i[m]).css('background-image'); let bgPath = bg.substring(bg.indexOf('(') + 1, bg.indexOf(')')); let fileName = bgPath.substring(bgPath.lastIndexOf('/') + 1); fileName = fileName.replace(/\"/g, '').replace(/\'/g, ''); $(i[m]).css('background-image', 'url(' + Path + fileName + ')'); } } static async simulateKeydown(ele, key, interval = 200) { return new Promise(function (resolve) { if (key.length == 0) { resolve(); return; } if (ele == null) { resolve(); return; } key = key.toLowerCase(); let keys = key.split('+'); let event; if (typeof Event === 'function') { event = new Event('keydown'); } else { event = document.createEvent('Event'); event.initEvent('keydown', true, true); } event.key = keys[keys.length - 1]; for (let i = 0; i < keys.length - 1; i++) { event[keys[i] + 'Key'] = true; } ele.dispatchEvent(event); setTimeout(() => { let event; if (typeof Event === 'function') { event = new Event('keyup'); } else { event = document.createEvent('Event'); event.initEvent('keyup', true, true); } event.key = keys[keys.length - 1]; for (let i = 0; i < keys.length - 1; i++) { event[keys[i] + 'Key'] = false; } ele.dispatchEvent(event); resolve(); }, interval); }); } static debounce(fn, delay) { let timeoutId; let promiseResolve; let promise = new Promise((resolve) => (promiseResolve = resolve)); return function () { if (timeoutId) { clearTimeout(timeoutId); } timeoutId = setTimeout(async () => { timeoutId = null; if (fn.constructor.name === 'AsyncFunction') { let result = await fn.apply(this, arguments); promiseResolve(result); } else { let result = fn.apply(this, arguments); promiseResolve(result); } }, delay); return promise; }; } static observeDomChanges(ele = null, callback, MutationObserverFunction = null) { if (MutationObserverFunction == null || typeof MutationObserverFunction != 'function') { MutationObserverFunction = MutationObserver; } const observer = new MutationObserverFunction(function (mutations) { mutations.forEach(function (mutation) { if (mutation.type === 'childList' && mutation.target.getAttribute('data-inserted-append') == null) { callback(mutation.target); } }); }); const options = { childList: true, subtree: true, characterData: true, attributeFilter: ['data-inserted-append'] }; if (ele == null) { ele = document; } observer.observe(ele, options); } static getRandomString(len) { len = len || 32; let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; let maxPos = $chars.length; let pwd = ''; for (let i = 0; i < len; i++) { pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; } static getRandomNumber(len) { let $chars = '0123456789'; let maxPos = $chars.length; let pwd = ''; for (let i = 0; i < len; i++) { pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); } return pwd; } static hideAndCreateDom(Element) { let dom = $(Element).eq(0); $(dom).hide(); let clone = $(dom).clone(); $(dom).after(clone); clone.show(); return clone; } static cloneAndHide(target, InsertMethod = 0, BaseElement = null) { if (InsertMethod == null) { InsertMethod = 0; } let clone = document.createElement(target.tagName); let attributes = target.attributes; for (let i = 0; i < attributes.length; i++) { clone.setAttribute(attributes[i].name, attributes[i].value); } let childNodes = target.childNodes; for (let i = 0; i < childNodes.length; i++) { clone.appendChild(childNodes[i].cloneNode(true)); } target.style.display = 'none'; let parent; if (BaseElement !== null) { parent = BaseElement; } else { parent = target.parentNode; } switch (InsertMethod) { case 0: parent.appendChild(clone); break; case 1: parent.insertBefore(clone, target.nextSibling); break; case 2: parent.insertBefore(clone, target); break; default: parent.appendChild(clone); } return clone; } static async AnimateText(ele, text, Delay = 100) { return new Promise(function (resolve) { let currentText = ''; let i = 0; let height = ele.parent().css('height'); if (height == null) { resolve(); return; } height = height.substring(0, height.length - 2) - 22 + 'px'; let cursor; cursor = document.createElement('span'); cursor.classList.add('cursor'); cursor.style.backgroundColor = '#fff'; cursor.style.width = '3px'; cursor.style.height = height; cursor.style.display = 'inline-block'; cursor.style.animation = 'blink 1s step-end infinite'; let interval = setInterval(() => { currentText += text[i]; ele.text(currentText); ele.append(cursor); i++; if (i === text.length) { clearInterval(interval); resolve(); setTimeout(() => { cursor.remove(); }, 200); } }, Delay); }); } static getMiddleString(str, start, end) { return str.substring(str.indexOf(start) + 1, str.indexOf(end)); } static Cookie = { clearAllCookies: function (domain) { var cookies = document.cookie.split('; '); for (var i = 0; i < cookies.length; i++) { var cookie = cookies[i]; var eqPos = cookie.indexOf('='); var name = eqPos > -1 ? cookie.substr(0, eqPos) : cookie; var cookieDomain = location.hostname.replace(/^www\./i, ''); if (cookieDomain === domain || cookieDomain.endsWith('.' + domain)) { document.cookie = name + '=;expires=Thu, 01 Jan 1970 00:00:00 GMT;domain=' + cookieDomain + ';path=/'; } } }, get: function (name) { let match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)')); return match && decodeURIComponent(match[2]); }, set: function (name, value, days) { if (days == null) { days = 1; } let d = new Date(); d.setTime(d.getTime() + 24 * 60 * 60 * 1000 * days); document.cookie = name + '=' + value + ';path=/;expires=' + d.toGMTString(); }, delete: function (name) { this.set(name, '', -1); }, clear: function () { for (let key in this.get()) { this.delete(key); } let domain = location.hostname.replace(/^www\./i, ''); this.clearAllCookies(domain); } }; static objectDepthEnumerate(_object, callback) { if (Array.isArray(_object)) { _object.forEach((item) => { if (callback && callback(null, item)) { return true; } if (this.objectDepthEnumerate(item, callback)) { return true; } }); } else if (typeof _object === 'object' && _object !== null) { Object.keys(_object).forEach((key) => { if (callback && callback(key, _object[key])) { return true; } if (this.objectDepthEnumerate(_object[key], callback)) { return true; } }); } } static LocalStorage = { exportLocalStorage: function () { let localStorageData = {}; for (let i = 0; i < localStorage.length; i++) { let key = localStorage.key(i); let value = localStorage.getItem(key); localStorageData[key] = value; } let jsonString = JSON.stringify(localStorageData, null, 2); return jsonString; }, importLocalStorage: function (localStorageString) { let localStorageData = JSON.parse(localStorageString); for (let key in localStorageData) { localStorage.setItem(key, localStorageData[key]); } } }; static Mail = { getHost: function () { return 'https://www.mohmal.com/'; }, getInboxUrl: function () { return this.getHost() + 'zh/inbox'; }, getChangeUrl: function () { return this.getHost() + 'zh/change'; }, getMesssageUrl: function () { return this.getHost() + 'zh/message/'; }, Change: async function () { return new Promise(async (resolve) => { await global_module.Http({ method: 'GET', url: this.getChangeUrl() }); let r = await global_module.Http({ method: 'GET', url: this.getInboxUrl() }); resolve(this.getEMail(r.ret.responseText)); }); }, getEMail: function (html) { let emailDom = $('<div></div>').html(html).eq(0).find('[data-email]').eq(0); if (!emailDom) { return null; } if (!emailDom.text()) { return null; } let email = emailDom.attr('data-email'); return email; }, analyzeMails: function (html) { let _that = this; return new Promise(async (resolve) => { let Tasks = []; let MailMsg = []; let msgIds = $(html).find('tr[data-msg-id]'); for (let i = 0; i < msgIds.length; i++) { let that = $(msgIds[i]); let msgId = that.attr('data-msg-id'); let sender = that.find('td[class="sender"]').eq(0).find('a').text(); let time = that.find('td[class="time"]').eq(0).find('a').text(); let url = _that.getMesssageUrl() + msgId; let task = function () { return new Promise(async (resolve) => { let res = await global_module.Http({ method: 'GET', url: url }); let msgDom = $('<div></div>').html(res.ret.responseText).eq(0); let msgDomHtml = msgDom.html(); let msgDomText = msgDom.text(); let obj = { msgId, time, url, res, sender, html: msgDomHtml, text: msgDomText }; MailMsg.push(obj); resolve(); }); }; Tasks.push(task()); } await Promise.all(Tasks); resolve(MailMsg); }); }, getMails: async function () { return new Promise(async (resolve) => { let res = await global_module.Http({ method: 'GET', url: this.getInboxUrl() }); if (res.code === -1) { let r = await this.getMail(); resolve(r); return; } if (res.code != 200) { new Error('Failed to get the verification code, please try again later!'); resolve(null); return; } let html = $('<div></div>').html(res.ret.responseText); let NoMessages = html.find('tr.no-messages').eq(0); if (NoMessages.length !== 0) { resolve([]); return; } let r = await this.analyzeMails(html); resolve(r); }); } }; static AnalogInput = { clickElement: function (el) { if (!el || (el && 'function' !== typeof el.click)) { return false; } el.click(); return true; }, doFocusElement: function (el, setValue) { if (setValue) { let existingValue = el.value; el.focus(); el.value !== existingValue && (el.value = existingValue); } else { el.focus(); } }, normalizeEvent: function (el, eventName) { let ev; if ('KeyboardEvent' in window) { ev = new window.KeyboardEvent(eventName, { bubbles: true, cancelable: false }); } else { ev = el.ownerDocument.createEvent('Events'); ev.initEvent(eventName, true, false); ev.charCode = 0; ev.keyCode = 0; ev.which = 0; ev.srcElement = el; ev.target = el; } return ev; }, setValueForElement: function (el) { let valueToSet = el.value; this.clickElement(el); this.doFocusElement(el, false); el.dispatchEvent(this.normalizeEvent(el, 'keydown')); el.dispatchEvent(this.normalizeEvent(el, 'keypress')); el.dispatchEvent(this.normalizeEvent(el, 'keyup')); el.value !== valueToSet && (el.value = valueToSet); }, setValueForElementByEvent: function (el) { let valueToSet = el.value, ev1 = el.ownerDocument.createEvent('HTMLEvents'), ev2 = el.ownerDocument.createEvent('HTMLEvents'); el.dispatchEvent(this.normalizeEvent(el, 'keydown')); el.dispatchEvent(this.normalizeEvent(el, 'keypress')); el.dispatchEvent(this.normalizeEvent(el, 'keyup')); ev2.initEvent('input', true, true); el.dispatchEvent(ev2); ev1.initEvent('change', true, true); el.dispatchEvent(ev1); el.blur(); el.value !== valueToSet && (el.value = valueToSet); }, doAllFillOperations: function (el, afterValSetFunc) { this.setValueForElement(el); if (typeof afterValSetFunc == 'function') { afterValSetFunc(el); } this.setValueForElementByEvent(el); }, AnalogInput: function (el, op) { el.value == op || this.doAllFillOperations(el, function (theEl) { if (!theEl.type && theEl.tagName.toLowerCase() === 'span') { theEl.innerText = op; return; } theEl.value = op; }); }, AnalogInput2: function (inputElement, inputString) { const nativeInputValueSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value').set; const inputEvent = new Event('input', { bubbles: true }); inputElement.focus(); inputElement.value = ''; for (let i = 0; i < inputString.length; i++) { const char = inputString[i]; nativeInputValueSetter.call(inputElement, inputElement.value + char); inputElement.dispatchEvent(inputEvent); } } }; } try { window['global_module'] = global_module; } catch (e) {} try { module.exports = global_module; } catch (e) {}
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址