Medium 推銷遮罩阻擋器

透過在 localStorage 中設定 lo-non-moc-upsell-v2|displayed-at,防止 Medium 顯示訂閱或推銷彈出視窗

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name               Medium Upsell Blocker
// @name:zh-TW         Medium 推銷遮罩阻擋器
// @namespace          wellstsai.com
// @version            v20251112
// @license            MIT
// @description        Prevent Medium subscription/upsell modals by setting lo-non-moc-upsell-v2|displayed-at in localStorage
// @description:zh-TW  透過在 localStorage 中設定 lo-non-moc-upsell-v2|displayed-at,防止 Medium 顯示訂閱或推銷彈出視窗
// @author             WellsTsai
// @match              *://*.medium.com/*
// @match              *://*/*
// @run-at             document-start
// @grant              none
// ==/UserScript==

(() => {
    'use strict';
    const K = 'lo-non-moc-upsell-v2|displayed-at';
    const set = () => { try { localStorage.setItem(K, `"${new Date().toISOString()}"`); } catch (_) {} };
    const isMediumHost = /(^|\.)medium\.com$/.test(location.hostname);
    const isMediumLike = () => {
        const nodes = document.querySelectorAll('meta[name],meta[property],link[href]');
        for (const el of nodes) {
            const s = `${el.content||''}${el.getAttribute('name')||''}${el.getAttribute('property')||''}${el.href||''}`.toLowerCase();
            if (s.includes('medium') || s.includes('com.medium.reader') || s.includes('miro.medium.com') || s.includes('glyph.medium.com')) return true;
        }
        return false;
    };

    if (isMediumHost) {
        set();
        window.addEventListener('DOMContentLoaded', set, { once: true });
    } else {
        const run = () => { if (isMediumLike()) set(); };
        if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', run, { once: true });
        else run();
    }
})();