繁体   English   中英

GM_xmlHttpRequest POST在事件侦听器中不起作用

[英]GM_xmlHttpRequest POST doesn't work in event listener

我想要的实际上很简单:拦截页面发送的xmlHttpRequests并将它们发送到我的本地服务器以将其记录在文本文件中。 但是显然,Ajax调用在事件侦听器中不起作用...我找到了几种解决方案,并反复尝试,反复尝试...花了整整一天时间寻找解决方案。 这是代码:

var ajaxQueue = [];
var processAjaxQueue = function(){
  if (ajaxQueue.length > 0) {
    for (ajax in ajaxQueue) {
      var obj = ajaxQueue[ajax];
      setTimeOut(function(){GM_xmlhttpRequest(obj);},0);
    }
    ajaxQueue = [];
  }
}
setInterval(function(){
  processAjaxQueue();
}, 100);
function gmAjax(obj){
  ajaxQueue.push(obj);
}

function envoiData(donnees)
{
                setTimeout(function() {gmAjax({
                    method: "POST",
                    url: "http://127.0.0.1/log/index.php",
                    data: "prix="+donnees,
                    headers: {"Content-Type": "application/x-www-form-urlencoded"},
                    onload: function(reponse){alert('Chargé ! '+reponse.responseText);}
                });}, 0);
}

(function(open) {
    XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
        this.addEventListener("readystatechange", function() {
            console.log(this.readyState);
            if(this.readyState == 4)
            {
                alert(this.responseText);
                envoiData(this.responseText);
        }
        }, false);
        open.call(this, method, url, async, user, pass);
    };
})(XMLHttpRequest.prototype.open);

我真的不明白问题是什么。 gmAjax的想法来自一个网站,那里的人说,研究人员可以立即执行并停止油脂脚本,因此不可能使用addevent监听器。

我在错误控制台中没有错误,并且在事件侦听器之外时我的请求可以正常工作。

任何帮助表示赞赏^^

最初的想法是正确的。 但是,您需要添加一些内容。

  • 添加@run-at document-start元数据,以便在该页面发送任何ajax请求之前启动loggin。
  • 您需要在实际的窗口范围(unsafeWindow)中而不是在沙箱中使用XMLHttpRequest进行操作。

因此,结果代码为:

// ==UserScript==
// @run-at document-start
// @grant unsafeWindow
// ==/UserScript==

var unsafe = unsafeWindow;

... // keep your ajax queue code here

var oldOpen = unsafe.XMLHttpRequest.prototype.open;

unsafe.XMLHttpRequest.prototype.open = function(method, url, async, user, pass) {
    this.addEventListener("readystatechange", function() {
        if(this.readyState == 4)
        {
            alert(this.responseText);
            envoiData(this.responseText);
    }
    }, false);
    oldOpen.call(this, method, url, async, user, pass);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM