Hook all ajax

it can hook all ajax

当前为 2021-05-20 提交的版本,查看 最新版本

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.gf.qytechs.cn/scripts/372706/932799/Hook%20all%20ajax.js

  1. // ==UserScript==
  2. // @name Hook all ajax
  3. // @namespace https://gitee.com/HGJing/everthing-hook/
  4. // @version 0.1.018
  5. // @description it can hook all ajax
  6. // @include *
  7. // @require https://gf.qytechs.cn/scripts/372672-everything-hook/code/Everything-Hook.js?version=632910
  8. // @author Cangshi
  9. // @match *://*/*
  10. // @run-at document-start
  11. // @grant none
  12. // ==/UserScript==
  13.  
  14. (function (global) {
  15. 'use strict';
  16. if (global.eHook) {
  17. global.eHook.plugins({
  18. name: 'NetHook',
  19. /**
  20. * 插件装载
  21. * @param util
  22. */
  23. mount: function (util) {
  24. var cbObject = {
  25. resp: {},
  26. parseScript: function (m, args) {
  27. if (args[0].localName !== 'script') {
  28. return;
  29. }
  30. var src = decodeURI(args[0].src);
  31. var isPass = true;
  32. if (ajaxObject.filterPatten) {
  33. isPass = util.urlUtils.urlMatching(src, ajaxObject.filterPatten);
  34. }
  35. if (!isPass || !ajaxChange.cb.req) {
  36. return;
  37. }
  38. var urls = src.split(',');
  39. if (urls.length > 1) {
  40. return;
  41. }
  42. args[0].requestParams = util.urlUtils.getParamFromUrl(src);
  43. args[0].requestUrl = util.urlUtils.getUrlWithoutParam(src);
  44. ajaxChange.cb.req.call(this, args[0], util);
  45. var aimedUrl = util.urlUtils.margeUrlAndParams(args[0].requestUrl, args[0].requestParams);
  46. if (aimedUrl !== src) {
  47. args[0].src = aimedUrl;
  48. }
  49. var cbName = undefined;
  50. args[0].requestParams.map(function (kv) {
  51. if (kv.key.toLowerCase() === 'cb' || kv.key.toLowerCase() === 'callback') {
  52. cbName = kv.value;
  53. }
  54. });
  55. if (!cbName || !ajaxChange.cb.resp) {
  56. return;
  57. }
  58. if (window[cbName]) {
  59. global.eHook.removeHookMethod(window, cbName);
  60. global.eHook.hookBefore(window, cbName, function (m, args) {
  61. ajaxChange.cb.resp.call(window, args, util);
  62. // console.log('Hooking call back: ' + cbName + ' success.')
  63. }, false);
  64. } else {
  65. var isDelete = false;
  66. try {
  67. isDelete = delete window[cbName]
  68. } catch (e) {
  69. isDelete = false;
  70. }
  71. if (isDelete) {
  72. Object.defineProperty(window, cbName, {
  73. set: function (v) {
  74. global.eHook.unHook(cbObject.resp, cbName, true);
  75. cbObject.resp[cbName] = v;
  76. global.eHook.hookBefore(cbObject.resp,
  77. cbName, function (m, args) {
  78. ajaxChange.cb.resp.call(this, args, util);
  79. });
  80. },
  81. get: function () {
  82. return cbObject.resp[cbName];
  83. }
  84. });
  85. console.log('Hooking(proxy) call back: ' + cbName + ' success.')
  86. } else {
  87. console.log('Hooking call back: ' + cbName + ' failed.')
  88. }
  89. }
  90.  
  91. }
  92. };
  93. var isAutoInit = localStorage.getItem('__hook_all_auto_init');
  94. if (!isAutoInit) {
  95. localStorage.setItem('__hook_all_auto_init', JSON.stringify(true));
  96. isAutoInit = localStorage.getItem('__hook_all_auto_init');
  97. }
  98. var ajaxObject = {
  99. filterPatten: '',
  100. isAutoInit: isAutoInit && isAutoInit !== 'false'
  101. };
  102. var ajaxChange = {
  103. filter: function (pattern) {
  104. ajaxObject.filterPatten = pattern;
  105. return this;
  106. },
  107. ajax: {
  108. req: undefined,
  109. resp: undefined,
  110. send: undefined
  111. },
  112. cb: {
  113. req: undefined,
  114. resp: undefined
  115. },
  116. setting: {
  117. autoInit: function (b) {
  118. ajaxObject.isAutoInit = b;
  119. localStorage.setItem('__hook_all_auto_init', JSON.stringify(b));
  120. }
  121. },
  122. init: function () {
  123. // hook jsonp
  124. // global.eHook.hookBefore(Node.prototype, 'appendChild', function (m, args) {
  125. // cbObject.parseScript(m, args);
  126. // }, false);
  127. // global.eHook.hookBefore(Node.prototype, 'insertBefore', function (m, args) {
  128. // cbObject.parseScript(m, args);
  129. // }, false);
  130.  
  131. global.aHook.register('.*', {
  132. hookResponse: function () {
  133. var isPass = true;
  134. if (ajaxObject.filterPatten) {
  135. isPass = util.urlUtils.urlMatching(this.responseURL, ajaxObject.filterPatten);
  136. }
  137. return !isPass ? undefined : ajaxChange.ajax.resp && ajaxChange.ajax.resp.call(this, arguments, util);
  138. },
  139. hookSend: function (args) {
  140. var isPass = true;
  141. if (ajaxObject.filterPatten) {
  142. isPass = util.urlUtils.urlMatching(this.requestURL, ajaxObject.filterPatten);
  143. }
  144. return !isPass ? undefined : ajaxChange.ajax.send && ajaxChange.ajax.send.call(this, arguments, util);
  145. },
  146. hookRequest: function (args) {
  147. window.util = util;
  148. var isPass = true;
  149. if (ajaxObject.filterPatten) {
  150. isPass = util.urlUtils.urlMatching(args.fullUrl, ajaxObject.filterPatten);
  151. }
  152. this.requestURL = args.fullUrl;
  153. return !isPass ? undefined : ajaxChange.ajax.req && ajaxChange.ajax.req.call(this, arguments, util);
  154. }
  155. }
  156. );
  157. },
  158. onInit: function () {
  159. }
  160. };
  161. ajaxChange.onInit();
  162. // if (ajaxObject.isAutoInit) {
  163. ajaxChange.init();
  164. // }
  165.  
  166. return ajaxChange;
  167. }
  168. });
  169. }
  170. })(window);

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址