Hook all ajax

it can hook all ajax

当前为 2018-09-30 提交的版本,查看 最新版本

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

  1. // ==UserScript==
  2. // @name Hook all ajax
  3. // @namespace https://gitee.com/HGJing/everthing-hook/
  4. // @version 0.1.001
  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. var src = decodeURI(args[0].src);
  29. var isPass = true;
  30. if (ajaxObject.filterPatten) {
  31. isPass = util.urlUtils.urlMatching(src, ajaxObject.filterPatten);
  32. }
  33. if (!isPass) {
  34. return;
  35. }
  36. args[0].requestParams = util.urlUtils.getParamFromUrl(src);
  37. args[0].requestUrl = util.urlUtils.getUrlWithoutParam(src);
  38. ajaxChange.cb.req.call(this, args[0], util);
  39. var aimedUrl = util.urlUtils.margeUrlAndParams(args[0].requestUrl, args[0].requestParams);
  40. if (aimedUrl !== src) {
  41. args[0].src = aimedUrl;
  42. }
  43. var cbName = 'cb';
  44. args[0].requestParams.map(function (kv) {
  45. if (kv.key.toLowerCase() === 'cb' || kv.key.toLowerCase() === 'callback') {
  46. cbName = kv.value;
  47. }
  48. });
  49. if (window[cbName]) {
  50. global.eHook.removeHookMethod(window, cbName);
  51. global.eHook.hookBefore(window, cbName, function (m, args) {
  52. ajaxChange.cb.resp.call(window, args, util);
  53. // console.log('Hooking call back: ' + cbName + ' success.')
  54. }, false);
  55. } else {
  56. var isDelete = false;
  57. try {
  58. isDelete = delete window[cbName]
  59. } catch (e) {
  60. isDelete = false;
  61. }
  62. if (isDelete) {
  63. Object.defineProperty(window, cbName, {
  64. set: function (v) {
  65. global.eHook.unHook(cbObject.resp, cbName, true);
  66. cbObject.resp[cbName] = v;
  67. global.eHook.hookBefore(cbObject.resp,
  68. cbName, function (m, args) {
  69. ajaxChange.cb.resp.call(this, args, util);
  70. });
  71. },
  72. get: function () {
  73. return cbObject.resp[cbName];
  74. }
  75. });
  76. console.log('Hooking(proxy) call back: ' + cbName + ' success.')
  77. } else {
  78. console.log('Hooking call back: ' + cbName + ' failed.')
  79. }
  80. }
  81. }
  82. }
  83. };
  84. var ajaxObject = {
  85. filterPatten: ''
  86. };
  87. var ajaxChange = {
  88. filter: function (pattern) {
  89. ajaxObject.filterPatten = pattern;
  90. return this;
  91. },
  92. ajax: {
  93. req: function () {
  94.  
  95. },
  96. resp: function () {
  97.  
  98. },
  99. send: function () {
  100.  
  101. }
  102. },
  103. cb: {
  104. req: function () {
  105.  
  106. },
  107. resp: function () {
  108.  
  109. }
  110. },
  111. };
  112. // hook jsonp
  113. global.eHook.hookBefore(Node.prototype, 'appendChild', function (m, args) {
  114. cbObject.parseScript(m, args);
  115. }, false);
  116. global.eHook.hookBefore(Node.prototype, 'insertBefore', function (m, args) {
  117. cbObject.parseScript(m, args);
  118. }, false);
  119.  
  120. global.aHook.register('.*', {
  121. hookResponse: function () {
  122. var isPass = true;
  123. if (ajaxObject.filterPatten) {
  124. isPass = util.urlUtils.urlMatching(this.responseURL, ajaxObject.filterPatten);
  125. }
  126. return !isPass ? undefined : ajaxChange.ajax.resp.call(this, arguments, util);
  127. },
  128. hookSend: function (args) {
  129. var isPass = true;
  130. if (ajaxObject.filterPatten) {
  131. isPass = util.urlUtils.urlMatching(this.requestURL, ajaxObject.filterPatten);
  132. }
  133. return !isPass ? undefined : ajaxChange.ajax.send.call(this, arguments, util);
  134. },
  135. hookRequest: function (args) {
  136. window.util = util;
  137. var isPass = true;
  138. if (ajaxObject.filterPatten) {
  139. isPass = util.urlUtils.urlMatching(args.fullUrl, ajaxObject.filterPatten);
  140. }
  141. this.requestURL = args.fullUrl;
  142. return !isPass ? undefined : ajaxChange.ajax.req.call(this, arguments, util);
  143. }
  144. }
  145. );
  146. return ajaxChange;
  147. }
  148. });
  149. }
  150. })(window);