Javascript 为什么将grant从none更改为GM_xmlhttpRequest会破坏我的代码?
简言之,我想将其发送到我的应用程序,而不是通知URL和响应主体。这段代码可以工作,但除非我授权,否则我不能使用GM_xmlhttpRequest 不做任何改变,代码就会神奇地中断。我不确定发生了什么变化以及如何修复。我想我可以使用Javascript 为什么将grant从none更改为GM_xmlhttpRequest会破坏我的代码?,javascript,facebook,greasemonkey,userscripts,tampermonkey,Javascript,Facebook,Greasemonkey,Userscripts,Tampermonkey,简言之,我想将其发送到我的应用程序,而不是通知URL和响应主体。这段代码可以工作,但除非我授权,否则我不能使用GM_xmlhttpRequest 不做任何改变,代码就会神奇地中断。我不确定发生了什么变化以及如何修复。我想我可以使用console.log并将数据复制/粘贴到我的应用程序中,但是Facebook禁用了console.log 我曾想过做xmlhttpRequest,但不知何故也被阻止了。我通过在控制台中执行代码进行了测试。这三行代码似乎适用于除Facebook域名以外的所有领域。我相信
console.log
并将数据复制/粘贴到我的应用程序中,但是Facebook禁用了console.log
我曾想过做xmlhttpRequest,但不知何故也被阻止了。我通过在控制台中执行代码进行了测试。这三行代码似乎适用于除Facebook域名以外的所有领域。我相信这和CORS有关
// ==UserScript==
// @name FBTest
// @namespace test
// @include https://*.facebook.com/*
// @version 1
// @grant none
// ==/UserScript==
//change none to GM_xmlhttpRequest
(function() {
var proxied = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function(method, url) {
alert(url);
return proxied.apply(this, [].slice.call(arguments));
};
})();
当您授予GM_xmlhttpRequest时,--这意味着您不能像这样访问
window.xmlhttpRequest
,因为它现在处于不同的上下文中
要解决此问题,请使用拦截AJAX。并且,使用或自定义事件来访问userscript上下文中的数据
下面是一个使用自定义事件的示例脚本(不易受第三方攻击):
使用而不是
window.XMLHttpRequest
@Mottie-代码试图“截取”XMLHttpRequest的打开函数,而不是实际使用XMLHttpRequest问题源于这样一个事实,即任何带有@grant any的脚本都在更安全的范围内运行。我最初认为您可以使用unsafeWindow而不是window-但是,这也不起作用,因为。由于open
代码运行在特权范围内,因此open
在页面中变得不可用。使用或仅供参考,这样做您会更幸运,document.head从4.0开始就出现在firefox中-不需要getElementsByTagName
anymore@JaromandaX,除非脚本运行时没有确切的1个
存在。我从未考虑过这一点顺便说一句,答案很好,对我也有帮助:pAlso,这个函数早于FF 4和文档。head
需要IE9或更高版本。还不允许放弃早期的IE支持。我没有意识到我所有的数据都必须在详细信息中。在我发现这个解决方案有效后。
// ==UserScript==
// @name _Intercept AJAX with grant/sandbox on
// @match https://*.facebook.com/*
// @grant GM_xmlhttpRequest
// ==/UserScript==
function xmlOpenIntercept () {
var proxied = window.XMLHttpRequest.prototype.open;
window.XMLHttpRequest.prototype.open = function (method, newUrl) {
var cEvnt = new CustomEvent ('newAjaxStart', {'detail': newUrl} );
document.body.dispatchEvent (cEvnt);
return proxied.apply (this, [].slice.call (arguments) );
};
}
addJS_Node (null, null, xmlOpenIntercept); //-- Injects code
//--- This code listens for the right kind of message.
document.body.addEventListener ("newAjaxStart", receiveAjaxMessage);
function receiveAjaxMessage (zEvent) {
console.log ("Intercepted AJAX to: ", zEvent.detail);
}
function addJS_Node (text, s_URL, funcToRun, runOnLoad) {
var D = document;
var scriptNode = D.createElement ('script');
if (runOnLoad) scriptNode.addEventListener ("load", runOnLoad);
scriptNode.type = "text/javascript";
if (text) scriptNode.textContent = text;
if (s_URL) scriptNode.src = s_URL;
if (funcToRun) scriptNode.textContent = '(' + funcToRun.toString() + ')()';
var targ = D.getElementsByTagName ('head')[0] || D.body || D.documentElement;
targ.appendChild (scriptNode);
}