Greasy Fork の日本語訳は 81% しか完了していません。改善に参加しませんか?
AmazonのショッピングページでのCPU使用率を削減します。お買いものをサクサク楽しみましょう。
- // ==UserScript==
- // @name Amazon CPU Tamer
- // @name:ja Amazon CPU Tamer
- // @name:zh-CN Amazon CPU Tamer
- // @namespace knoa.jp
- // @description It reduces CPU usage on Amazon shopping pages. Enjoy your snappy shopping.
- // @description:ja AmazonのショッピングページでのCPU使用率を削減します。お買いものをサクサク楽しみましょう。
- // @description:zh-CN 减少Amazon购物页面上的CPU利用率。顺利地享受买东西吧。
- // @include https://www.amazon.com/*
- // @include https://www.amazon.co.jp/*
- // @include https://www.amazon.co.uk/*
- // @include https://www.amazon.es/*
- // @include https://www.amazon.fr/*
- // @include https://www.amazon.de/*
- // @include https://www.amazon.it/*
- // @include https://www.amazon.*
- // @include https://*.amazon-*.com/*
- // @include https://*.*-amazon.com/*
- // @exclude */cart/*
- // @exclude */buy/*
- // @version 1.4.4
- // @grant none
- // @run-at document-start
- // @antifeature referral-link This script may add an associate ID to visited Amazon URLs. It doesn't replace any existed ID. Thank you.
- // @antifeature:ja referral-link ありがとうございます。本スクリプトは、訪れたAmazonページのURLにアソシエイトIDを付与することがあります。別のIDがすでに付与されている場合は、置き換えることはしません。
- // @antifeature:zh-CN referral-link 本脚本可能会为访问过的Amazon页面的URL授予联盟ID。如果已经授予了另一个ID,则不会进行替换。谢谢。
- // @contributionURL https://paypal.me/kantankikaku
- // ==/UserScript==
- /*
- [update]
- Update @antifeature descriptions. Minor fix.
- [memo]
- top:
- interval インタラクション要素にも使われるので、1インスタンスにまとめた上で前面タブのみやむなく125msごとに実行。
- もっとゆるい頻度にしつつ、click や keydown 時のみ頻度を上げる手はあるが、前面タブで1-2%なら許されるだろう。
- ゆるい interval による把握できている問題は詳細画像の切り替え表示だけなので、自分でやっちゃう手もあるが。
- timeout インタラクションのみで定常なしなので、そのまま実行してもよい。
- iframe(ad):
- interval 初期化時のみなのでそのまま実行してもよい。
- timeout 定常 100ms が iframe ごとに1つずつなので、1秒ごとに頻度を落とす。
- iframe(cloudfront.net ad)
- ローカルソースのiframeから事後生成されるのでTampermonkeyが機能しない。
- 広告除去することはできるが、このスクリプトの役目ではない。
- */
- (function(){
- const SCRIPTID = 'AmazonCpuTamer';
- console.log(SCRIPTID, location.href);
- const BUNDLEDINTERVAL = 125;/* the bundled interval */
- const BACKGROUNDINTERVAL = 60*1000;/* take even longer interval on hidden tab */
- const IFRAMETIMEOUT = 1*1000;/* amazon uses timeouts instead of intervals on iframes */
- /*
- [interval]
- tame quick intervals
- */
- if(window === top){
- /* integrate each of intervals */
- const bundle = {};/* {0: {f, interval, lastExecution}} */
- let index = 0;/* use it instead of interval id */
- let lastExecution = 0;
- /* bundle intervals */
- const originalSetInterval = window.setInterval.bind(window);
- window.setInterval = function(f, interval, ...args){
- //console.log(SCRIPTID, 'original interval:', interval, location.href);
- bundle[index] = {
- f: f.bind(null, ...args),
- interval: interval,
- lastExecution: 0,
- };
- return index++;
- };
- window.clearInterval = function(id){
- //console.log(SCRIPTID, 'clearInterval:', id, location.href);
- delete bundle[id];
- };
- /* execute bundled intervals */
- /* a bunch of intervals does cost so much even if the processes do nothing */
- originalSetInterval(function(){
- const now = Date.now();
- if(document.hidden && now < lastExecution + BACKGROUNDINTERVAL) return;
- Object.keys(bundle).forEach(id => {
- const item = bundle[id];
- if(item === undefined) return;/* it could be occur on tiny deletion chance */
- if(now < item.lastExecution + item.interval) return;/* not yet */
- item.f();
- item.lastExecution = now;
- });
- lastExecution = now;
- }, BUNDLEDINTERVAL);
- }
- /*
- [timeout]
- tame quick timeouts on iframe ads
- */
- if(window !== top){
- const originalSetTimeout = window.setTimeout.bind(window);
- window.setTimeout = function(f, timeout, ...args){
- if(document.hidden) return;
- if(timeout < IFRAMETIMEOUT){
- //console.log(SCRIPTID, 'timeout:', timeout, 'to', IFRAMETIMEOUT, location.href);
- timeout = IFRAMETIMEOUT;
- }
- return originalSetTimeout(f, timeout, ...args);
- };
- }
- /*
- [associate]
- add an associate tag
- */
- if(window === top){
- const IDS = {
- 'www.amazon.com': 'knoa-20',
- 'www.amazon.co.jp': 'knoa-22',
- 'www.amazon.co.uk': 'knoa01-21',
- 'www.amazon.es': 'knoa0c-21',
- 'www.amazon.fr': 'knoa09-21',
- 'www.amazon.de': 'knoa03-21',
- 'www.amazon.it': 'knoa0a-21',
- };
- if(IDS[location.host]){
- addTag(IDS[location.host]);
- }
- function addTag(tag){
- const url = new URL(location.href);
- if(url.searchParams.get('tag') !== null) return;/* do not overwrite */
- console.log(SCRIPTID, 'associate tag:', tag);
- document.documentElement.addEventListener('mousedown', function(e){
- for(let target = e.target; target; target = target.parentNode){
- if(target.href && target.href.startsWith(location.origin) && !target.getAttribute('href').startsWith('#')){
- const separator = (target.href.includes('?')) ? '&' : '?';
- target.href = target.href.replace(/(?=#)|$/, separator + 'tag=' + tag);
- }
- }
- });
- const separator = (url.search === '') ? '?' : '&';
- history.replaceState(null, document.title, location.href.replace(/(?=#)|$/, separator + 'tag=' + tag));
- }
- }
- })();