划一划,快速打开文本中的网盘链接,支持20+网盘,能自动提取提取码和解压密码。同时为了防止忘记链接相关信息,还会整合提取码和解压密码在链接里面,更有解压密码提示助手,在浏览器的历史记录里面打开,就会跳出提醒框,一键复制解压密码!!!。以及有分享的KK链接,要说的都在链接里面,插件全帮你搞定,直接网址打开无需多言(对方也要装网盘快开插件才行)。还有前后台打开模式,快开和弹窗模式,设置最适合自己的。沉浸式上网冲浪!(对于部分国内无法打开的网站,换源成我个人认为国内做的比较好的crx商店了,望周知)
// ==UserScript== // @name 网盘快开助手 // @namespace https://github.com/maimierjiafude/KK_OpenPanHelper // @version 2.0.1 // @author 龙龙龙 // @description 划一划,快速打开文本中的网盘链接,支持20+网盘,能自动提取提取码和解压密码。同时为了防止忘记链接相关信息,还会整合提取码和解压密码在链接里面,更有解压密码提示助手,在浏览器的历史记录里面打开,就会跳出提醒框,一键复制解压密码!!!。以及有分享的KK链接,要说的都在链接里面,插件全帮你搞定,直接网址打开无需多言(对方也要装网盘快开插件才行)。还有前后台打开模式,快开和弹窗模式,设置最适合自己的。沉浸式上网冲浪!(对于部分国内无法打开的网站,换源成我个人认为国内做的比较好的crx商店了,望周知) // @license AGPL-3.0-or-later // @supportURL https://github.com/maimierjiafude/KK_OpenPanHelper // @match *://*/* // @require https://unpkg.com/[email protected]/dist/sweetalert2.min.js // @resource swalStyle https://unpkg.com/[email protected]/dist/sweetalert2.min.css // @run-at document-idle // @grant GM_openInTab // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_getResourceText // @grant GM_setClipboard // @grant GM_info // @icon data:image/svg+xml;base64,PHN2ZyB0PSIxNjczOTcwMjM5NTk1IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjE0MTMiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNNDcwLjIyOTMzMyA0NDkuMTA5MzMzbDY0IDAuMTA2NjY3TDUzMy4zMzMzMzMgOTQ5LjM5NzMzM2wtNjQtMC4xMjggMC44OTYtNTAwLjE2eiBtMzIuMjEzMzM0LTM4OC4yNjY2NjZsMTkwLjE4NjY2NiAxOTUuMDA4djE1Ni40OGwxOTUuNTYyNjY3IDE5NS41NjI2NjZWNzQ4LjhoLTE5NS45NDY2Njd2OTAuOTg2NjY3aC02NHYtMTE4Ljc0MTMzNGgwLjM4NFYyODEuODc3MzMzbC0xMjYuMTg2NjY2LTEyOS4zODY2NjYtMTI2LjE2NTMzNCAxMjkuMzY1MzMzIDAuOTE3MzM0IDQ2Ni4xMzMzMzNoLTAuMjk4NjY3djkxLjc5NzMzNGgtNjR2LTkxLjc5NzMzNEgxMTcuMzMzMz###i0xNDAuMDk2bDE5NS4yLTE5NS4yMjEzMzMtMC4yOTg2NjYtMTU2LjggMTkwLjIwOC0xOTUuMDI5MzMzeiBtMTkwLjE4NjY2NiA0NDIuMDA1MzMzVjY4NC44aDEzMS41NjI2Njd2LTUwLjM4OTMzM2wtMTMxLjU2MjY2Ny0xMzEuNTYyNjY3eiBtLTM3OS45MjUzMzMgMC4xNzA2NjdMMTgxLjMzMzMzMyA2MzQuMzg5Mz###jQ5LjZoMTMxLjczMzMzNGwtMC4zNjI2NjctMTgwLjk3MDY2NnoiIGZpbGw9IiMxNjc3RkYiIHAtaWQ9IjE0MTQiPjwvcGF0aD48L3N2Zz4= // ==/UserScript== (function () { 'use strict'; // 在addPluginStyle里面配置style // 对于一些部件自定义调节css样式,可以防止和其他插件撞样式 const customClass = { container: 'KK-PanHelper-container', popup: 'KK-PanHelper-popup', htmlContainer: 'KK-PanHelper-htmlContainer', title: 'KK-PanHelper-title', actions: 'KK-PanHelper-actions', }; // 工具汇总 let util = { // 控制台成组输出,便于查找到log clog(value, name = '打印:') { console.group("%c %c [网盘快开助手]", `background:url(${GM_info.script.icon}) center center no-repeat;background-size:12px;padding:3px`, ""); console.log(name, value); console.groupEnd(); }, // 弹出框添加样式 addStyle(id, tag, css) { tag = tag || 'style'; let styleDom = document.getElementById(id); if (styleDom) return; let style = document.createElement(tag); style.rel = 'stylesheet'; style.id = id; tag === 'style' ? style.innerHTML = css : style.href = css; document.head.appendChild(style); }, // 存值取值 getValue(name) { return GM_getValue(name); }, setValue(name, value) { GM_setValue(name, value); }, // 睡眠时间,可以和await async 配合使用 sleep(time) { return new Promise((resolve) => setTimeout(resolve, time)); }, isHidden(el) { try { return el.offsetParent === null; } catch (e) { return false; } }, // 构造的querySelector选择器,传入的参数可以是数组或者字符串 query(selector) { if (Array.isArray(selector)) { let obj = null; for (let i = 0; i < selector.length; i++) { let o = document.querySelector(selector[i]); if (o) { obj = o; break; } } return obj; } return document.querySelector(selector); }, formatPanText(pan_obj) { let pan_text = '网盘:' + pan_obj.pan_name + '\n' + '链接:' + pan_obj.link + '\n' + (!!pan_obj.pwd ? '提取码:' + pan_obj.pwd + '\n' : '\n') + (!!pan_obj.zip ? '解压密码:' + pan_obj.zip : '') return pan_text; } }; //弹窗事件汇总 let popupNotifications = { // 快开模式下的复制提示弹窗,便于复制,不然复制不到,选中就打开了,悲 copyPN(pan_obj) { let formatText = util.formatPanText(pan_obj); Swal.fire({ toast: true, showCancelButton: true, position: 'top', title: `<span style="color: #2778c4;margin: 0 5px;">网盘快开助手(此窗口可设置不显示)</span>`, html: `<span style="font-size: 0.8em;display:block"> ${formatText.replace(/\n/g, '<br>')} </span>`, confirmButtonText: '复制KK链接', cancelButtonText: '关闭', customClass }).then((res) => { if (res.isConfirmed || res.dismiss === 'timer') { GM_setClipboard(main.kkLink(pan_obj)); }; }); }, // 弹窗模式下的打开提示弹窗,检测到链接,是否打开 // 按钮弹窗 openPN(pan_obj) { Swal.fire({ toast: true, showCancelButton: true, position: 'top', title: `发现<span style="color: #2778c4;margin: 0 5px;">${pan_obj.pan_name}</span>链接`, html: `<span style="font-size: 0.8em;">${!!pan_obj.pwd ? '密码:' + pan_obj.pwd : '是否打开?'}</span>`, confirmButtonText: '打开', cancelButtonText: '关闭', customClass }).then((res) => { if (res.isConfirmed || res.dismiss === 'timer') { let url = main.kkLink(pan_obj) main.openHTML(url); }; }); }, zipPN(url, zip) { Swal.fire({ toast: true, showCancelButton: true, showConfirmButton: true, confirmButtonText: '复制KK链接', cancelButtonText: '关闭', position: 'top-start', padding: '1px', width: '300px', title: `<span style="color: #2778c4;margin: 0px;font-weight:bold">解压密码:${zip} </span><button id="KK_zipButton" style="width:60px;height:25px;cursor: pointer;border:none;border-radius: 2px;background: red; text-align: center;color: white;">复 制</button>`, customClass }).then((res) => { if (res.isConfirmed) { GM_setClipboard(url); } }) document.getElementById("KK_zipButton").addEventListener('click', () => { GM_setClipboard(zip); document.getElementById("KK_zipButton").innerHTML = "已复制"; }); }, contactPN() { Swal.fire({ toast: false, title: '💬 反馈 & 建议', icon: 'success', html: ` 打开<a style="color:blue;margin-right:5px;margin-left:5px;text-decoration: underline;font-weight: bold" href="https://github.com/maimierjiafude/KK_OpenPanHelper" target="_blank">Github</a>发Issue<br> 打开<a style="color:blue;margin-right:5px;margin-left:5px;text-decoration: underline;font-weight: bold" href="https://github.com/maimierjiafude/KK_OpenPanHelper" target="_blank">GreasyFork</a>给我留言 `, showCloseButton: false, confirmButtonText: '好的', customClass }) } }; // 选项,网盘的正则,组件的打包内容 // hash应该就是域名匹配,而local需要借助本地存储 let opt = { 'baidu': { reg: /((?:https?:\/\/)?(?:e?yun|pan)\.baidu\.com\/(doc\/|enterprise\/)?(?:s\/[\w~]*(((-)?\w*)*)?|share\/\S{4,}))/, host: /(pan|e?yun)\.baidu\.com/, input: ['#accessCode', '.share-access-code', '#wpdoc-share-page > .u-dialog__wrapper .u-input__inner'], button: ['#submitBtn', '.share-access .g-button', '#wpdoc-share-page > .u-dialog__wrapper .u-btn--primary'], name: '百度网盘', storage: 'hash' }, 'aliyun': { reg: /((?:https?:\/\/)?(?:(?:www\.)?aliyundrive\.com\/s|alywp\.net)\/[a-zA-Z\d]+)/, host: /www\.aliyundrive\.com|alywp\.net/, input: ['form .ant-input', 'form input[type="text"]'], button: ['form .button--fep7l', 'form button[type="submit"]'], name: '阿里云盘', storage: 'hash' }, 'weiyun': { reg: /((?:https?:\/\/)?share\.weiyun\.com\/[a-zA-Z\d]+)/, host: /share\.weiyun\.com/, input: ['.mod-card-s input[type=password]'], button: ['.mod-card-s .btn-main'], name: '微云', storage: 'hash' }, 'lanzou': { reg: /((?:https?:\/\/)?(?:[a-zA-Z0-9\-.]+)?lanzou[a-z]\.com\/[a-zA-Z\d_\-]+)/, host: /(?:[a-zA-Z\d-.]+)?lanzou[a-z]\.com/, input: ['#pwd'], button: ['.passwddiv-btn', '#sub'], name: '蓝奏云', storage: 'hash' }, 'tianyi': { reg: /((?:https?:\/\/)?cloud\.189\.cn\/(?:t\/|web\/share\?code=)?[a-zA-Z\d]+)/, host: /cloud\.189\.cn/, input: ['.access-code-item #code_txt'], button: ['.access-code-item .visit'], name: '天翼云盘', storage: 'hash' }, 'caiyun': { reg: /((?:https?:\/\/)?caiyun\.139\.com\/(?:m\/i|w\/i\/|web\/|front\/#\/detail)\??(?:linkID=)?[a-zA-Z\d]+)/, host: /caiyun\.139\.com/, input: ['.token-form input[type=text]'], button: ['.token-form .btn-token'], name: '移动云盘', storage: 'local', storagePwdName: 'tmp_caiyun_pwd' }, 'xunlei': { reg: /((?:https?:\/\/)?pan\.xunlei\.com\/s\/[\w-]{10,})/, host: /pan\.xunlei\.com/, input: ['.pass-input-wrap .td-input__inner'], button: ['.pass-input-wrap .td-button'], name: '迅雷云盘', storage: 'hash' }, '123pan': { reg: /((?:https?:\/\/)?www\.123pan\.com\/s\/[\w-]{6,})/, host: /www\.123pan\.com/, input: ['.ca-fot input'], button: ['.ca-fot button'], name: '123云盘', storage: 'hash' }, '360': { reg: /((?:https?:\/\/)?(?:[a-zA-Z\d\-.]+)?yunpan\.360\.cn(\/lk)?\/surl_\w{6,})/, host: /yunpan\.360\.cn/, input: ['.pwd-input'], button: ['.submit-btn'], name: '360云盘', storage: 'hash' }, '115': { reg: /((?:https?:\/\/)?115\.com\/s\/[a-zA-Z\d]+)/, host: /115\.com/, input: ['.form-decode input'], button: ['.form-decode .submit a'], name: '115网盘', storage: 'hash' }, 'cowtransfer': { reg: /((?:https?:\/\/)?(?:[a-zA-Z\d-.]+)?cowtransfer\.com\/s\/[a-zA-Z\d]+)/, host: /(?:[a-zA-Z\d-.]+)?cowtransfer\.com/, input: ['.receive-code-input input'], button: ['.open-button'], name: '奶牛快传', storage: 'hash' }, 'ctfile': { reg: /((?:https?:\/\/)?(?:[a-zA-Z\d-.]+)?ctfile\.com\/\w+\/[a-zA-Z\d-]+)/, host: /(?:[a-zA-Z\d-.]+)?ctfile\.com/, input: ['#passcode'], button: ['.card-body button'], name: '城通网盘', storage: 'hash' }, 'quark': { reg: /((?:https?:\/\/)?pan\.quark\.cn\/s\/[a-zA-Z\d-]+)/, host: /pan\.quark\.cn/, input: ['.ant-input'], button: ['.ant-btn-primary'], name: '夸克网盘', storage: 'local', storagePwdName: 'tmp_quark_pwd' }, 'flowus': { reg: /((?:https?:\/\/)?flowus\.cn\/[\S ^\/]*\/?share\/[a-z\d]{8}-[a-z\d]{4}-[a-z\d]{4}-[a-z\d]{4}-[a-z\d]{12})/, host: /flowus\.cn/, name: 'FlowUs息流', storage: 'hash' } }; // 解析总类 let parse = { // 记忆上一次的密码,从而防止选择完以后还触发相同事件 lastText: "long", // 解析selection parseSelection(text) { let pan_obj = this.parseEngine(text); if (!pan_obj.link) { let nameAndLinkObj = this.parseALink(window.getSelection()); if (nameAndLinkObj) { pan_obj.pan_name = nameAndLinkObj.pan_name; pan_obj.link = nameAndLinkObj.link; if (nameAndLinkObj.pwd != '') { (pan_obj.pwd != nameAndLinkObj.pwd) ? pan_obj.pwd = nameAndLinkObj.pwd : '' } } }; return pan_obj; }, // 解析Clipboard parseClipboard(text) { let pan_obj = this.parseEngine(text); return pan_obj; }, // 对于解析的总方法 // 返回一个对象 parseEngine(text) { let pan_obj = { pan_name: '', link: '', pwd: '', zip: '', }; // 获取提取码 let pwd = this.parsePwd(text); // 获取解压码 pan_obj.zip = this.parseZipPasswords(text); // 文字替换 text = this.textFliter(text); // 获取pan的名字和text中的link // pan_obj.pan_name, pan_obj.link = this.parseLink(text); // 返回值只能有一个。 let nameAndLinkObj = this.parseLink(text); pan_obj.pan_name = nameAndLinkObj.pan_name; pan_obj.link = nameAndLinkObj.link; if (nameAndLinkObj.pwd) { (pwd != nameAndLinkObj.pwd) ? pwd = nameAndLinkObj.pwd : '' } pan_obj.pwd = pwd return pan_obj; }, //正则解析超链接类型网盘链接 // ⚠️可能会增加时间⚠️ 如果有需要可以增加选项 // 获取选择内容的HTML和文本(增加兼容性) 或 DOM(节点遍历) // 使用chatGPT生成并修改 parseALink(selection) { if (!selection.isCollapsed) { const range = selection.getRangeAt(0); const commonAncestor = range.commonAncestorContainer; if (typeof (commonAncestor.querySelector) !== 'undefined') { const links = commonAncestor.querySelector('*[href]') return this.parseLink(links ? links.href : ""); } } return; }, // 选中文字的替换规则 textFliter(text) { if (text) { try { text = decodeURIComponent(text); } catch { } }; text = text.replace(/[点點]/g, '.'); text = text.replace(/[\u4e00-\u9fa5\u200B()(),,]/g, ''); text = text.replace(/lanzous/g, 'lanzouw'); //修正lanzous打不开的问题 return text }, //正则解析提取码 // 这里的?<=正向后发断言 看文档说JS不支持,但是目前呢能用,以后改吧 parsePwd(text) { text = text.replace(/\u200B/g, ''); let reg = /(?<=\s*(?:密|提取|访问|訪問|key|password|pwd|#)\s*[码碼]?\s*[::=]?\s*)[a-zA-Z0-9]{3,8}\w/i; if (reg.test(text)) { let match = text.match(reg); return match[0]; } return ''; }, //正则解析解压密码 parseZipPasswords(text) { let zip_reg = /(?<=\s*(?:解压|解压密)\s*[码碼]\s*)[::=]?\s*(.+?)\s/; if (zip_reg.test(text)) { let match = text.match(zip_reg); return match[1]; } let zip_hash_reg = /#zip(.+)zip/; if (zip_hash_reg.test(text)) { let match = text.match(zip_hash_reg); return match[1]; } return ''; }, // 正则解析链接 parseLink(text) { let nameAndLinkObj = { pan_name: '', link: '', pwd: '' }; for (let pan_name in opt) { let val = opt[pan_name]; if (val.reg.test(text)) { let matches = text.match(val.reg); nameAndLinkObj.pan_name = val.name; nameAndLinkObj.link = matches[0]; nameAndLinkObj.pwd = this.parsePwd(text) if (val.replaceHost) { nameAndLinkObj.link = nameAndLinkObj.link.replace(val.host, val.replaceHost); } return nameAndLinkObj; } }; return nameAndLinkObj; }, // 优化筛选输入的string,没有四个以上字母的通通抬走呢 parsePreTextAndReturn(text) { if (text == this.lastText || text == '') { return; } else if (text.length > 1000) { return; } this.lastText = text; return true; }, // 网址解析 parseQuery(name) { let reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i"); let r = location.search.substring(1).match(reg); if (r != null) return (r[2]); return null; }, // 专门为百度准备的解析,因为要本地存储比对 parseBaiduLink(url) { let baidu_reg = /(?:https?:\/\/)?(?:e?yun|pan)\.baidu\.com\/(?:s\/|share\/init\?surl=)(.+?)(?:\?|&)/; if (baidu_reg.test(url)) { let match = url.match(baidu_reg); return match[1]; } return; } }; // 主要代码逻辑 let main = { // 初始化配置数据 // KK_setting_open_model false 快开模式;true 弹窗模式 // KK_setting_active true 后台打开,false 新窗口打开 // KK_setting_show_copyPN 是否显示快开模式的弹窗 yes 是 // KK_local_data 需要本地保存的用于缓冲数据 initValue() { let value = [{ name: 'KK_setting_open_model', value: true }, { name: 'KK_setting_active', value: true }, { name: 'KK_setting_show_copyPN', value: true }, { name: 'KK_local_data', value: { 'url': '', 'code': '', 'zip': '' } }, { name: 'KK_setting_auto_copy', value: true }, { name: 'KK_setting_selection_active', value: true }]; value.forEach((v) => { if (util.getValue(v.name) === undefined) { util.setValue(v.name, v.value); } }); }, // 监听选择事件 addPageListener() { // 监听,mouseup并绑定函数 // 绑定函数 document.onmouseup = () => {} //document.addEventListener("mouseup", this.getSelectionAndParse.bind(this), true); document.addEventListener("mouseup", () => { this.root('selection', window.getSelection().toString()) }); // 粘贴事件选择 window.addEventListener("paste", (e) => { let clipData = e.clipboardData || window.clipboardData; let clipText = clipData.getData("text/plain") this.root('paste', clipText); }); // 快捷按键操作 document.addEventListener("keydown", (e) => { this.pressKey(e) }); }, // 读取模式,并与之打开网页 openHTML(url) { let active = util.getValue('KK_setting_active'); if (url.indexOf('https') === -1) { url = 'https://' + url; } GM_openInTab(url, { active }); }, // 构造kk链接,返回一个url kkLink(pan_obj) { let pan_name = pan_obj.pan_name; let link = pan_obj.link; let pwd = pan_obj.pwd; let zip = pan_obj.zip; if (pan_name === 'caiyun') { //移动云盘无法携带参数和Hash util.setValue('tmp_caiyun_pwd', pwd); } if (pan_name === 'quark') { util.setValue('tmp_quark_pwd', pwd); } let url = link; if (pwd) { let extra = `${link}?pwd=${pwd}#${pwd}`; if (~link.indexOf('?')) { extra = `${link}&pwd=${pwd}#${pwd}`; } url = extra; } if (zip) { url = `${url}#zip${encodeURI(zip)}zip` } return url; }, // 事件入口 root(event, data = '') { let pan_obj = {}; if (!parse.parsePreTextAndReturn(data)) { return; } // 粘贴事件 if (event == 'paste') { pan_obj = parse.parseClipboard(data); }; // 鼠标选中事件 if (event == 'selection') { pan_obj = parse.parseSelection(data); }; // 熔断机制 if (!pan_obj.link) { return }; util.clog(pan_obj) // (event == 'selection' ) ? window.getSelection().empty():''; let KK_setting_open_model = util.getValue('KK_setting_open_model'); let KK_setting_show_copyPN = util.getValue('KK_setting_show_copyPN'); let KK_setting_auto_copy = util.getValue('KK_setting_auto_copy'); let KK_setting_selection_active = util.getValue('KK_setting_selection_active'); let url = this.kkLink(pan_obj); if (event == 'selection' && KK_setting_selection_active) { window.getSelection().empty() parse.lastText = 'long'; } if (KK_setting_auto_copy) { GM_setClipboard(url); }; if (KK_setting_open_model) { this.openHTML(url) if (KK_setting_show_copyPN) { popupNotifications.copyPN(pan_obj) }; } else { popupNotifications.openPN(pan_obj) }; }, // 快捷键操作,Enter确定,Esc退出 pressKey(event) { if (event.key === 'Enter') { let confirmBtn = document.querySelector('.KK-PanHelper-container .swal2-confirm'); confirmBtn && confirmBtn.click(); } if (event.key === 'Escape') { let cancelBtn = document.querySelector('.KK-PanHelper-container .swal2-cancel'); cancelBtn && cancelBtn.click(); } }, //根据域名检测网盘类型,返回值是opt的key panDetectReturnName() { let hostname = location.hostname; for (let name in opt) { let val = opt[name]; if (val.host.test(hostname)) { return name; } } return }, // 本地存储百度的特征码和解压密码 saveBaiduData(baidu_save_code, zip) { console.log(123); if (baidu_save_code && zip) { util.setValue('KK_local_data', { 'code': baidu_save_code, 'zip': zip }); } }, // 监听url的hash变化,并且进行当前url的替换,在hash值里面加入解压密码 watchUrlHashChange(zip) { if (("onhashchange" in window) && ((typeof document.documentMode === "undefined") || document.documentMode == 8)) { window.onhashchange = () => { if (location.hash.toString().indexOf("#zip") == -1) { location.hash = '#zip' + zip + 'zip' + location.hash }; }; } }, //自动填写密码 autoFillPassword() { let panType = this.panDetectReturnName(); let url = location.href; let pwd_query = parse.parseQuery('pwd'); let pwd_hash = location.hash.slice(1); let baidu_save_code = parse.parseBaiduLink(url) let zip = ''; let zip_hash_reg = /#zip(.+)zip/; if (zip_hash_reg.test(pwd_hash)) { zip = pwd_hash.match(zip_hash_reg)[1]; zip = decodeURI(zip); pwd_hash = pwd_hash.replace((pwd_hash.match(zip_hash_reg)[0]), ''); } let pwd = pwd_query || pwd_hash; for (let name in opt) { let val = opt[name]; if (panType === name) { if (val.storage === 'local') { pwd = util.getValue(val.storagePwdName) ? util.getValue(val.storagePwdName) : ''; pwd && this.doFillAction(val.input, val.button, pwd); } if (val.storage === 'hash') { if (!/^[a-zA-Z0-9]{3,8}$/.test(pwd)) { //过滤掉不正常的Hash return; } pwd && this.doFillAction(val.input, val.button, pwd); } } } baidu_save_code && this.saveBaiduData(baidu_save_code, zip) let baidu_data = util.getValue('KK_local_data'); if (baidu_data.code && url.indexOf('baidu') != -1) { if ((url.indexOf(baidu_data.code) != -1) && !zip) { zip = baidu_data.zip; location.hash = '#zip' + zip + 'zip' + location.hash url = location.href; }; } if (zip && baidu_save_code) { this.watchUrlHashChange(zip); }; zip && popupNotifications.zipPN(url, zip); }, // 进行填写 doFillAction(inputSelector, buttonSelector, pwd) { let maxTime = 10; // async函数才能使用await let ins = setInterval(async () => { maxTime--; let input = util.query(inputSelector); let button = util.query(buttonSelector); if (input && !util.isHidden(input)) { clearInterval(ins); let lastValue = input.value; input.value = pwd; //Vue & React 触发 input 事件 let event = new Event('input', { bubbles: true }); let tracker = input._valueTracker; if (tracker) { tracker.setValue(lastValue); } input.dispatchEvent(event); await util.sleep(200); //0.2秒后点击按钮 button.click(); } else { maxTime === 0 && clearInterval(ins); } }, 800); }, // 显示设置 showSettingBox() { let html = `<div style="font-size: 1em;"> <label class="KK-PanHelper-setting-label">插件运行模式 <select id="KK-Model" class="KK-PanHelper-setting-select"> <option>快开模式</option> <option>弹窗模式</option> </select> </label> <label class="KK-PanHelper-setting-label" id="KK-checkbox-show-copyPN" style="${util.getValue('KK_setting_open_model') ? 'display: flex' : 'display: none'}">快开模式显示复制弹窗 <input type="checkbox" class="KK-PanHelper-setting-checkbox" ${util.getValue('KK_setting_show_copyPN') ? 'checked' : ''} > </label> <label class="KK-PanHelper-setting-label">新窗口打开方式 <select id="KK-Active" class="KK-PanHelper-setting-select"> <option>新窗口打开</option> <option>后台打开</option> </select> </label> <label class="KK-PanHelper-setting-label">选中链接后->自动复制 <input type="checkbox" id="KK-checkbox-auto-copy" class="KK-PanHelper-setting-checkbox" ${util.getValue('KK_setting_auto_copy') ? 'checked' : ''} > </label> <label class="KK-PanHelper-setting-label">选中链接后->取消选中状态 <input type="checkbox" id="KK-setting-selection-active" class="KK-PanHelper-setting-checkbox" ${util.getValue('KK_setting_selection_active') ? 'checked' : ''} > </label> </div>`; Swal.fire({ title: '快开助手配置', html, icon: 'info', showCloseButton: true, confirmButtonText: '保存', footer: '<div style="text-align: center;font-size: 1em;">点击查看 <a style="color:blue;margin-right:5px;text-decoration: underline;" href="https://greasyfork.org/zh-CN/scripts/460184" target="_blank"> GreasyFork</a><a style="color:blue;margin-right:5px;text-decoration: underline;" href="https://github.com/maimierjiafude/KK_OpenPanHelper" target="_blank"> Github</a><a style="color:blue;margin-right:5px;text-decoration: underline;" href="https://www.acfun.cn/v/ac40763378" target="_blank"> 视频演示</a>,Powered by 龙龙龙</div>', customClass }).then((res) => { // history.go(0)刷新 // location.reload()刷新 res.isConfirmed && location.reload(); }); document.getElementById('KK-Model').selectedIndex = (util.getValue('KK_setting_open_model') ? 0 : 1); document.getElementById('KK-Model').addEventListener('change', () => { let KK_checkbox_show_copyPN = document.getElementById('KK-checkbox-show-copyPN'); KK_checkbox_show_copyPN.style.display = (!util.getValue('KK_setting_open_model') ? 'flex' : 'none') util.setValue('KK_setting_open_model', !util.getValue('KK_setting_open_model')); }); document.getElementById('KK-Active').selectedIndex = (util.getValue('KK_setting_active') ? 0 : 1); document.getElementById('KK-Active').addEventListener('change', () => { util.setValue('KK_setting_active', !util.getValue('KK_setting_active')); }); document.getElementById("KK-checkbox-show-copyPN").addEventListener('change', () => { util.setValue('KK_setting_show_copyPN', !util.getValue('KK_setting_show_copyPN')); }); document.getElementById("KK-checkbox-auto-copy").addEventListener('change', () => { util.setValue('KK_setting_auto_copy', !util.getValue('KK_setting_auto_copy')); }); document.getElementById("KK-setting-selection-active").addEventListener('change', () => { util.setValue('KK_setting_selection_active', !util.getValue('KK_setting_selection_active')); }); }, // 菜单注册 registerMenuCommand() { GM_registerMenuCommand('💬 反馈 & 建议', () => { // 这里填我的联系方式 // 弹出框,邮箱,github popupNotifications.contactPN() }); GM_registerMenuCommand('⚙️ 设置', () => { this.showSettingBox(); }); }, // 样式总控制 addPluginStyle() { let style = ` .KK-PanHelper-title {text-align: center !important; } .KK-PanHelper-container { z-index: 99999!important; text-align: center !important; } .KK-PanHelper-popup { font-size: 14px !important; text-align: center !important; } .KK-PanHelper-htmlContainer{ margin: 2px !important; padding:1px !important;} .KK-PanHelper-actions {justify-content: center!important; align-items: center;} .KK-PanHelper-setting-label { display: flex;align-items: center;justify-content: space-between;padding-top: 15px; } .KK-PanHelper-setting-select { width: 150px;height: 30px;font-size: 1em; } .KK-PanHelper-setting-checkbox { width: 16px;height: 16px; } `; if (document.head) { util.addStyle('KK-swal-style', 'style', GM_getResourceText('swalStyle')); util.addStyle('KK-PanHelper-style', 'style', style); } const headObserver = new MutationObserver(() => { util.addStyle('KK-swal-style', 'style', GM_getResourceText('swalStyle')); util.addStyle('KK-PanHelper-style', 'style', style); }); headObserver.observe(document.head, { childList: true, subtree: true }); }, // 是否最前 isTopWindow() { return window.self === window.top; }, init() { this.initValue(); this.addPluginStyle(); this.autoFillPassword(); this.addPageListener(); this.isTopWindow() && this.registerMenuCommand(); }, }; main.init(); })();