Amazon CPU Tamer PRO 🧠✨

AmazonのCPU負荷を劇的に削減!DOM非改変・アフィなし・軽量&安全設計の高効率ユーザースクリプト。

  1. // ==UserScript==
  2. // @name Amazon CPU Tamer PRO 🧠✨
  3. // @namespace https://github.com/koyasi777/amazon-cpu-tamer-pro
  4. // @version 3.0.0
  5. // @description AmazonのCPU負荷を劇的に削減!DOM非改変・アフィなし・軽量&安全設計の高効率ユーザースクリプト。
  6. // @author koyasi777
  7. // @match https://www.amazon.com/*
  8. // @match https://www.amazon.co.jp/*
  9. // @match https://www.amazon.co.uk/*
  10. // @match https://www.amazon.es/*
  11. // @match https://www.amazon.fr/*
  12. // @match https://www.amazon.de/*
  13. // @match https://www.amazon.it/*
  14. // @exclude https://www.amazon.com/cart/*
  15. // @exclude https://www.amazon.co.jp/cart/*
  16. // @exclude https://www.amazon.co.uk/cart/*
  17. // @exclude https://www.amazon.es/cart/*
  18. // @exclude https://www.amazon.fr/cart/*
  19. // @exclude https://www.amazon.de/cart/*
  20. // @exclude https://www.amazon.it/cart/*
  21. // @exclude https://www.amazon.com/buy/*
  22. // @exclude https://www.amazon.co.jp/buy/*
  23. // @exclude https://www.amazon.co.uk/buy/*
  24. // @exclude https://www.amazon.es/buy/*
  25. // @exclude https://www.amazon.fr/buy/*
  26. // @exclude https://www.amazon.de/buy/*
  27. // @exclude https://www.amazon.it/buy/*
  28. // @grant none
  29. // @license MIT
  30. // @homepageURL https://github.com/koyasi777/amazon-cpu-tamer-pro
  31. // @supportURL https://github.com/koyasi777/amazon-cpu-tamer-pro/issues
  32. // @run-at document-start
  33. // ==/UserScript==
  34.  
  35. (function () {
  36. 'use strict';
  37.  
  38. const SCRIPT_ID = 'AmazonCpuTamerPRO';
  39. const FOREGROUND_INTERVAL = 125;
  40. const BACKGROUND_INTERVAL = 60000;
  41. const MIN_IFRAME_TIMEOUT = 1000;
  42.  
  43. const safeWindow = (typeof unsafeWindow !== 'undefined') ? unsafeWindow : window;
  44.  
  45. let isUserActive = true;
  46. let isTabHidden = document.hidden;
  47.  
  48. document.addEventListener('visibilitychange', () => {
  49. isTabHidden = document.hidden;
  50. });
  51. document.addEventListener('keydown', () => isUserActive = true, true);
  52. document.addEventListener('click', () => isUserActive = true, true);
  53.  
  54. // Task bundler (Top window only)
  55. if (safeWindow === safeWindow.top) {
  56. const taskMap = new Map();
  57. let taskIdCounter = 0;
  58.  
  59. const scheduleIdle = (fn) => {
  60. if ('requestIdleCallback' in window) {
  61. requestIdleCallback(fn, { timeout: 500 });
  62. } else {
  63. requestAnimationFrame(fn);
  64. }
  65. };
  66.  
  67. const originalSetInterval = safeWindow.setInterval.bind(safeWindow);
  68. const originalClearInterval = safeWindow.clearInterval.bind(safeWindow);
  69.  
  70. safeWindow.setInterval = function (fn, delay, ...args) {
  71. const id = taskIdCounter++;
  72. taskMap.set(id, {
  73. fn: () => fn(...args),
  74. interval: delay,
  75. lastExecution: 0
  76. });
  77. return id;
  78. };
  79.  
  80. safeWindow.clearInterval = function (id) {
  81. taskMap.delete(id);
  82. };
  83.  
  84. const bundledLoop = () => {
  85. const now = Date.now();
  86. const intervalLimit = isTabHidden ? BACKGROUND_INTERVAL : FOREGROUND_INTERVAL;
  87.  
  88. if (!isUserActive && isTabHidden) {
  89. scheduleIdle(bundledLoop);
  90. return;
  91. }
  92.  
  93. for (const [id, task] of taskMap.entries()) {
  94. if (now - task.lastExecution >= task.interval) {
  95. try {
  96. task.fn();
  97. } catch (e) {
  98. console.warn(`[${SCRIPT_ID}] Error in interval task:`, e);
  99. }
  100. task.lastExecution = now;
  101. }
  102. }
  103.  
  104. isUserActive = false;
  105. scheduleIdle(bundledLoop);
  106. };
  107.  
  108. scheduleIdle(bundledLoop);
  109. }
  110.  
  111. // Timeout throttler for iframes
  112. if (safeWindow !== safeWindow.top) {
  113. const originalSetTimeout = safeWindow.setTimeout.bind(safeWindow);
  114.  
  115. safeWindow.setTimeout = function (fn, timeout, ...args) {
  116. if (document.hidden) return;
  117. const adjusted = Math.max(timeout, MIN_IFRAME_TIMEOUT);
  118. return originalSetTimeout(fn, adjusted, ...args);
  119. };
  120. }
  121.  
  122. // Optional: URL cleaner to remove tracking parameters
  123. if (safeWindow === safeWindow.top) {
  124. const cleanTrackingParams = () => {
  125. const url = new URL(location.href);
  126. const paramsToRemove = ['utm_source', 'utm_medium', 'utm_campaign', 'ref', 'tag'];
  127.  
  128. let modified = false;
  129. for (const param of paramsToRemove) {
  130. if (url.searchParams.has(param)) {
  131. url.searchParams.delete(param);
  132. modified = true;
  133. }
  134. }
  135.  
  136. if (modified) {
  137. history.replaceState(null, document.title, url.toString());
  138. console.info(`[${SCRIPT_ID}] Tracking parameters removed`);
  139. }
  140. };
  141.  
  142. document.addEventListener('DOMContentLoaded', cleanTrackingParams, { once: true });
  143. }
  144. })();