为什么将grant从none更改为GM_xmlhttpRequest会破坏我的代码?

时间:2016-11-16 03:26:46

标签: javascript facebook greasemonkey userscripts tampermonkey

简而言之,我不想提醒网址和响应正文,而是将其发送到我的应用。这段代码可以使用,但我不能使用GM_xmlhttpRequest,除非我授予它。

改变其他任何代码神奇地破坏了。我不确定改变了什么以及如何修复它。我以为我可以使用readJPEG并将数据复制/粘贴到我的应用中,但Facebook禁用了console.log。

我考虑过做xmlhttpRequest,但这也被阻止了。我通过在控制台中执行代码进行测试。除了Facebook域外,这三条线似乎无处不在。我相信这与CORS有关。

console.log

1 个答案:

答案 0 :(得分:4)

当您授予GM_xmlhttpRequest时,it switches on the sandbox - 这意味着您无法像现在这样在不同的上下文中访问window.XMLHttpRequest

要解决此问题,请使用script injection拦截AJAX。并且,使用messaging或自定义事件来访问用户脚本上下文中的数据。

以下是使用自定义事件的示例脚本(不易受第三方漏洞攻击):

// ==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);
}