Tiny-Customize

为常用网站添加功能定制。例如:3DMGame、贴吧、淘宝、京东、GitHub...

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name        Tiny-Customize
// @description 为常用网站添加功能定制。例如:3DMGame、贴吧、淘宝、京东、GitHub...
// @homepageURL https://github.com/nonoroazoro/firefox/tree/master/scripts/tiny-customize
// @namespace   https://greasyfork.org/zh-CN/scripts/19823-tiny-customize
// @author      nonoroazoro
// @match       /^https?:\/\/(.+\.)?github\./
// @match       http://bbs.3dmgame.com/*
// @match       http://bbs.kafan.cn/*
// @match       http://css-blocks.com/*
// @match       http://forum.gamer.com.tw/*
// @match       http://subhd.com/*
// @match       http://tieba.baidu.com/*
// @match       http://www.ruanyifeng.com/*
// @match       https://auth.alipay.com/*
// @match       https://forum.gamer.com.tw/*
// @match       https://kbs.sports.qq.com/*
// @match       https://login.taobao.com/*
// @match       https://login.xiami.com/*
// @match       https://passport.jd.com/*
// @match       https://poe.ninja/*
// @match       https://poedb.tw/*
// @match       https://sparticle999.github.io/*
// @match       https://sudos.help/*
// @match       https://wiki.d.163.com/*
// @match       https://www.chiphell.com/*
// @version     1.4.3
// @grant       none
// ==/UserScript==

const host = window.location.host;
const href = window.location.href;

/**
 * 获取立即执行的操作。
 */
const getInstantActions = () =>
{
    const actions = [];

    if (host === "forum.gamer.com.tw")
    {
        // 巴哈姆特。

        // 反反广告检测。
        actions.push(() =>
        {
            if (window.AntiAd)
            {
                window.AntiAd.check = _noop;
                window.AntiAd.block = _noop;
                window.AntiAd.verifyLink = () => false;
            }
        });
    }
    else if (host === "www.ruanyifeng.com")
    {
        const elem = document.querySelector("#main-content");
        if (elem)
        {
            const backup = elem.innerHTML;
            setTimeout(() =>
            {
                elem.innerHTML = backup;
                if (elem.previousElementSibling)
                {
                    elem.previousElementSibling.remove();
                }
            }, 1001);
        }
    }
    else if (
        host === "bbs.kafan.cn" ||
        host === "bbs.3dmgame.com" ||
        host === "www.chiphell.com"
    )
    {
        // 卡饭、3DMGame、Chiphell 论坛(Discuz 驱动的论坛)。

        // 屏蔽方向键翻页。
        actions.push(() =>
        {
            if (window.keyPageScroll)
            {
                window.keyPageScroll = _noop;
            }
        });
    }
    else if (host === "poedb.tw")
    {
        // 流亡编年史。

        actions.push(() =>
        {
            const elem = document.querySelector(".itemBoxContent .lc") || document.querySelector(".TextDivinationCard .ItemType");
            if (elem)
            {
                if (href.includes("/tw/") || href.includes("/us/"))
                {
                    elem.style.cursor = "pointer";
                    elem.style.color = "var(--lightning-color)";
                }

                elem.addEventListener("click", e =>
                {
                    if (href.includes("/tw/"))
                    {
                        window.open(
                            `https://pathofexile.tw/trade/search/魔影墓場?q={"query":{"type":"${e.target.textContent}","status":{"option":"online"},"filters":{"trade_filters":{"filters":{"price":{"min":2}}}}}}`,
                            "_blank"
                        );
                    }
                    else if (href.includes("/us/"))
                    {
                        window.open(
                            `https://www.pathofexile.com/trade/search/Necropolis?q={"query":{"type":"${e.target.textContent}","status":{"option":"online"},"filters":{"trade_filters":{"filters":{"price":{"min":2}}}}}}`,
                            "_blank"
                        );
                    }
                }, true);
            }
        });
    }
    else if (host === "subhd.com")
    {
        // Sub HD

        // 禁止弹窗。
        actions.push(() =>
        {
            window.open = _noop;
        });
    }
    else if (host === "login.taobao.com")
    {
        // 淘宝。

        // 默认显示密码登录(而非 QR 码登录)界面。
        actions.push(() =>
        {
            _disableQRLogin(
                ".login-switch, .login-tip, .iconfont.quick, .quick-form",
                ".static-form, .iconfont.static",
                `input[name="TPL_username"]`
            );
        });
    }
    else if (host === "auth.alipay.com")
    {
        // 支付宝。

        // 默认显示密码登录(而非 QR 码登录)界面。
        actions.push(() =>
        {
            _disableQRLogin(
                "#J-qrcode",
                "#J-login",
                "#J-input-user"
            );
        });
    }
    else if (host === "passport.jd.com")
    {
        // 京东。

        // 默认显示密码登录(而非 QR 码登录)界面。
        actions.push(() =>
        {
            _disableQRLogin(
                ".login-tab, .login-box > .mt.tab-h, .qrcode-login, #qrCoagent",
                ".login-box, #entry",
                `input[name="loginname"]`
            );
        });
    }
    else if (host === "login.xiami.com")
    {
        // 虾米。

        // 默认显示密码登录(而非 QR 码登录)界面。
        actions.push(() =>
        {
            _disableQRLogin(
                ".login-switch, .login-qrcode, .qrcode-tips",
                ".login-xm",
                `input[name="account"]`
            );
        });
    }
    else if (/^(.+\.)?github\./.test(host))
    {
        // GitHub。

        // 禁用快捷键: "s","w"。
        _disableKeydown("s w");
    }
    else if (host === "css-blocks.com")
    {
        // css-blocks

        // 禁用快捷键: "s","w"。
        _disableKeydown("s w 1 2");
    }

    return actions;
};

