Greasemonkeyを使用してAJAXリクエストの内容をキャプチャしたいと思います。
誰かがこれを行う方法を知っていますか?
受け入れられた答えはほぼ正しいですが、わずかな改善を使用できます。
(function(open) {
XMLHttpRequest.prototype.open = function() {
this.addEventListener("readystatechange", function() {
console.log(this.readyState);
}, false);
open.apply(this, arguments);
};
})(XMLHttpRequest.prototype.open);
呼び出しよりも apply + 引数を使用することをお勧めします。なぜなら、open に与えられているすべての引数が変更される可能性があることを明示的に知る必要がないからです!
XMLHttpRequest.prototype.open または send メソッドを、独自のコールバックを設定して元のメソッドを呼び出す置換で変更するのはどうですか? コールバックはその役割を果たし、指定された元のコードでコールバックを呼び出すことができます。
言い換えると:
XMLHttpRequest.prototype.realOpen = XMLHttpRequest.prototype.open;
var myOpen = function(method, url, async, user, password) {
//do whatever mucking around you want here, e.g.
//changing the onload callback to your own version
//call original
this.realOpen (method, url, async, user, password);
}
//ensure all XMLHttpRequests use our custom open method
XMLHttpRequest.prototype.open = myOpen ;
ドキュメント内のunsafeWindow.XMLHttpRequestオブジェクトをラッパーに置き換えることができます。小さなコード(テストされていません):
var oldFunction = unsafeWindow.XMLHttpRequest;
unsafeWindow.XMLHttpRequest = function() {
alert("Hijacked! XHR was constructed.");
var xhr = oldFunction();
return {
open: function(method, url, async, user, password) {
alert("Hijacked! xhr.open().");
return xhr.open(method, url, async, user, password);
}
// TODO: include other xhr methods and properties
};
};
ただし、これには小さな問題が1つあります。Greasemonkeyスクリプトはページの読み込み後に実行されるため、ページは読み込みシーケンス中に元のXMLHttpRequestオブジェクトを使用または保存できるため、スクリプトの実行前、または実際のXMLHttpRequestオブジェクトで行われたリクエストは追跡されません。スクリプトによって。この制限を回避するために私が見ることができる方法はありません。
グリースモンキーでそれができるかどうかはわかりませんが、拡張機能を作成すると、オブザーバーサービスとhttp-on-examine-responseオブザーバーを使用できます。