我一直在尝试使用Devtools '复制作为获取'获取一些URL,但我看不到任何响应。如果我尝试重播xhr,它会工作。这很奇怪,因为它不适用于这个特定的网站,但如果我尝试'复制作为获取'在其他一些网站上,它确实会带来结果。
我想做的是抓住响应主体并以其他方式显示它(这是一个日程安排软件,我试图修改它显示日历视图的方式,因为它将所有内容显示在一起)。
我有一个扩展,使我能够修改XMLHttpRequest,这样我就可以得到任何XHR的响应,但由于第一个异步执行之前,我注入脚本,那么我总是错过了第一个。
我计划使用chrome webRequest来停止第一个并再次获取它。
manifest.json
{
"name": "jobber",
"version": "2.0",
"description": "Build an Extension!",
"manifest_version": 2,
"permissions": [
"webNavigation",
"webRequest",
"*://secure.name.com/*"
],
"content_scripts": [{
"matches": ["*://secure.name.com/calendar*"],
"js": ["contents.js"],
"run-at": "document_start"
}],
"externally_connectable": {
"matches": ["*://secure.name.com/calendar*"]
},
"background": {
"scripts": ["background.js"]
}
}
contents.js
(function () {
'use strict';
let s = document.createElement("script");
s.textContent = overloadXHR();
document.head.insertBefore(s, document.head.children[0]);
s = document.createElement("script");
s.textContent = displayCalendar;
document.head.insertBefore(s, document.head.children[0]);
})();
function overloadXHR() {
const text = `
console.log(\`overriding: \${Date.now()}\`);
const rawOpen = XMLHttpRequest.prototype.open;
let json = [];
(function(){
XMLHttpRequest.prototype.open = function () {
this.addEventListener("readystatechange", e => {
if (/secure.name.com.calendar.*?calendar=true/i.test(this.responseURL)) {
if ((this.status == 200) && (this.readyState == 4)) {
console.log(this.readyState);
try {
json = JSON.parse(this.response);
window.setTimeout(() => (window.displayCalendar({json}))({json}), 1000);
}
catch (e) { console.log(e); }
}
}
});
rawOpen.apply(this, arguments);
}
}())
`;
return text;
}
function displayCalendar({ json }) {
// do something
}
我也试过POST请求。我可以看到它们会起作用,但没有给出任何响应。
- 原始请求:
- 复制为提取
- 复制为提取响应
- 复制为提取定时
1条答案
按热度按时间svmlkihl1#
解决此问题的一种方法是添加以下内容之一:
或
在控制台中的
fetch
表达式之后