我正在编写一个注入网页的用户脚本.该脚本从Web服务器读取一些数据,我想将消息发送到侦听应用程序以对数据做出反应.
现在,我正在做的就是尝试将一个字符串命令发送到我的监听应用程序,看看我是否可以读取它.我的代码在注入之前工作,但之后我得到一个"未定义的引用错误".
我怀疑这与"Greasemonkey访问违规"有关.但是,我一直无法找到有效的解决方案.我正在开发Chrome.
这是我无法工作的代码部分.
GM_xmlhttpRequest({
method: "POST",
url: "http://localhost:7777",
data: "testing123",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
onload: function(response)
{
if (response.responseText.indexOf("TEST") > -1)
{
console.log("Response confirmed...");
}
}
});
Run Code Online (Sandbox Code Playgroud)
我对脚本很新,所以也许我错过了一些明显的东西.如何在注入的代码中使用它?
我目前正在尝试在Tampermonkey中为单独的页面创建3个用户脚本.使用GUI,我可以单击"添加新脚本",但是每次我进行更改后保存,它都会重新保存在"我喜欢的新用户脚本"的顶部,并且似乎没有任何重命名方式脚本.
也许我错过了什么?:)
我正在编写一个greasemonkey脚本来操作DOM,查询服务器并在单独的jquery对话框中显示结果.我想为它添加以下两个功能:
我面临的问题是我想在对话框的ui-dialog-buttonpane区域中包含这两个区域,在关闭按钮的左侧,但我无法弄清楚如何做到这一点.
我所知道的是我可以使用window.find()(这里使用http://www.javascripter.net/faq/searchin.htm)来启用浏览器查找功能.
有人可以帮我弄这个吗 ?以下是我现有的greasemonkey脚本的代码:
// ==UserScript==
// @name Query for each URL Asynchronously
// @namespace SupportScript
// @include *
// @require https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js
// @require https://ajax.googleapis.com/ajax/libs/jquery/ui/1.11.0/jquery-ui.min.js
// @resource jqUI_CSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.11.3/themes/redmond/jquery-ui.css
// @grant GM_addStyle
// @grant GM_getResourceText
// @grant GM_getResourceURL
// @run-at document-end
// allow pasting
// ==/UserScript==
var snapshotResults = document.evaluate('//a[contains(@href,"http")]/@href', document, null, XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE, null);
var windowWidth = $(window).width()-800;
var windowHeight = $(window).height();
var zNode = document.createElement ('input');
zNode.setAttribute ('id', 'SSButton');
zNode.setAttribute( …Run Code Online (Sandbox Code Playgroud) 微软是否宣布Edge是否支持用户脚本?通过插件(类似于Firefox中的Greasemonkey或Chrome中的Tampermonkey)或作为开箱即用的功能无关紧要.
javascript browser userscripts microsoft-edge microsoft-edge-extension
我想使用Git来促进我的用户脚本的开发(21).另外,我也希望将它们托管在GitHub中.(在Windows 10中使用Greasemonkey和Firefox).
所以,我的问题是:使用Git管理我的用户脚本的建议方法是什么,以便在GitHub中托管它们?
保留一个单独的文件夹(例如c:\my_scripts,它将是我的repo文件夹),其中包含我的userscripts文件的副本,
即每次我更改我的一个用户脚本文件(位于gm_scripts)时,
我必须手动将其复制gm_scripts\script_subfolder到my_scripts?
将我的所有用户脚本放在同一个单独的文件夹(我的repo文件夹)中,
并将它们链接到该gm_scripts文件夹(在.bat文件中使用mklink -symbolic links),正如我在这个答案中读到的那样?
gm_scripts内容的存储库?gm_scripts,除了我的21个用户脚本,我还安装了许多其他脚本,我必须将其包含在我的.gitignore文件中)我注意到许多用户脚本的两位作者的回购:@Mottie和@jerone,他们在GitHub中托管了许多用户脚本,但他们遵循不同的方法:
Mottie的用户脚本都位于repo的根文件夹中(只是.js文件,没有子文件夹),(截图)
而jerone的用户脚本位于repo中的每个子文件夹中(截图).
我的猜测是,Mottie将他所有的用户脚本放在同一个单独的文件夹(这是repo)中,并将它们链接到该gm_scripts文件夹,
而jerone要么只保留一个单独的文件夹作为回购,带有他的脚本的副本,
或者有他的回购包含的gm_scripts文件夹
(但是,jerone的的.gitignore不包含在gm_folder这些文件应该被忽视,如条目.db,.wal,.shm,config.xml …
我的问题有两个方面。首先,沙盒模型如何工作,如何影响用户脚本,从网页和用户脚本角度可以访问/看到的内容,以及如果使用其他沙盒模型会影响页面,从而能够注意到脚本已注入到页面中(或不)。其次,如何将脚本注入到页面中,并且页面可以检测到它?
据我所知,当您使用时@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。因此,主要的问题是,篡改猴子本身 …
我已将问题区域缩小到以下功能.这是我写的用户脚本的一部分.它在Chrome中完美运行,但在Firefox/Greasemonkey中根本不起作用.我整天都在修补它并撞到了一堵砖墙.唯一有意义的是,如果JSON.parse不能正常工作,这是有道理的,因为已知Chrome处理JSON.parse有点不同......但我知道JSON完美形成!
function getTagline() {
var jsonfile = new XMLHttpRequest();
jsonfile.open("GET", "http://example.com/somegood.json", true);
jsonfile.onreadystatechange = function() {
if (jsonfile.readyState == 4) {
if (jsonfile.status == 200) {
var taglines = JSON.parse(jsonfile.responseText);
var choose = Math.floor(Math.random() * taglines.length);
var tagline = document.createTextNode(taglines[choose].metais);
insertTagline(tagline);
}
}
};
jsonfile.send(null);
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
我有一个用户脚本(用于chrome和FF),它为页面添加了重要功能,但最近因为开发人员向页面添加了一些AJAX而被破坏.我想修改脚本来监听页面xmlhttp请求,这样我就可以根据responseText页面接收的JSON格式动态更新我添加的内容.
搜索已经发现了许多应该工作的功能,并且在控制台中运行时可以正常工作.但是,它们不会从用户脚本的上下文中执行任何操作.
(function(open) {
XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
this.addEventListener("readystatechange", function() {
console.log(this.readyState);
}, false);
open.call(this, method, url, async, user, pass);
};
})(XMLHttpRequest.prototype.open);
Run Code Online (Sandbox Code Playgroud)
来自:如何从Greasemonkey脚本拦截XMLHttpRequests?
这工作完全在控制台中,我可以改变this.readyState,以this.responseText和它的伟大工程(尽管在剧本我需要它来打开JSON数据转换成一个对象,然后让我userscript内操纵它.不只是写到控制台) .但是,如果我将其粘贴到用户脚本中没有任何反应.页面上的xmlhttp请求似乎没有被usercript中的事件处理程序检测到.
执行请求的页面使用jquery $ .get()函数,如果它可能与它有任何关系.虽然我不这么认为.
我无法想象没有办法,似乎在AJAX页面上运行的任何用户脚本都需要这种能力.
我正试图在我的小型1024x768屏幕上使Gmail的新外观可用 - 默认布局只留下一个小窗口的消息,被不动的元素包围.滚动那个小窗口非常烦人.
我已经成功地使整个页面滚动使用时尚的用户样式(修改后的版本这一个):
@-moz-document domain('mail.google.com'),
url-prefix('https://mail.google.com/mail') {
.akc.lKgBkb,
.oLaOvc.aeJ,
.lKgBkb.nH.oy8Mbf,
.lKgBkb.ajl.aib
{
height: auto !important;
overflow: hidden !important;
}
#canvas_frame { overflow-y: scroll; }
.l2 { padding-bottom: 20px !important; }
}
Run Code Online (Sandbox Code Playgroud)
应该具有滚动条的元素现在具有height: auto,并且滚动的是整个外部页面(in #canvas-frame)应该保持静态.
我对这种效果感到非常满意 - 它的效果几乎与旧的Gmail一样.但是,存在一个问题 - 用键盘滚动(箭头键,PgUp/PgDn,Home/End)停止工作.关于如何解决这个问题的任何想法?
我在让脚本自动更新时遇到问题.如果我强制检查更新,那么它就可以很好地获取新版本.但是,我无法在新的更新可用时自动通知我.
我的脚本具有以下元数据:
// ==UserScript==
// @name PortalScript
// @namespace PortalScript
// @version 2.1.0.9
// @description Contains customizations to be applied to the portal
// @author Tristan Lee
// @match https://test-support.portal.dev
// @grant none
// @downloadURL https://rawgit.com/tristanlee85/supportportal/master/supportportal.js
// @updateURL https://rawgit.com/tristanlee85/supportportal/master/supportportal.js
// ==/UserScript==
Run Code Online (Sandbox Code Playgroud)
Tampermonkey设置为每小时检查更新.但是,存储库中的版本可能是2.1.0.10,但自版本更改后数小时后,我从未收到有关更新可用的通知.
我也不认为这@updateURL是必要的,因为@downloadURL指定,但我添加它作为检查,因为只是@downloadURL没有工作.
userscripts ×10
javascript ×5
greasemonkey ×3
tampermonkey ×3
ajax ×1
browser ×1
css ×1
firefox ×1
git ×1
github ×1
jquery ×1
jquery-ui ×1
json ×1
sandbox ×1