/**
 * 获取延迟执行的操作。
 */
const getLazyActions = () =>
{
    const actions = [];

    if (host === "forum.gamer.com.tw")
    {
        // 巴哈姆特。

        // 自动开启图片。
        actions.push(() =>
        {
            if (window.forumShowAllMedia)
            {
                window.forumShowAllMedia();
            }
        });
    }
    else if (host === "tieba.baidu.com")
    {
        // 贴吧。

        // 删除广告贴。
        actions.push(() =>
        {
            let spans;
            const elements = document.querySelectorAll("#j_p_postlist > div");
            elements.forEach((e) =>
            {
                spans = e.querySelectorAll(".core_reply_tail span");
                for (const s of spans)
                {
                    if (s.innerText.trim() === "商业推广")
                    {
                        e.remove();
                        break;
                    }
                }
            });
        });
    }
    else if (host === "kbs.sports.qq.com")
    {
        // 删除比赛剧透。
        const elements = document.querySelectorAll(".video-item .title");
        elements.forEach((e) =>
        {
            e.textContent = e.textContent.slice(0, e.textContent.indexOf(" "));
        });
    }
    else if (host === "sparticle999.github.io")
    {
        // 自动重复点击 Gain。
        const elements = document.querySelectorAll(".gainButton > .btn");
        elements.forEach((e) =>
        {
            const handler = e.onclick;
            e.onclick = () =>
            {
                for (let i = 0; i < 10000; i++)
                {
                    handler();
                }
            };
        });
    }
    else if (host === "wiki.d.163.com")
    {
        // 底部总览框置顶。
        const parent = document.getElementById("bodyContent");
        const elements = document.querySelectorAll("#bodyContent > .Allbox");
        parent.prepend(...elements);
    }
    else if (host === "sudos.help")
    {
        // 转换交易地址为 PoE TW。
        document.addEventListener("click", (e) =>
        {
            if (e.target.tagName === "A" && e.target.href && e.target.href.includes("www.pathofexile.com/trade/search"))
            {
                e.target.href = decodeURIComponent(e.target.href)
                    .replace("www.pathofexile.com", "pathofexile.tw")
                    .replace("Filled Coffin", "滿靈柩")
                    .replace("Necropolis", "魔影墓場");
            }
        }, true);
    }
    else if (host === "poe.ninja")
    {
        // 转换 Wiki 地址为 PoEDB。
        document.addEventListener("click", (e) =>
        {
            if (
                e.target.tagName === "A"
                && e.target.className
                && e.target.className.includes("wikiLink")
                && e.target.href
                && e.target.href.includes("poewiki.net/wiki")
            )
            {
                e.target.href = e.target.href.replace("poewiki.net/wiki", "poedb.tw/tw").replaceAll("%20", "_").replaceAll(" ", "_");
            }
        }, true);
    }

    return actions;
};

/**
 * 立即执行指定的操作。
 */
const exec = (p_actions) =>
{
    p_actions.forEach(p_action => p_action());
};

exec(getInstantActions());
exec(getLazyActions());

function _noop() { }

/**
 * 禁止键盘快捷键(单键)。
 */
function _disableKeydown(p_keys)
{
    if (typeof p_keys === "string")
    {
        const keys = p_keys.split(/\W+/);
        document.addEventListener("keydown", (e) =>
        {
            if (keys.indexOf(e.key.toLowerCase()) !== -1)
            {
                e.stopPropagation();
            }
        }, true);
    }
}

/**
 * 默认显示密码登录(而非 QR 码登录)界面
 */
function _disableQRLogin(p_hide, p_show, p_focus)
{
    // 删除扫码登录。
    let elements = document.querySelectorAll(p_hide);
    elements.forEach(e => e.remove());

    // 始终显示密码登录。
    elements = document.querySelectorAll(p_show);
    elements.forEach(e => e.setAttribute("style", "display: block !important; visibility: visible !important;"));

    // 自动聚焦用户名输入框。
    if (p_focus)
    {
        const elem = document.querySelector(p_focus);
        if (elem)
        {
            setTimeout(() => elem.select(), 300);
        }
    }
}