capture a pages xmlhttp requests with a userscript

后端 未结 1 400
情话喂你
情话喂你 2021-01-05 06:18

I have a user script (for chrome and FF) that adds significant functionality to a page, but has recently been broken because the developers added some AJAX to the page. I wo

相关标签:
1条回答
  • 2021-01-05 07:16

    Since the page uses $.get(), it's even easier to intercept requests. Use ajaxSuccess().

    This will work in a Greasemonkey(Firefox) script:
    Snippet 1:

    unsafeWindow.$('body').ajaxSuccess (
        function (event, requestData)
        {
            console.log (requestData.responseText);
        }
    );
    

    Assuming the page uses jQuery in the normal way ($ is defined, etc.).


    This should work in a Chrome userscript (as well as Greasemonkey):
    Snippet 2:

    function interceptAjax () {
        $('body').ajaxSuccess (
            function (event, requestData)
            {
                console.log (requestData.responseText);
            }
        );
    }
    
    function addJS_Node (text, s_URL, funcToRun) {
        var D                                   = document;
        var scriptNode                          = D.createElement ('script');
        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);
    }
    
    addJS_Node (null, null, interceptAjax);
    



    Re:

    "But how then do I get that data to the script? ... (So I can) use the data later in the script."

    This works in Greasemonkey(Firefox); it might also work in Chrome's Tampermonkey:
    Snippet 3:

    function myAjaxHandler (requestData) {
        console.log ('myAjaxHandler: ', requestData.responseText);
    }
    
    unsafeWindow.$('body').ajaxSuccess (
        function (event, requestData) {
            myAjaxHandler (requestData);
        }
    );
    


    But, if it doesn't then you cannot share JS information (easily) between a Chrome userscript and the target page -- by design.

    Typically what you do is inject your entire userscript, so that everything runs in the page scope. Like so:
    Snippet 4:

    function scriptWrapper () {
    
        //--- Intercept Ajax
        $('body').ajaxSuccess (
            function (event, requestData) {
                doStuffWithAjax (requestData);
            }
        );
    
        function doStuffWithAjax (requestData) {
            console.log ('doStuffWithAjax: ', requestData.responseText);
        }
    
        //--- DO YOUR OTHER STUFF HERE.
        console.log ('Doing stuff outside Ajax.');
    }
    
    function addJS_Node (text, s_URL, funcToRun) {
        var D                                   = document;
        var scriptNode                          = D.createElement ('script');
        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);
    }
    
    addJS_Node (null, null, scriptWrapper);
    
    0 讨论(0)
提交回复
热议问题