Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么将grant从none更改为GM_xmlhttpRequest会破坏我的代码?_Javascript_Facebook_Greasemonkey_Userscripts_Tampermonkey - Fatal编程技术网

Javascript 为什么将grant从none更改为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域名以外的所有领域。我相信

简言之,我想将其发送到我的应用程序,而不是通知URL和响应主体。这段代码可以工作,但除非我授权,否则我不能使用GM_xmlhttpRequest

不做任何改变,代码就会神奇地中断。我不确定发生了什么变化以及如何修复。我想我可以使用
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);
}