-1

내가 원하는 것은 정말 간단합니다. 페이지에서 보낸 xmlHttpRequests를 차단하고이를 로컬 서버로 보내 텍스트 파일에 기록하십시오. 하지만 분명히 Ajax 호출은 이벤트 리스너에서 작동하지 않습니다 ... 여러 가지 솔루션을 찾고 시도해 보았습니다. 해결책을 찾던 내 하루 종일 보냈습니다. 코드는 다음과 같습니다.GM_xmlHttpRequest POST가 이벤트 리스너에서 작동하지 않습니다.

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 아이디어는 greasemonkey 스크립트가 즉시 실행되고 중지되므로 그 사람이 addevent listener를 사용하는 것은 불가능하다고 말하는 사이트에서 발생합니다.

오류 콘솔에 오류가없고 내 요청은 이벤트 수신기 외부에서 작동합니다.

는 어떤 도움 ^^

답변

0

을 원래의 아이디어가 올바른지 평가. 그러나 몇 가지를 추가해야합니다.

  • @run-at document-start 메타를 추가하면 페이지에서 아약스 요청을 보내기 전에 시작됩니다.
  • 샌드 박스가 아닌 실제 윈도우 범위 (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); 
}; 
관련 문제