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.1
  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. // @icon https://www.amazon.co.jp/favicon.ico
  34. // ==/UserScript==
  35.  
  36. (function () {
  37. 'use strict';
  38.  
  39. const SCRIPT_ID = 'AmazonCpuTamerPRO';
  40. const FOREGROUND_INTERVAL = 125;
  41. const BACKGROUND_INTERVAL = 60000;
  42. const MIN_IFRAME_TIMEOUT = 1000;
  43.  
  44. const safeWindow = (typeof unsafeWindow !== 'undefined') ? unsafeWindow : window;
  45.  
  46. let isUserActive = true;
  47. let isTabHidden = document.hidden;
  48.  
  49. document.addEventListener('visibilitychange', () => {
  50. isTabHidden = document.hidden;
  51. });
  52. document.addEventListener('keydown', () => isUserActive = true, true);
  53. document.addEventListener('click', () => isUserActive = true, true);
  54.  
  55. // Task bundler (Top window only)
  56. if (safeWindow === safeWindow.top) {
  57. const taskMap = new Map();
  58. let taskIdCounter = 0;
  59.  
  60. const scheduleIdle = (fn) => {
  61. if ('requestIdleCallback' in window) {
  62. requestIdleCallback(fn, { timeout: 500 });
  63. } else {
  64. requestAnimationFrame(fn);
  65. }
  66. };
  67.  
  68. const originalSetInterval = safeWindow.setInterval.bind(safeWindow);
  69. const originalClearInterval = safeWindow.clearInterval.bind(safeWindow);
  70.  
  71. safeWindow.setInterval = function (fn, delay, ...args) {
  72. const id = taskIdCounter++;
  73. taskMap.set(id, {
  74. fn: () => fn(...args),
  75. interval: delay,
  76. lastExecution: 0
  77. });
  78. return id;
  79. };
  80.  
  81. safeWindow.clearInterval = function (id) {
  82. taskMap.delete(id);
  83. };
  84.  
  85. const bundledLoop = () => {
  86. const now = Date.now();
  87. const intervalLimit = isTabHidden ? BACKGROUND_INTERVAL : FOREGROUND_INTERVAL;
  88.  
  89. if (!isUserActive && isTabHidden) {
  90. scheduleIdle(bundledLoop);
  91. return;
  92. }
  93.  
  94. for (const [id, task] of taskMap.entries()) {
  95. if (now - task.lastExecution >= task.interval) {
  96. try {
  97. task.fn();
  98. } catch (e) {
  99. console.warn(`[${SCRIPT_ID}] Error in interval task:`, e);
  100. }
  101. task.lastExecution = now;
  102. }
  103. }
  104.  
  105. isUserActive = false;
  106. scheduleIdle(bundledLoop);
  107. };
  108.  
  109. scheduleIdle(bundledLoop);
  110. }
  111.  
  112. // Timeout throttler for iframes
  113. if (safeWindow !== safeWindow.top) {
  114. const originalSetTimeout = safeWindow.setTimeout.bind(safeWindow);
  115.  
  116. safeWindow.setTimeout = function (fn, timeout, ...args) {
  117. if (document.hidden) return;
  118. const adjusted = Math.max(timeout, MIN_IFRAME_TIMEOUT);
  119. return originalSetTimeout(fn, adjusted, ...args);
  120. };
  121. }
  122.  
  123. // Optional: URL cleaner to remove tracking parameters
  124. if (safeWindow === safeWindow.top) {
  125. const cleanTrackingParams = () => {
  126. const url = new URL(location.href);
  127. const paramsToRemove = ['utm_source', 'utm_medium', 'utm_campaign', 'ref', 'tag'];
  128.  
  129. let modified = false;
  130. for (const param of paramsToRemove) {
  131. if (url.searchParams.has(param)) {
  132. url.searchParams.delete(param);
  133. modified = true;
  134. }
  135. }
  136.  
  137. if (modified) {
  138. history.replaceState(null, document.title, url.toString());
  139. console.info(`[${SCRIPT_ID}] Tracking parameters removed`);
  140. }
  141. };
  142.  
  143. document.addEventListener('DOMContentLoaded', cleanTrackingParams, { once: true });
  144. }
  145. })();