吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 914|回复: 2
收起左侧

[其他原创] [Javascript] Tampermonkey 简易配置库

  [复制链接]
三滑稽甲苯 发表于 2023-7-23 15:23
本帖最后由 三滑稽甲苯 于 2023-7-23 15:30 编辑

GM_config

🪄 功能

简易的 Tampermonkey 脚本配置库,便于需要配置选项的篡改猴 (Tampermonkey) 脚本快速开发。(人话:只对脚本开发者有用)

链接:Greasy Fork GitHub

🤔 权限

这个库需要以下权限:

// @grant        GM_setValue // 保存配置
// @grant        GM_getValue // 获取配置
// @grant        GM_registerMenuCommand // 注册菜单
// @grant        GM_unregisterMenuCommand // 更新菜单

若你复制粘贴了上述代码,记得删去注释,否则可能报错。若有,你需要删去 @grant none。如果你代码内使用了 window 对象,你可能需要 @grant unsafeWindow 然后 let window = unsafeWindow

📖 使用

let config_desc = { // 配置描述
    password: {
        name: "Password", // 显示名称
        value: "tmp", // 默认值
        processor: (v) => { // 处理用户输入,若不合法则报错
            if (v.length < 3) throw "Too short!";
            return v;
        }
    },
    enabled: {
        name: "Enabled",
        value: true,
        processor: GM_config_builtin_processors.boolean // 你可以使用内置处理器
    },
    price: {
        name: "Price",
        value: 10,
        processor: GM_config_builtin_processors.integer(0, 100) // 部分内置处理器需要参数
    },
    foo: {
        name: "Foo",
        value: "bar"
        // 若你认为不需要验证或处理用户输入,你也可以忽略 processor 项
    }
}

let config = GM_config(config_desc); // 注册菜单命令
console.log(config.price); // 可以开始使用了 🎉

📦 内置处理器

名称 接受值 参数 例子
boolean truefalse GM_config_builtin_processors.boolean
integer 任意 [min, max] 区间内的整数 min, max (undefined 认为是没有限制) GM_config_builtin_processors.integer(1, undefined) (任意正整数)
values 任意数组 accepted 内的值 accepted GM_config_builtin_processors.values(["a", "b", "c"]) (允许 "a", "b" 或 "c")

👀 完整的例子

将以下代码安装为脚本,观察它是如何工作的:

// ==UserScript==
// @name         Test Config
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  This is an example to demostrate the usage of greasyfork.org/scripts/470224.
// @author       PRO
// @match        https://greasyfork.org/*
// @icon         https://greasyfork.org/vite/assets/blacklogo16-bc64b9f7.png
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// @require      https://greasyfork.org/scripts/470224-tampermonkey-config/code/Tampermonkey%20Config.js
// @license      gpl-3.0
// ==/UserScript==

(function() {
    'use strict';
    let config_desc = { // Config description
        password: {
            name: "Password", // Display name
            value: "tmp", // Default value
            processor: (v) => { // Process user inputs, throw error if invalid
                if (v.length < 3) throw "Too short!";
                return v;
            }
        },
        enabled: {
            name: "Enabled",
            value: true,
            processor: GM_config_builtin_processors.boolean // You can use builtin processors
        },
        val: {
            name: "Float",
            value: 11.4,
            processor: parseFloat
        }
    }
    let config = GM_config(config_desc); // Register menu commands
    window.setInterval(()=>{
        if (config.enabled) {
            console.log(config.password);
            console.log(config.val);
        }
    }, 1000);

})();

🌐 完整代码

// ==UserScript==
// @name         Tampermonkey Config
// @name:zh-CN   Tampermonkey 配置
// @license      gpl-3.0
// @namespace    http://tampermonkey.net/
// @version      0.2.3
// @description  Simple Tampermonkey script config library
// @description:zh-CN  简易的 Tampermonkey 脚本配置库
// @author       PRO
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_registerMenuCommand
// @grant        GM_unregisterMenuCommand
// ==/UserScript==

let _GM_config_wrapper = {
    get: function (target, name) {
        // Return stored value, if any
        let value = GM_getValue(name);
        if (value !== undefined) {
            return value;
        }
        // Return default value
        return target[name].value;
    }
    , set: function (target, name, value) {
        let processor = target[name].processor;
        if (processor)
            value = target[name].processor(value);
        // Store value
        GM_setValue(name, value);
        return true;
    }
};

let _GM_config_menu_ids = [];

function _GM_config_register(desc, config) {
    // Unregister old menu commands
    let id;
    while (id = _GM_config_menu_ids.pop()) GM_unregisterMenuCommand(id);
    for (let k in desc) {
        // console.log(k, v); // DEBUG
        let name = desc[k].name;
        let val = config[k];
        let id = GM_registerMenuCommand(`${name}: ${val}`, function () {
            let new_value = prompt(`🤔 New value for ${name}:`, val);
            if (new_value !== null) {
                try {
                    config[k] = new_value;
                } catch (error) {
                    alert(`⚠️ ${error}`);
                }
                _GM_config_register(desc, config);
                // console.log(`Set ${k} to ${new_value}`); // DEBUG
            }
        });
        _GM_config_menu_ids.push(id);
    }
};

function GM_config(desc) { // Register menu commands based on given config description
    // Get proxied config
    let config = new Proxy(desc, _GM_config_wrapper);
    // Register menu commands
    _GM_config_register(desc, config);
    // Return proxied config
    return config;
};

let GM_config_builtin_processors = {
    boolean: (v) => {
        switch (v) {
            case "true":
                return true;
            case "false":
                return false;
            default:
                throw `Invalid value: ${v}, expected "true" or "false"!`;
        }
    },
    integer: (min, max) => (v) => {
        v = parseInt(v);
        if (isNaN(v)) throw `Invalid value, expected integer!`;
        if ((min !== undefined && v < min) || (max !== undefined && v > max)) throw `Out of range: ${v}, expected [${min}, ${max}]!`;
        return v;
    },
    values: (accepted) => (v) => {
        if (!accepted.includes(v)) throw `Invalid value: ${v}, expected one of ${accepted}!`;
        return v;
    }
};

⚠️ 注意

  • 这个项目正处于早期发展阶段
  • 尽量避免在你的脚本里修改配置。若你确实需要这么做,记得调用 _GM_config_register(config_desc, config); 以便更新展示的菜单

免费评分

参与人数 1吾爱币 +7 热心值 +1 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ciker_li 发表于 2023-7-23 17:59
学习学习
lqdjdy 发表于 2023-7-24 08:12
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-5 19:03

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表