我试图操纵一个网站使用 Greasemonkey(安装版本 4.9)完成的 XMLHttpRequest。拦截应该很简单(如何从 Greasemonkey 脚本中拦截 XMLHttpRequests?)但对我不起作用。也许新版本的 Greasemonkey 改变了?
我显然尝试了链接问题中的示例,但它们没有任何效果 - 尽管我的console.log(...)
自定义打开功能中有一个,但控制台中没有打印任何内容。
接下来,我unsafeWindow
试了一下。它不应该是必需的。我的用户脚本运行@grant none
和文档(见 这里)说我的脚本应该在内容范围内运行。
有了unsafeWindow
效果,但它完全破坏了 XMLHttpRequest
// ==UserScript==
// @name Test
// @version 1
// @include *
// @run-at document-start
// @grant none
// ==/UserScript==
"use strict";
let realOpen = unsafeWindow.XMLHttpRequest.prototype.open
console.log("Real: " + realOpen)
unsafeWindow.XMLHttpRequest.prototype.open = function() {
console.log("Called for " + this + " with URL: " + arguments[0])
//call original
return realOpen.apply(this, arguments)
};
window.addEventListener ("load", function() {
console.log ("Page loaded");
});
console.log("Unsafe: ", unsafeWindow.XMLHttpRequest.prototype.open.toString())
console.log("Normal: ", XMLHttpRequest.prototype.open.toString())
这在控制台中提供以下输出:
Real: function open() {
[native code]
}
Unsafe: function() {
console.log("Called for " + this + " with URL: " + arguments[0])
//call original
return realOpen.apply(this, arguments)
}
Normal: function open(method, url) {
// only include method and url parameters so the function length is set properly
if (arguments.length >= 2) {
let newUrl = new URL(arguments[1], document.location.href);
arguments[1] = newUrl.toString();
}
return origOpen.apply(this, arguments);
}
==> Page loaded
如前所述,XMLHttpRequest 的功能被破坏了。当我使用 Firefox 开发者控制台进一步查看时,我得到了这个
>> window.XMLHttpRequest.prototype.open
Restricted { }
任何设置在window
(like window.foobar = "foobar"
) 上的属性在控制台中都不存在,但那些设置在上面unsafeWindow
。我认为这与 Greasemonkey 的沙盒有关。
为什么即使我使用 XMLHttpRequest 也有两个版本@grant none
?为什么我的自定义功能受到限制?我可以避免吗?为什么我在窗口上安装事件侦听器时它可以正常工作?