您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Monitor Fetch, XHR and websocket calls
// ==UserScript== // @name Network Call Listener // @namespace hardy.network.monitor // @version 0.3 // @description Monitor Fetch, XHR and websocket calls // @author Hardy [2131687] // @match *://*/* // @grant none // @run-at document-start // ==/UserScript== (function() { 'use strict'; let xhrListener = false; let fetchListener = false; let websocketListener = false; function addXHRListener() { if (xhrListener === true) return; const origOpen = XMLHttpRequest.prototype.open; const origSend = XMLHttpRequest.prototype.send; window.XMLHttpRequest.prototype.open = function() { this.url = arguments[1]; this.addEventListener('load', function() { let detail = {}; detail.callType = "xhr"; detail.url = this.url; detail.body = this.requestBody; if (this.responseType === "" || this.responseType === "text") { detail.response = this.responseText; } else { detail.response = this.response; } //whatever the response was window.dispatchEvent(new CustomEvent("hardy-xhr", { detail })); }); return origOpen.apply(this, arguments); }; window.XMLHttpRequest.prototype.send = function (body) { this.requestBody = body; return origSend.apply(this, arguments); }; xhrListener = true; } function addFetchListener() { if (fetchListener === true) return; fetchListener = true; let original_fetch = window.fetch; window.fetch = async (url, init) => { let returned = await original_fetch(url, init) let copy = returned.clone(); let detail = {}; detail.callType = "fetch"; try { let response = await copy.text(); if (isJsonString(response)) { let data = JSON.parse(response); detail.response = data; detail.url = url; detail.body = {}; if (init.body) { try { for (const key of init.body.keys()) { detail.body[key] = init.body.get(key); } } catch(error) {} } window.dispatchEvent(new CustomEvent("hardy-fetch", {"detail": detail})); } else { detail.response = response; detail.url = url; detail.body = {}; if (init.body) { try { for (const key of init.body.keys()) { detail.body[key] = init.body.get(key); } } catch(error) {} } window.dispatchEvent(new CustomEvent("hardy-fetch", {"detail": detail})); } } catch (error) {} return returned; } } function addWebsocketListener() { if (websocketListener === true) return; websocketListener = true; const nativeWebSocket = window.WebSocket; window.WebSocket = function(...args) { const socket = new nativeWebSocket(...args); socket.addEventListener("message", (t)=> { let detail = {}; detail.callType = "websocket"; detail.url = socket.url; detail.response = t.data; window.dispatchEvent(new CustomEvent("hardy-socket", { "detail": detail })); }); return socket; } } function isJsonString(str) { if (!str || str === "") return false; try { JSON.parse(str); } catch (e) { return false; } return true; } addXHRListener(); addFetchListener(); addWebsocketListener(); })();