Shopee 悬浮按钮

悬浮快捷入口

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

You will need to install an extension such as Tampermonkey to install this script.

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         Shopee 悬浮按钮
// @namespace    http://tampermonkey.net/
// @version      2.1.4
// @license      Rayu
// @description  悬浮快捷入口
// @author       Rayu
// @match        https://seller.shopee.tw/*
// @exclude      https://seller.shopee.tw/webchat/conversations
// @match        *://shopee.tw/*
// @match        *://shopee.ph/*
// @match        *://shopee.sg/*
// @match        *://shopee.com.my/*
// @icon         https://www.wikimedia.org/static/favicon/wikipedia.ico
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

(function () {
    'use strict';
    // 配置中心
    const CONFIG = {
        BUTTONS: [
            {
                id: 'shipment-btn',
                content: '待<br>出货',
                path: '/portal/sale/shipment?type=toship',
                title: '待处理订单'
            },
            {
                id: 'products-btn',
                content: '我的<br>商品',
                path: '/portal/product/list/all?page=1&size=48',
                title: '商品管理'
            },
            {
                id: 'analytics-btn',
                content: '商品<br>分析',
                path: '/datacenter/product/overview',
                title: '数据分析'
            },
            {
                id: 'ads-btn',
                content: '我的<br>广告',
                path: '/portal/marketing/pas/assembly',
                title: '广告管理'
            },
            {
                id: 'campaign-btn',
                content: '行销<br>活动',
                path: '/portal/marketing/list/discount',
                title: '营销活动'
            },
            {
                id: 'returns-btn',
                content: '退貨<br>退款',
                path: '/portal/sale/return',
                title: '退货退款'
            }
        ],
        TRACKING_PATTERN: /-i\.(\d+)\.(\d+)/,
        STYLES: `
            :root {
                --primary-color: #ee4d2d;
                --button-size: 52px;
                --hover-scale: 1.08;
                --gap: 8px;
            }
            #floating-buttons-container {
                position: fixed;
                top: 50vh;
                right: 50px;
                transform: translateY(-50%);
                display: flex;
                flex-direction: column;
                gap: var(--gap);
                z-index: 9999;
                filter: drop-shadow(0 2px 6px rgba(0,0,0,0.16));
            }
            .floating-button {
                display: flex;
                align-items: center;
                justify-content: center;
                width: var(--button-size);
                height: var(--button-size);
                background: var(--primary-color);
                color: white !important;
                border-radius: 8px;
                font-size: 15px;
                font-weight: 500;
                line-height: 1.3;
                text-align: center;
                text-decoration: none !important;
                cursor: pointer;
                transition:
                    transform 0.2s cubic-bezier(0.18, 0.89, 0.32, 1.28),
                    opacity 0.2s,
                    background 0.2s;
                user-select: none;
            }
            .floating-button:hover {
                transform: scale(var(--hover-scale));
                background: #d14327;
                opacity: 0.95;
            }
            .floating-button:active {
                transition-duration: 0.1s;
                transform: scale(0.96);
            }
            @media (max-width: 768px) {
                #floating-buttons-container {
                    right: 4px;
                    transform: translateY(-50%) scale(0.82);
                    gap: 6px;
                }
                .floating-button {
                    width: 46px;
                    height: 46px;
                    font-size: 14px;
                }
            }
        `
    };
    // 核心功能模块
    class ShopeeEnhancer {
        constructor() {
            this.observer = null;
            this.reg = CONFIG.TRACKING_PATTERN;
            this.init();
        }
        init() {
            this.injectStyles();
            this.createFloatingButtons();
            this.hijackHistoryMethods();
            this.sanitizeLinks();
        }
        injectStyles() {
            GM_addStyle(CONFIG.STYLES);
        }
        createFloatingButtons() {
            // 清理老容器
            let container = document.getElementById('floating-buttons-container');
            if (container) container.remove();
            // 新建右侧容器
            container = document.createElement('div');
            container.id = 'floating-buttons-container';
            document.body.appendChild(container);
            // 添加配置按钮
            CONFIG.BUTTONS.forEach(btn => {
                let a = document.createElement('a');
                a.className = 'floating-button';
                a.id = btn.id;
                a.href = btn.path.startsWith('javascript:') ? '#' : new URL(btn.path, window.location.origin);
                a.target = '_blank';
                a.rel = 'noopener noreferrer';
                a.title = btn.title;
                a.innerHTML = btn.content;
                container.appendChild(a);
            });
        }
        // URL清理功能
        cleanURL(url) {
            const match = url.match(this.reg);
            if (!match) return url;
            return `${window.location.origin}/product/${match[1]}/${match[2]}`;
        }
        // 劫持历史记录方法,优化URL
        hijackHistoryMethods() {
            const self = this;
            const originalPushState = history.pushState;
            const originalReplaceState = history.replaceState;
            history.pushState = function (state, title, url) {
                if (url) url = self.cleanURL(url);
                return originalPushState.call(this, state, title, url);
            };
            history.replaceState = function (state, title, url) {
                if (url) url = self.cleanURL(url);
                return originalReplaceState.call(this, state, title, url);
            };
        }
        // 清理页面链接
        sanitizeLinks() {
            if (this.reg.test(window.location.href)) {
                window.location.replace(this.cleanURL(window.location.href));
                return;
            }
            this.processLinks(document);
            // 监控动态加载的内容
            this.observer = new MutationObserver(mutations => {
                mutations.forEach(({ addedNodes }) => {
                    addedNodes.forEach(node => {
                        if (node.nodeType === Node.ELEMENT_NODE) {
                            this.processLinks(node);
                        }
                    });
                });
            });
            this.observer.observe(document, {
                subtree: true,
                childList: true
            });
        }
        // 处理链接
        processLinks(root) {
            const links = root.querySelectorAll('a[href*="-i."]');
            links.forEach(link => {
                link.href = this.cleanURL(link.href);
            });
        }
    }
    // 启动脚本
    const enhancer = new ShopeeEnhancer();
    // 监控路由变化,更新悬浮按钮
    let lastUrl = location.href;
    setInterval(() => {
        if (location.href !== lastUrl) {
            lastUrl = location.href;
            enhancer.createFloatingButtons();
        }
    }, 1000);
    // --------------- 以下为你提供的代码 ---------------
    GM_addStyle(`
        /* 解除eds-table主体高度限制和滚动 */
        .eds-table__body-container,
        .eds-scrollbar__wrapper,
        .eds-scrollbar__content,
        .eds-scrollbar,
        .eds-table,
        .eds-table__main-body,
        .eds-table__main-header,
        .roi-batch-auto-bidding-strategy-wrapper,
        .common-card__content,
        .common-card,
        [data-v-461b9dcb], /* 视需要加 */
        [data-v-529f5f34] {
            max-height: none !important;
            height: auto !important;
            overflow: visible !important;
        }
        /* 隐藏所有滚动条 */
        .eds-scrollbar__bar.horizontal,
        .eds-scrollbar__bar.vertical {
            display: none !important;
        }
    `);
    const targetSelector = [
        '.eds-table__body-container',
        '.eds-scrollbar__wrapper',
        '.eds-scrollbar__content',
        '.eds-scrollbar',
        '.eds-table',
        '.eds-table__main-body',
        '.eds-table__main-header',
        '.roi-batch-auto-bidding-strategy-wrapper',
        '.common-card__content',
        '.common-card',
        '[data-v-461b9dcb]',
        '[data-v-529f5f34]'
    ].join(',');
    function clearHeightAndOverflow() {
        document.querySelectorAll(targetSelector).forEach(el => {
            el.style.maxHeight = 'none';
            el.style.height = 'auto';
            el.style.overflow = 'visible';
        });
    }
    clearHeightAndOverflow();
    const observer = new MutationObserver(() => {
        clearHeightAndOverflow();
    });
    observer.observe(document.body, { childList: true, subtree: true });
})();