简介

经常需要对xhr的数据进行抓包或者获取其数据,但是由于xhr的实现方式,我们很难直接hook到xhr的回调函数,这时我们可以使用如下代码,对xhr进行hook来拿到xhr的返回数据。可以用于常见的自动化工具来执行,如phantomjs、selenium、puppeteer、playwright、队长模块、油猴等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
window.hooks_response = [];
function addXMLRequestCallback(callback) {
var oldSend, i;
if (XMLHttpRequest.callbacks) {
XMLHttpRequest.callbacks.push(callback);
} else {
XMLHttpRequest.callbacks = [callback];
oldSend = XMLHttpRequest.prototype.send;
XMLHttpRequest.prototype.send = function () {
for (i = 0; i < XMLHttpRequest.callbacks.length; i++) {
XMLHttpRequest.callbacks[i](this);
}
oldSend.apply(this, arguments);
}
}
}

function hook_xhr() {
addXMLRequestCallback(function (xhr) {
xhr.addEventListener("load", function () {
if (xhr.readyState == 4 && xhr.status == 200) {
// 可以在这里对xhr.responseText进行二次处理或添加条件只获取你想要的数据
window.hooks_response.push({ 'responseURL': xhr.responseURL, 'responseText': xhr.responseText });
}
});
});
}

在页面加载前或点击等操作前执行本代码,后续执行 return window.hooks_response 即可获取到xhr的返回数据。