Hook all ajax

it can hook all ajax

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

此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/372706/932793/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://greasyfork.org/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. args[0].requestParams = util.urlUtils.getParamFromUrl(src);
  39. args[0].requestUrl = util.urlUtils.getUrlWithoutParam(src);
  40. ajaxChange.cb.req.call(this, args[0], util);
  41. var aimedUrl = util.urlUtils.margeUrlAndParams(args[0].requestUrl, args[0].requestParams);
  42. if (aimedUrl !== src) {
  43. args[0].src = aimedUrl;
  44. }
  45. var cbName = undefined;
  46. args[0].requestParams.map(function (kv) {
  47. if (kv.key.toLowerCase() === 'cb' || kv.key.toLowerCase() === 'callback') {
  48. cbName = kv.value;
  49. }
  50. });
  51. if (!cbName || !ajaxChange.cb.resp) {
  52. return;
  53. }
  54. if (window[cbName]) {
  55. global.eHook.removeHookMethod(window, cbName);
  56. global.eHook.hookBefore(window, cbName, function (m, args) {
  57. ajaxChange.cb.resp.call(window, args, util);
  58. // console.log('Hooking call back: ' + cbName + ' success.')
  59. }, false);
  60. } else {
  61. var isDelete = false;
  62. try {
  63. isDelete = delete window[cbName]
  64. } catch (e) {
  65. isDelete = false;
  66. }
  67. if (isDelete) {
  68. Object.defineProperty(window, cbName, {
  69. set: function (v) {
  70. global.eHook.unHook(cbObject.resp, cbName, true);
  71. cbObject.resp[cbName] = v;
  72. global.eHook.hookBefore(cbObject.resp,
  73. cbName, function (m, args) {
  74. ajaxChange.cb.resp.call(this, args, util);
  75. });
  76. },
  77. get: function () {
  78. return cbObject.resp[cbName];
  79. }
  80. });
  81. console.log('Hooking(proxy) call back: ' + cbName + ' success.')
  82. } else {
  83. console.log('Hooking call back: ' + cbName + ' failed.')
  84. }
  85. }
  86.  
  87. }
  88. };
  89. var isAutoInit = localStorage.getItem('__hook_all_auto_init');
  90. if (!isAutoInit) {
  91. localStorage.setItem('__hook_all_auto_init', JSON.stringify(true));
  92. isAutoInit = localStorage.getItem('__hook_all_auto_init');
  93. }
  94. var ajaxObject = {
  95. filterPatten: '',
  96. isAutoInit: isAutoInit && isAutoInit !== 'false'
  97. };
  98. var ajaxChange = {
  99. filter: function (pattern) {
  100. ajaxObject.filterPatten = pattern;
  101. return this;
  102. },
  103. ajax: {
  104. req: undefined,
  105. resp: undefined,
  106. send: undefined
  107. },
  108. cb: {
  109. req: undefined,
  110. resp: undefined
  111. },
  112. setting: {
  113. autoInit: function (b) {
  114. ajaxObject.isAutoInit = b;
  115. localStorage.setItem('__hook_all_auto_init', JSON.stringify(b));
  116. }
  117. },
  118. init: function () {
  119. // hook jsonp
  120. global.eHook.hookBefore(Node.prototype, 'appendChild', function (m, args) {
  121. cbObject.parseScript(m, args);
  122. }, false);
  123. global.eHook.hookBefore(Node.prototype, 'insertBefore', function (m, args) {
  124. cbObject.parseScript(m, args);
  125. }, false);
  126.  
  127. global.aHook.register('.*', {
  128. hookResponse: function () {
  129. var isPass = true;
  130. if (ajaxObject.filterPatten) {
  131. isPass = util.urlUtils.urlMatching(this.responseURL, ajaxObject.filterPatten);
  132. }
  133. return !isPass ? undefined : ajaxChange.ajax.resp && ajaxChange.ajax.resp.call(this, arguments, util);
  134. },
  135. hookSend: function (args) {
  136. var isPass = true;
  137. if (ajaxObject.filterPatten) {
  138. isPass = util.urlUtils.urlMatching(this.requestURL, ajaxObject.filterPatten);
  139. }
  140. return !isPass ? undefined : ajaxChange.ajax.send && ajaxChange.ajax.send.call(this, arguments, util);
  141. },
  142. hookRequest: function (args) {
  143. window.util = util;
  144. var isPass = true;
  145. if (ajaxObject.filterPatten) {
  146. isPass = util.urlUtils.urlMatching(args.fullUrl, ajaxObject.filterPatten);
  147. }
  148. this.requestURL = args.fullUrl;
  149. return !isPass ? undefined : ajaxChange.ajax.req && ajaxChange.ajax.req.call(this, arguments, util);
  150. }
  151. }
  152. );
  153. },
  154. onInit: function () {
  155. }
  156. };
  157. ajaxChange.onInit();
  158. if (ajaxObject.isAutoInit) {
  159. ajaxChange.init();
  160. }
  161.  
  162. return ajaxChange;
  163. }
  164. });
  165. }
  166. })(window);