您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
only hookFetch
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greatest.deepsurf.us/scripts/465483/1186094/hookFetch.js
(() => { var contextWindow = window.unsafeWindow || document.defaultView || window; if (contextWindow['__hookRequest__'] != null) { return; } var globalVariable = new Map(); var FetchMapList = new Map(); var XhrMapList = new Map(); function deliveryTask(callbackList, _object, period) { let newObject = _object; for (let i = 0; i < callbackList.length; i++) { let tempObject = null; try { tempObject = callbackList[i](newObject, period); } catch (e) { new Error(e); } if (tempObject == null) { continue; } newObject = tempObject; } return newObject; } function hookFetch() { const originalFetch = contextWindow.fetch; globalVariable.set('Fetch', originalFetch); contextWindow.fetch = (...args) => { let U = args[0]; if (U.indexOf('http') == -1) { if (U[0] !== '/') { let pathname = new URL(location.href).pathname; U = pathname + U; } U = location.origin + U; } let apply = null; (() => { let url = new URL(U), pathname = url.pathname, callback = FetchMapList.get(pathname); if (callback == null) return; if (callback.length === 0) return; let newObject = deliveryTask(callback, { args }, 'preRequest'); if (newObject && newObject.args) { args = newObject.args; } apply = originalFetch.apply(this, args); apply.then((response) => { let originalGetReader = response.body.getReader; response.body.getReader = function () { let originalReader = originalGetReader.apply(this, arguments); let originalRead = originalReader.read; originalReader.read = function () { return originalRead.apply(this, arguments).then(function (result) { let tempObject = deliveryTask(callback, { result, args }, 'doing'); if (tempObject && tempObject.result) { result = tempObject.result; } return result; }); }; return originalReader; }; let text = response.text, json = response.json; response.text = () => { return text.apply(response).then((text) => { let _object = deliveryTask(callback, { text, args }, 'done'); if (_object && _object.text) { text = _object.text; } return text; }); }; response.json = () => { return json.apply(response).then((json) => { let text = JSON.stringify(json); let _object = deliveryTask(callback, { text, args }, 'done'); if (_object && _object.text) { text = _object.text; return JSON.parse(text); } return json; }); }; }); })(); if (apply == null) { apply = originalFetch.apply(this, args); } return apply; }; } function hookXhr() { const XHRProxy = new Proxy(contextWindow.XMLHttpRequest, { construct(target, args) { let xhr = new target(...args); let originalOpen = xhr.open; let originalSend = xhr.send; let url = ''; xhr.open = function () { url = arguments[1]; return originalOpen.apply(xhr, arguments); }; xhr.send = function () { let o = function (args) { return originalSend.apply(xhr, args); }; let args = arguments; let U = xhr.responseURL == '' ? url : xhr.responseURL; if (U.indexOf('http') == -1) { if (U[0] !== '/') { let pathname = new URL(location.href).pathname; U = pathname + U; } U = location.origin + U; } let pathname = new URL(U).pathname; let callback = XhrMapList.get(pathname); if (callback == null) return o(args); if (callback.length === 0) return o(args); let newObject = deliveryTask(callback, { args }, 'preRequest'); if (newObject && newObject.args) { args = newObject.args; } const onReadyStateChangeOriginal = xhr.onreadystatechange; xhr.onreadystatechange = function () { if (xhr.readyState === 4 && xhr.status === 200) { let text = xhr.responseText; let newObject = deliveryTask(callback, { text, args }, 'done'); if (newObject && newObject.text) { xhr.responseText = newObject.text; let newXhr = new Proxy(xhr, { get(target, key) { if (key === 'responseText') { debugger; return newObject.text; } return target[key]; } }); return onReadyStateChangeOriginal.apply(newXhr, args); } } onReadyStateChangeOriginal && onReadyStateChangeOriginal.apply(xhr, args); }; return o(args); }; return xhr; } }); globalVariable.set('XMLHttpRequest', contextWindow.XMLHttpRequest); contextWindow.XMLHttpRequest = XHRProxy; } (async () => { hookFetch(); })(); (async () => { hookXhr(); })(); contextWindow['__hookRequest__'] = { FetchCallback: { add: (pathname, callback) => { let list = FetchMapList.get(pathname) || (FetchMapList.set(pathname, []), FetchMapList.get(pathname)); list.push(callback); let index = list.length; return index; }, del: (pathname, index) => { try { let list = FetchMapList.get(pathname); if (list == null) return false; list.splice(index - 1, 1); } catch (e) { new Error(e); return false; } return true; } }, XhrCallback: { add: (pathname, callback) => { let list = XhrMapList.get(pathname) || (XhrMapList.set(pathname, []), XhrMapList.get(pathname)); list.push(callback); let index = list.length; return index; }, del: (pathname, index) => { try { let list = XhrMapList.get(pathname); if (list == null) return false; list.splice(index - 1, 1); } catch (e) { new Error(e); return false; } return true; } }, globalVariable: { get: (key) => { return globalVariable.get(key); }, getAll: () => { return globalVariable.entries(); }, set: (key, value) => { globalVariable.set(key, value); }, getOrDrfault: (key, defaultValue) => { return globalVariable.get(key) || defaultValue; } } }; })();