Greasy Fork

Hook all ajax

it can hook all ajax

目前为 2018-09-30 提交的版本。查看 最新版本

此脚本不应直接安装,它是一个供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @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      https://greasyfork.org/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);