您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Greasy Fork is available in English.
it can hook all ajax
当前为
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.greasyfork.icu/scripts/372706/632991/Hook%20all%20ajax.js
// ==UserScript== // @name Hook all ajax // @namespace https://gitee.com/HGJing/everthing-hook/ // @version 0.1.001 // @description it can hook all ajax // @include * // @require http://greasyfork.icu/scripts/372672-everything-hook/code/Everything-Hook.js?version=632910 // @author Cangshi // @match *://*/* // @run-at document-start // @grant none // ==/UserScript== (function (global) { 'use strict'; if (global.eHook) { global.eHook.plugins({ name: 'NetHook', /** * 插件装载 * @param util */ mount: function (util) { var cbObject = { resp: {}, parseScript: function (m, args) { if (args[0].localName === 'script') { var src = decodeURI(args[0].src); var isPass = true; if (ajaxObject.filterPatten) { isPass = util.urlUtils.urlMatching(src, ajaxObject.filterPatten); } if (!isPass) { return; } args[0].requestParams = util.urlUtils.getParamFromUrl(src); args[0].requestUrl = util.urlUtils.getUrlWithoutParam(src); ajaxChange.cb.req.call(this, args[0], util); var aimedUrl = util.urlUtils.margeUrlAndParams(args[0].requestUrl, args[0].requestParams); if (aimedUrl !== src) { args[0].src = aimedUrl; } var cbName = 'cb'; args[0].requestParams.map(function (kv) { if (kv.key.toLowerCase() === 'cb' || kv.key.toLowerCase() === 'callback') { cbName = kv.value; } }); if (window[cbName]) { global.eHook.removeHookMethod(window, cbName); global.eHook.hookBefore(window, cbName, function (m, args) { ajaxChange.cb.resp.call(window, args, util); // console.log('Hooking call back: ' + cbName + ' success.') }, false); } else { var isDelete = false; try { isDelete = delete window[cbName] } catch (e) { isDelete = false; } if (isDelete) { Object.defineProperty(window, cbName, { set: function (v) { global.eHook.unHook(cbObject.resp, cbName, true); cbObject.resp[cbName] = v; global.eHook.hookBefore(cbObject.resp, cbName, function (m, args) { ajaxChange.cb.resp.call(this, args, util); }); }, get: function () { return cbObject.resp[cbName]; } }); console.log('Hooking(proxy) call back: ' + cbName + ' success.') } else { console.log('Hooking call back: ' + cbName + ' failed.') } } } } }; var ajaxObject = { filterPatten: '' }; var ajaxChange = { filter: function (pattern) { ajaxObject.filterPatten = pattern; return this; }, ajax: { req: function () { }, resp: function () { }, send: function () { } }, cb: { req: function () { }, resp: function () { } }, }; // hook jsonp global.eHook.hookBefore(Node.prototype, 'appendChild', function (m, args) { cbObject.parseScript(m, args); }, false); global.eHook.hookBefore(Node.prototype, 'insertBefore', function (m, args) { cbObject.parseScript(m, args); }, false); global.aHook.register('.*', { hookResponse: function () { var isPass = true; if (ajaxObject.filterPatten) { isPass = util.urlUtils.urlMatching(this.responseURL, ajaxObject.filterPatten); } return !isPass ? undefined : ajaxChange.ajax.resp.call(this, arguments, util); }, hookSend: function (args) { var isPass = true; if (ajaxObject.filterPatten) { isPass = util.urlUtils.urlMatching(this.requestURL, ajaxObject.filterPatten); } return !isPass ? undefined : ajaxChange.ajax.send.call(this, arguments, util); }, hookRequest: function (args) { window.util = util; var isPass = true; if (ajaxObject.filterPatten) { isPass = util.urlUtils.urlMatching(args.fullUrl, ajaxObject.filterPatten); } this.requestURL = args.fullUrl; return !isPass ? undefined : ajaxChange.ajax.req.call(this, arguments, util); } } ); return ajaxChange; } }); } })(window);