油猴GM_*使用

参考

tampermonkey文档

https://www.tampermonkey.net/documentation.php

https://learn.scriptcat.org/

tampermonkey版本

v5.3.3

测试网址

https://example.com

例子

// ==UserScript==
// @name         油猴脚本学习
// @namespace    http://tampermonkey.net/
// @version      2025-04-12
// @description  try to take over the world!
// @author       You
// @match        https://example.com
// @icon         data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
// @require      https://cdnjs.cloudflare.com/ajax/libs/dayjs/1.11.13/dayjs.min.js#sha512-FwNWaxyfy2XlEINoSnZh1JQ5TRRtGow0D6XcmAWmYCRgvqOUTnzCxPc9uF35u5ZEpirk1uhlPVA19tflhvnW1g==
// @grant        GM_addStyle
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        GM_setClipboard
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_deleteValue
// @grant        GM_listValues
// @grant        GM_setValues
// @grant        GM_getValues
// @grant        GM_deleteValues
// @grant        GM_addValueChangeListener
// @grant        GM_removeValueChangeListener
// @grant        GM_cookie
// ==/UserScript==

(function() {
    'use strict';

    /**
     * 1. 脚本代码尽量都写到这个立即执行的匿名函数里,与页面代码进行隔离,避免冲突
     * 2. 替换window对象,沙箱内部需通过unsafeWindow访问原始对象(前提是取得访问的授权@grant)
     * 3. 敏感操作必须使用油猴提供的GM_* API进行执行,且必须取到授权@grant
    **/

    GM_addStyle(
        `
        p {
        color: red;
        }
        `
    );

    GM_openInTab("https://www.example.com/");

    const menu_command_id_1 = GM_registerMenuCommand("Show Alert", function(event) {
        alert("Menu item selected");
    }, {
        accessKey: "a",
        autoClose: true,
        title: "1212121"
    });

    GM_setClipboard("This is the clipboard text.", "text", () => console.log("Clipboard set!"));

    let listenerId = GM_addValueChangeListener('someKey', (key, oldValue, newValue, remote) => {
        console.log('GM_addValueChangeListener', key, oldValue, newValue, remote);
    });
    GM_setValue("someKey", "someData");

    GM_setValues({ foo: 1, bar: 2 });

    console.log('after set someKey', GM_getValue("someKey"), GM_listValues(), GM_getValues(['foo', 'bar']));

    //GM_removeValueChangeListener(listenerId);
    GM_deleteValue("someKey");
    GM_deleteValues(['foo', 'bar']);

    console.log('after delete someKey', GM_getValue("someKey"), GM_listValues(), GM_getValues(['foo', 'bar']));

    GM_cookie.set({
        url: 'https://example.com/',
        name: 'mycookie',
        value: 'value',
        domain: '.example.com',
        path: '/',
        secure: true,
        httpOnly: true,
        expirationDate: Math.floor(Date.now() / 1000) + (60 * 60 * 24 * 30) // Expires in 30 days
    }, function(error) {
        if (error) {
            console.error('GM_cookie.set', error);
        } else {
            console.log('Cookie set successfully.');
        }
    });

    // 只能对到 httpOnly: false的cookie
    GM_cookie.list({
        name: "mycookie"
    }, function(cookies, error) {
        if (!error) {
            console.log('GM_cookie.list, cookies', cookies);
        } else {
            console.error('GM_cookie.list, error', error);
        }
    });

    GM_cookie.delete({ name: 'mycookie11' }, function(error) {
        if (error) {
            console.error('GM_cookie.delete', error);
        } else {
            console.log('Cookie deleted successfully');
        }
    });

    console.log(window.dayjs(1744189819610).format('YYYY-MM-DD HH:mm:ss'));

    let test = 'liang';
    console.log('window.test', window.test)

    console.log('window', window);
    console.log('document', document);
    let id1 = document.querySelector('div#joinContentApp');
    console.log('id1', id1);
    console.log('unsafeWindow', unsafeWindow);
    //var w = unsafeWindow;
    //console.log(w);
    console.log(window === unsafeWindow)

    window.test2 = '123';
    console.log('after: window.test2 = 123')
    /*unsafeWindow.test2 = '123';
    console.log('after: unsafeWindow.test2 = 123')*/
    console.log('test2', test2);
    console.log('window.test2', window.test2);
    console.log('unsafeWindow.test2', unsafeWindow.test2);

    // Your code here...
})();

 其他

大家都知道,GM_*这些应用程序接口只能在油猴的沙盒模式使用,在沙盒模式除了这些GM_*外,还有一个unsafeWindow,

那沙盒模式下window和unsafeWindow有啥区别?

那哪些属性和方法可以通过window直接访问?

 

posted @ 2025-04-12 23:18  halu126  阅读(154)  评论(0)    收藏  举报