我目前正在尝试在Tampermonkey中为单独的页面创建3个用户脚本.使用GUI,我可以单击"添加新脚本",但是每次我进行更改后保存,它都会重新保存在"我喜欢的新用户脚本"的顶部,并且似乎没有任何重命名方式脚本.
也许我错过了什么?:)
我创建了一个脚本,其中包含一个函数:
function updateGUI(){
document.getElementById("cursoft").value = getSoftware();
document.getElementById("curver").value = getCurrentVersion();
document.getElementById("rcycles").value = getResearchCycles();
document.getElementById("rcycle").value = getCurrentCycle();
document.getElementById("curproc").value = getCurrentProcess();
document.getElementById("curact").value = getCurrentAction();
}
Run Code Online (Sandbox Code Playgroud)
该脚本在页面加载时运行很好,但是当我尝试在脚本完成执行后运行此函数时,它是"未定义".
如何让它"保持"在当前范围内?
我有两个脚本.每个都在我们公司的不同子域上运行"Example.com".
Script #1 -- house.example.com
Script #2 -- bob.fred.example.com
Run Code Online (Sandbox Code Playgroud)
相同的域,不同的子域.
当一个特定元素出现时house.example.com,我需要向运行的脚本发送一条消息bob.fred.example.com
由于Google扩展可以在扩展之间交换消息,因此必须有一种方法可以让TamperMonkey在脚本之间的相同扩展内交换消息 - 特别是如果它们在同一个二级域上运行.
谁能指出我正确的方向?一两个例子就值得用黄金来衡量.
更新:尽管Gothdo将浏览器标签/窗口之间的Javascript通信引用为包含此问题的答案,但他没有考虑所涉及的跨源策略.该引用问题中的答案都没有为跨源浏览器选项卡通信提供明确的答案,这是该问题的主要观点.我现在已经研究并解决了这个问题,从一些SO和非SO来源获取想法.如果重新打开这个问题,我会发布我的解决方案.
使用Tampermonkey可以在Chrome中创建右键菜单选项吗?
我发现GM_registerMenuCommand但它似乎没有在右键菜单中显示任何新项目.
另一个问题是我GM_openInTab在测试脚本中使用但似乎由于某种原因无限循环.它应该只在单击菜单后触发,为什么会发生这种情况?
另外我想知道有没有办法以更高级的方式使用自定义右键单击图标等?
有一个用于Firefox的GM脚本适用于菜单,但在Chrome中似乎没有任何显示,所以有一种方法可以让它工作.
// ==UserScript==
// @name Context Menu
// @namespace http://tampermonkey.net/
// @description Test
// @version 0.1
// @author author
// @include *
// @exclude file://*
// @grant GM_openInTab
// @grant GM_registerMenuCommand
// ==/UserScript==]
(function() {
'use strict';
function test() {
GM_openInTab("https://website.net");
}
GM_registerMenuCommand("hello", test(), "h");
})();
Run Code Online (Sandbox Code Playgroud) 在我的脚本顶部,我有以下内容:
// ==UserScript==
// @name Test script
// @description testing auto-update
// @namespace http://tampermonkey.net/
// @author newbie
// @version 1.0.0
// @updateURL https://github.com/mygithubaccount/test/raw/master/test.user.js
// @downloadURL https://github.com/mygithubaccount/test/raw/master/test.user.js
// @match http://awebsite.com/*
// @run-at document-end
// @grant GM_getResourceText
// @grant GM_addStyle
// @grant GM_xmlhttpRequest
// @grant GM_getResourceURL
// @grant GM_xmlhttpRequest
// ==/UserScript==
Run Code Online (Sandbox Code Playgroud)
请注意,这些值仅作为示例。
当我对脚本进行更改并增加 github 上的版本号,然后将更改推送到 master 时,它会更新原始脚本链接,但是我没有从 Tampermonkey 获得自动更新,就像在弹出窗口中说脚本有更新一样。只有当我手动转到链接并重新安装脚本以更新它时,它才会更新。
如何使用弹出窗口进行此自动更新?
我的问题有两个方面。首先,沙盒模型如何工作,如何影响用户脚本,从网页和用户脚本角度可以访问/看到的内容,以及如果使用其他沙盒模型会影响页面,从而能够注意到脚本已注入到页面中(或不)。其次,如何将脚本注入到页面中,并且页面可以检测到它?
据我所知,当您使用时@grant none,沙箱已禁用,您将可以访问该网页及其javascript。如果您对javascript和/或DOM进行了任何更改,则该页面可能会检测到它。
我的理解是,如果使用的话@grant unsafeWindow,您的脚本将被隔离在自己的js上下文中,您所做的任何事情window都不会被网页看到,但是您可以通过来访问网页和javascript unsafeWindow。您将具有对DOM的常规访问权限,例如document返回常规页面文档,而无需说unsafeWindow.document。显然,您对DOM或页面js上下文所做的任何更改(例如unsafeWindow.foo = 'bar';)仍然可以检测到。其原因unsafe不是因为是否被检测到,而是因为您有可能GM_*在此模式下使不受信任的页面访问特权功能(在常规模式下不授予特权功能,这意味着@grant GM_*因为任何功能都会隔离js上下文,除非您(@grant unsafeWindow),否则您将无法访问页面的js上下文
如何将脚本注入页面?网页是否可能注意到用户脚本注入(假设用户脚本修改了页面上的NOTHING)。
例如,如果脚本是使用script标记注入的,那么我认为该页面可能会注意到脚本注入,甚至可以查看其代码吗?
沙盒模型在这种情况发生过程中是否具有任何作用,并使它“更安全”而不被看到?例如,如果您使用来隔离js上下文@grant unsafeWindow,那么网页上的js甚至可能看不到任何用户脚本加载事件,因此@grant unsafeWindow从根本上更安全,除非您去修改DOM或unsafeWindow当然。
我还假设不存在特殊功能,对象,属性等的泄漏(例如GM_info泄露到tampermonkey存在的网页上)。既不在@grant none模式@grant unsafeWindow下也不在模式下(前提是您没有向页面泄漏任何内容)
unsafeWindow只要您不修改任何内容(尤其是不要将特权GM_*函数暴露给unsafeWindow),这会让我觉得实际上在被检测到方面更安全(因为js上下文是隔离的)。例如,如果在@grant none模式下使用eventListener ,则可能会检测到它,但如果在@grant unsafeWindow模式下使用,则可能由于隔离而无法检测到它?此外,如果某个页面有可能检测到用户脚本加载(我不知道这是否可能实现),那么它将不知道js上下文是否隔离
简要总结一下,如果您不背叛页面,那么页面是否可以检测到用户脚本或tampermonkey的存在?
我的上述任何想法在任何领域都是错误的吗?如果是,那么它实际上是如何工作的?
一些需要澄清的信息:
用户脚本仅从页面被动地读取信息(可能使用MutationObserver)。它不会以任何方式改变任何内容,不使用任何js库(既不在用户脚本中也不从网页中使用),没有ajax调用,没有脚本节点,绝对没有单击等。脚本可以从JS vars中读取一些信息页面(假设那些var和函数没有被诱杀),以及使用WebSocket(内部服务)。也使用IIFE。因此,主要的问题是,篡改猴子本身 …
我在浏览器调试器的打开文件...框中找不到我的用户脚本(名称定义在// @name)。
似乎Annarfych 的回答和Hjulle对如何使用 Firebug 扩展调试 Greasemonkey 脚本的回答?不要再工作了。
由于迈克尔对Greasemonkey 脚本文件夹丢失的发现?
显然 GreaseMonkey 不再
gm_scripts为 Firefox存储用户脚本。[...] 脚本显然存储在 SQLite 数据库文件中。
当我无法访问原始源代码时,如何使用用户脚本(例如 Tampermonkey 注入的代码)修改 React 组件而不破坏应用程序?
直接修改 React 组件的 DOM 可能会破坏应用程序,因为协调算法可能会因手动 DOM 更改而感到困惑。因此,我想修改我的用户脚本中的 React 组件,以便 React 可以不受阻碍地继续渲染。
在一个简单的设置中,React 会发现全局命名空间中的组件,我们可以轻松修改组件(请参阅此小提琴以获取工作示例):
oldComponent = Component
function Component(props) {
// modify the props to change the appearance of the component
return oldComponent(modifiedProps);
}
Run Code Online (Sandbox Code Playgroud)
然而,部署应用程序时情况会更加复杂,因为组件通常使用webpack进行捆绑。我如何能够在组件已捆绑的应用程序中重现上面的示例?
我正在努力解决我的脚本问题。无论我尝试做什么,GM.xmlHttpRequest 都会抛出错误“不是函数”。
我的其余代码工作正常。
这是我的代码的删节版本:
// ==UserScript==
// @name FUT20 Autobuyer Menu
// @namespace http://tampermonkey.net/
// @version 0.6
// @description try to take over the world!
// @author Rastor
// @match https://www.easports.com/uk/fifa/ultimate-team/web-app/*
// @match https://www.easports.com/fifa/ultimate-team/web-app/*
// @grant GM.xmlHttpRequest
// ==/UserScript==
try {
GM.xmlHttpRequest({
method: "GET",
url: "http://www.example.com/",
onload: function(response) {
alert(response.responseText);
}
});
}
catch (err) {
console.log(err);
}
Run Code Online (Sandbox Code Playgroud) 我有一个用 TamperMonkey 编写的非常简单的用户脚本,我希望它在 chrome 新标签页上运行。
根据此站点,无法在新标签页上运行用户脚本:
新标签页的 URL 是“chrome://newtab/”,Chrome 不允许扩展程序将脚本注入该页面。
但是如果我在标题部分指定,我的脚本运行良好
// @match *://*/*
Run Code Online (Sandbox Code Playgroud)
匹配所有页面。不过,我宁愿代码只在新标签页上运行,这可能吗?
注意。这是完整的脚本:Chrome 版本 59.0.3071.115
// ==UserScript==
// @name Hide Buttons
// @namespace http://tampermonkey.net/
// @version 0.1
// @description Test script
// @author Greedo
// @match *://*/*
// @grant none
// ==/UserScript==
(function(window, chrome) {
"use strict";
var doc = window.document;
doc.getElementById("mv-tiles").style.opacity = "0";
doc.getElementById("f").style.opacity = "0.1";
}(window, chrome));
Run Code Online (Sandbox Code Playgroud) tampermonkey ×10
javascript ×7
userscripts ×5
greasemonkey ×2
debugging ×1
firefox-57+ ×1
jquery ×1
reactjs ×1
sandbox ×1
webpack ×1