Greasy Fork

Greasy Fork is available in English.

Shopee 悬浮按钮

悬浮快捷入口

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 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 });
})();