// ==UserScript== // @name deAMP // @name:zh-TW deAMP // @description AMP sucks, thus no AMP thanks. // @description:zh-TW 垃圾 AMP,好走不送。 // @author Jason Kwok // @namespace https://jasonhk.dev/ // @version 2.2.1 // @license MIT // @match http*://*/* // @run-at document_end // @grant GM.getValue // @grant GM.setValue // @require https://cdn.jsdelivr.net/npm/uuid-random@1.3.2/uuid-random.min.js // @supportURL https://greasyfork.org/scripts/450569/feedback // @downloadURL none // ==/UserScript== (async () => { const SESSION_KEY = await getSessionKey(); const isAmp = document.documentElement.hasAttribute("⚡") || document.documentElement.hasAttribute("amp"); const canonical = document.head.querySelector("link[rel=canonical][href]"); if (isAmp && (canonical !== null)) { const lastVisit = sessionStorage.getItem(SESSION_KEY); if (location.href === lastVisit) { console.debug("[deAMP] Last visited URL is the current URL, abort redirection."); sessionStorage.removeItem(SESSION_KEY); } else if (location.href === canonical.href) { console.debug("[deAMP] Canonical URL is the current URL, abort redirection."); sessionStorage.removeItem(SESSION_KEY); } else { console.debug(`[deAMP] Redirecting to canonical URL: ${canonical.href}`); sessionStorage.setItem(SESSION_KEY, location.href); location.replace(canonical.href); } } else { console.debug("[deAMP] Not an AMP page."); sessionStorage.removeItem(SESSION_KEY); } async function getSessionKey() { let key = await GM.getValue("SESSION_KEY"); if (key) { return key; } key = uuid(); GM.setValue("SESSION_KEY", key); return key; } })();