油猴GM_*使用
参考
tampermonkey文档
https://www.tampermonkey.net/documentation.php
https://learn.scriptcat.org/
tampermonkey版本
v5.3.3
测试网址
例子
// ==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直接访问?