🏠 Home 

自动重定向

替换重定向的链接


Install this script?
  1. // ==UserScript==
  2. // @name 自动重定向
  3. // @namespace http://tampermonkey.net/
  4. // @version 4.0.3
  5. // @description 替换重定向的链接
  6. // @author share121
  7. // @match *://*/*
  8. // @run-at document-start
  9. // @license MIT
  10. // @connect *
  11. // @grant GM_xmlhttpRequest
  12. // ==/UserScript==
  13. (() => {
  14. let changAttr = (() => {
  15. let finalUrls = new Set(),
  16. fetchUrls = [];
  17. return (ele, attr) => {
  18. try {
  19. let attrOldVal = ele.getAttribute(attr);
  20. if (attrOldVal) {
  21. if (
  22. !finalUrls.has(attrOldVal) &&
  23. !fetchUrls.includes(attrOldVal)
  24. ) {
  25. fetchUrls.push(attrOldVal);
  26. GM_xmlhttpRequest({
  27. method: "HEAD",
  28. url: new URL(attrOldVal, location.href).toString(),
  29. onload(response) {
  30. if (attrOldVal === ele.getAttribute(attr)) {
  31. if (
  32. new URL(response.finalUrl).host !==
  33. new URL(attrOldVal, location.href).host
  34. ) {
  35. finalUrls.add(response.finalUrl);
  36. ele.setAttribute(
  37. attr,
  38. response.finalUrl
  39. );
  40. } else {
  41. finalUrls.add(attrOldVal);
  42. }
  43. }
  44. fetchUrls = fetchUrls.filter(
  45. (e) => e !== attrOldVal
  46. );
  47. },
  48. onerror() {
  49. fetchUrls = fetchUrls.filter(
  50. (e) => e !== attrOldVal
  51. );
  52. },
  53. onabort() {
  54. fetchUrls = fetchUrls.filter(
  55. (e) => e !== attrOldVal
  56. );
  57. },
  58. });
  59. }
  60. }
  61. } catch { }
  62. };
  63. })();
  64. new MutationObserver((mutationList) => {
  65. mutationList.forEach((e) => {
  66. if (e.type === "attributes") {
  67. changAttr(e.target, e.attributeName);
  68. } else {
  69. e.addedNodes.forEach((ele) => {
  70. try {
  71. [ele, ...ele.querySelectorAll("*")].forEach((ele) => {
  72. changAttr(ele, "href");
  73. changAttr(ele, "src");
  74. });
  75. } catch { }
  76. });
  77. }
  78. });
  79. }).observe(document, {
  80. subtree: true,
  81. childList: true,
  82. attributeFilter: ["href", "src"],
  83. });
  84. window.addEventListener("mouseover", (e) => {
  85. let ele = e.target;
  86. while (ele !== document) {
  87. changAttr(e.target, "href");
  88. changAttr(e.target, "src");
  89. ele = ele.parentNode;
  90. }
  91. });
  92. window.addEventListener("touchstart", (e) => {
  93. let ele = e.target;
  94. while (ele !== document) {
  95. changAttr(e.target, "href");
  96. changAttr(e.target, "src");
  97. ele = ele.parentNode;
  98. }
  99. });
  100. document.querySelectorAll("*").forEach((e) => {
  101. changAttr(e, "href");
  102. changAttr(e, "src");
  103. });
  104. })();