快捷复制 Saber Token

一键复制 saber-access-token 到剪贴板,圆形按钮可拖拽,支持两个地址

// ==UserScript==
// @name         快捷复制 Saber Token
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  一键复制 saber-access-token 到剪贴板,圆形按钮可拖拽,支持两个地址
// @author       Dia
// @match        http://10.250.5.21/*
// @match        http://10.138.231.115/*
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
    'use strict';

    // 创建圆形悬浮按钮
    const btn = document.createElement('button');
    btn.innerText = '🔑';
    btn.title = '复制 Token';
    btn.style.position = 'fixed';
    btn.style.right = '30px';
    btn.style.bottom = '30px';
    btn.style.zIndex = '9999';
    btn.style.width = '48px';
    btn.style.height = '48px';
    btn.style.background = '#007bff';
    btn.style.color = '#fff';
    btn.style.border = 'none';
    btn.style.borderRadius = '50%';
    btn.style.boxShadow = '0 2px 8px rgba(0,0,0,0.15)';
    btn.style.cursor = 'grab';
    btn.style.fontSize = '24px';
    btn.style.opacity = '0.85';
    btn.style.display = 'flex';
    btn.style.alignItems = 'center';
    btn.style.justifyContent = 'center';
    btn.style.userSelect = 'none';

    btn.onmouseover = () => btn.style.opacity = '1';
    btn.onmouseout = () => btn.style.opacity = '0.85';

    // 拖拽功能
    let isDragging = false, offsetX = 0, offsetY = 0;

    btn.addEventListener('mousedown', function(e) {
        isDragging = true;
        btn.style.cursor = 'grabbing';
        offsetX = e.clientX - btn.getBoundingClientRect().left;
        offsetY = e.clientY - btn.getBoundingClientRect().top;
        document.body.style.userSelect = 'none';
    });

    document.addEventListener('mousemove', function(e) {
        if (isDragging) {
            let x = e.clientX - offsetX;
            let y = e.clientY - offsetY;
            x = Math.max(0, Math.min(window.innerWidth - btn.offsetWidth, x));
            y = Math.max(0, Math.min(window.innerHeight - btn.offsetHeight, y));
            btn.style.left = x + 'px';
            btn.style.top = y + 'px';
            btn.style.right = '';
            btn.style.bottom = '';
        }
    });

    document.addEventListener('mouseup', function() {
        if (isDragging) {
            isDragging = false;
            btn.style.cursor = 'grab';
            document.body.style.userSelect = '';
        }
    });

    // 复制 token 的函数
    function copyToken() {
        const cookies = document.cookie.split(';');
        let token = '';
        for (let c of cookies) {
            let [key, value] = c.split('=');
            if (key.trim() === 'saber-access-token') {
                token = decodeURIComponent(value);
                break;
            }
        }
        if (token) {
            if (typeof GM_setClipboard === 'function') {
                GM_setClipboard(token);
            } else {
                navigator.clipboard.writeText(token);
            }
            showTip('Token 已复制!');
        } else {
            showTip('未找到 Token!');
        }
    }

    // 显示提示
    function showTip(msg) {
        const tip = document.createElement('div');
        tip.innerText = msg;
        tip.style.position = 'fixed';
        tip.style.right = '40px';
        tip.style.bottom = '90px';
        tip.style.background = '#333';
        tip.style.color = '#fff';
        tip.style.padding = '10px 18px';
        tip.style.borderRadius = '6px';
        tip.style.zIndex = '10000';
        tip.style.fontSize = '15px';
        tip.style.opacity = '0.95';
        document.body.appendChild(tip);
        setTimeout(() => {
            tip.remove();
        }, 1800);
    }

    btn.onclick = function(e) {
        if (!isDragging) copyToken();
    };

    document.body.appendChild(btn);
})();