您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
用户脚本的基础,包含读取配置的功能;利用此脚本,用户可以忽略配置相关的代码;直接定义功能就可以;
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/404294/810055/Kerwin612.js
// ==UserScript== // @name Kerwin612 // @version 0.1 // @author kerwin612 // @license MIT // @include * // @run-at document-start // @grant GM.getValue // @noframes // ==/UserScript== //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<Kerwin612's UserScript CORE<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< //默认配置信息 var config = { run: (() => { //在此配置主方法,读完配置后会执行此方法 var key = 'default'; var url = window.location.href; for (let [k, v] of Object.entries(fs)) { if ((url === k || url.startsWith(k) || new RegExp(k).test(url))) { key = k; break; } } var obj = fs[key]; if (!obj) return; obj.startup(obj.ctx); obj.readyInterval = setInterval((function(){ if (this.ready(this.ctx)) { clearInterval(this.readyInterval); this.run(this.ctx); } }).bind(obj), 30); }).bind(this) }; function getConfig(config, keys, index) { index = index || 0; var key = keys[index++]; var value = config[key]; return new Promise((resolve) => { GM.getValue(key, value) .then((cv) => { if (key === 'config') { config = Object.assign(config, cv); } else { config[key] = (typeof config[key]) === 'object' ? Object.assign(config[key], cv) : cv; } }) .finally(() => { if (index > keys.length - 1) { resolve(config); } else { getConfig(config, keys, index).then((c) => {resolve(c)}); } }); }); } setTimeout(() => { if (GM && GM.getValue) { getConfig(config, ['config'].concat(Object.keys(config))).then((c) => { Object.assign(config, c).run(); }); } else { //如果不支持用户配置,就直接用默认配置 config.run(); } }, 500); var fs = {}; /* func( () => {}, //启动方法 () => {}, //判断页面是否准备好 () => {}, //主方法 string.., //URL匹配项 ); */ function func() { //arguments is an array-like object, but not an array var as = arguments; if (as.length < 3) return; var obj = {}; obj.startup = as[0].bind(obj); obj.ready = as[1].bind(obj); obj.run = as[2].bind(obj); obj.ctx = {}; if (as.length === 3) { fs['default'] = obj; return; } [].forEach.call(as, function(value, index) { if (index < 3) return; fs[value||'default'] = obj; }); } ////默认配置,如有配置项,将按照以下模板将配置写在>>>>>Kerwin612's UserScript CORE>>>>>以下 //config.configKey = configVal ////方法模板,将此模板copy到>>>>>Kerwin612's UserScript CORE>>>>>以下,可多次 //func( // //startup: url匹配上时就会执行的方法,无须返回值,仅执行一次 // (ctx) => { // }, // //ready: url匹配上时就会执行的方法,返回bool类型的值,每30ms执行一次,直至此方法返回true后就不再执行 // (ctx) => { // return true; // }, // //run: url匹配上且以上的ready方法返回true后执行的方法,无须返回值,仅执行一次 // (ctx) => { // }, // //URL匹配项,可定义多个;当URL匹配时才执行上面的方法;当URL为空或未定义时,上述方法为默认执行的方法 // 'url1','url2','url3' //); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>Kerwin612's UserScript CORE>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>