超星云盘文件信息提取器--分享链接

提取云盘文件信息

// ==UserScript==
// @name         超星云盘文件信息提取器--分享链接
// @namespace    http://tampermonkey.net/
// @version      0.2
// @description  提取云盘文件信息
// @author       榛铭
// @match        https://pan-yz.cldisk.com/external/m/file/*
// @grant        none
// @run-at       document-start
// @license      MIT
// ==/UserScript==



(function() {
    'use strict';

    const isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);
    
    // 通用样式
    const styles = {
        base: `
            background: rgba(255, 255, 255, 0.98);
            border-radius: 12px;
            transition: all 0.2s ease;
        `,
        button: `
            width: 100%;
            border: none;
            padding: 10px;
            border-radius: 8px;
            cursor: pointer;
            font-size: 14px;
            font-weight: 500;
        `
    };

    // 检查文件信息是否存在
    const checkExist = setInterval(() => {
        if (window.fileinfo) {
            clearInterval(checkExist);
            createInfoWindow(window.fileinfo);
        }
    }, 200);

    setTimeout(() => clearInterval(checkExist), 60000);

    // 文件大小格式化
    const formatSize = bytes => {
        if (bytes === 0) return '0 B';
        const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
        const i = Math.floor(Math.log(bytes) / Math.log(1024));
        return `${(bytes / Math.pow(1024, i)).toFixed(2)} ${sizes[i]}`;
    };

    // 复制到剪贴板
    async function copyToClipboard(text) {
        try {
            if (navigator.clipboard) {
                await navigator.clipboard.writeText(text);
                return true;
            }
            const textarea = document.createElement('textarea');
            textarea.value = text;
            textarea.style.position = 'fixed';
            textarea.style.opacity = '0';
            document.body.appendChild(textarea);
            textarea.select();
            const success = document.execCommand('copy');
            document.body.removeChild(textarea);
            return success;
        } catch (err) {
            console.error('复制失败:', err);
            return false;
        }
    }

    // 显示提示
    function showTip(tip, isSuccess = true) {
        const copyTip = document.querySelector('#copyTip');
        copyTip.textContent = tip;
        copyTip.style.background = isSuccess ? 'rgba(0, 0, 0, 0.8)' : '#ff4444';
        copyTip.style.opacity = '1';
        copyTip.style.transform = 'translate(-50%, -50%) scale(1)';
        setTimeout(() => {
            copyTip.style.opacity = '0';
            copyTip.style.transform = 'translate(-50%, -50%) scale(0.8)';
        }, 2000);
    }

    // 添加悬停效果
    function addHoverEffect(element, defaultColor, hoverColor) {
        element.addEventListener('mouseover', () => element.style.background = hoverColor);
        element.addEventListener('mouseout', () => element.style.background = defaultColor);
    }

    // 拖拽处理类
    class DragHandler {
        constructor(element, handle) {
            this.element = element;
            this.handle = handle;
            this.isDragging = false;
            this.offset = { x: 0, y: 0 };
            this.init();
        }

        init() {
            this.handle.addEventListener('mousedown', e => this.dragStart(e));
            document.addEventListener('mousemove', e => this.drag(e));
            document.addEventListener('mouseup', () => this.dragEnd());
        }

        dragStart(e) {
            if (e.target === this.handle || e.target.parentNode === this.handle) {
                this.isDragging = true;
                this.initial = {
                    x: e.clientX - this.offset.x,
                    y: e.clientY - this.offset.y
                };
                this.element.style.transition = 'none';
                this.element.style.boxShadow = '0 4px 20px rgba(0,0,0,0.2)';
            }
        }

        drag(e) {
            if (this.isDragging) {
                e.preventDefault();
                this.offset.x = e.clientX - this.initial.x;
                this.offset.y = e.clientY - this.initial.y;
                this.element.style.right = `${-this.offset.x}px`;
                this.element.style.top = `${this.offset.y + 10}px`;
            }
        }

        dragEnd() {
            if (this.isDragging) {
                this.isDragging = false;
                this.element.style.transition = 'all 0.3s ease';
                this.element.style.boxShadow = '0 2px 10px rgba(0,0,0,0.1)';
            }
        }
    }

    function createInfoWindow(fileinfo) {
        const infoDiv = document.createElement('div');
        infoDiv.style.cssText = `
            position: fixed;
            top: 10px;
            right: 10px;
            padding: 15px;
            z-index: 2147483647;
            font-size: 14px;
            max-width: 300px;
            width: calc(100% - 40px);
            border: 1px solid #e0e0e0;
            ${!isMobile ? 'cursor: move;' : ''}
            user-select: none;
            opacity: 0;
            transform: translateY(-20px);
            backdrop-filter: blur(10px);
            ${styles.base}
        `;

        const realDownloadLink = `https://sharewh.chaoxing.com/share/download/${fileinfo.objectId}`;

        infoDiv.innerHTML = `
            <div id="dragHandle" style="
                display: flex;
                justify-content: space-between;
                align-items: center;
                margin-bottom: 12px;
                ${!isMobile ? 'cursor: move;' : ''}
            ">
                <span style="font-weight: bold; color: #333;">文件信息</span>
                <span id="toggleBtn" style="
                    cursor: pointer;
                    padding: 4px 10px;
                    background: #f5f5f5;
                    border-radius: 6px;
                    font-size: 12px;
                    ${styles.base}
                ">收起</span>
            </div>
            <div id="infoContent">
                <div style="
                    background: #f8f9fa;
                    padding: 12px;
                    border-radius: 8px;
                    margin-bottom: 12px;
                    font-size: 13px;
                    line-height: 1.6;
                    border: 1px solid #eee;
                ">
                    <div><strong>文件名:</strong>${fileinfo.name}</div>
                    <div><strong>大小:</strong>${formatSize(fileinfo.filesize)}</div>
                    <div><strong>类型:</strong>${fileinfo.suffix.toUpperCase()}</div>
                </div>
                <button id="copyBtn" style="
                    background: #4CAF50;
                    color: white;
                    ${styles.button}
                ">复制下载链接</button>
            </div>
            <div id="copyTip" style="
                position: fixed;
                top: 50%;
                left: 50%;
                transform: translate(-50%, -50%) scale(0.8);
                background: rgba(0, 0, 0, 0.8);
                color: white;
                padding: 10px 20px;
                border-radius: 8px;
                font-size: 14px;
                opacity: 0;
                transition: all 0.3s ease;
                pointer-events: none;
                z-index: 2147483648;
            ">已复制到剪贴板</div>
        `;

        document.body.appendChild(infoDiv);

        // 显示动画
        setTimeout(() => {
            infoDiv.style.opacity = '1';
            infoDiv.style.transform = 'translateY(0)';
        }, 100);

        const toggleBtn = infoDiv.querySelector('#toggleBtn');
        const copyBtn = infoDiv.querySelector('#copyBtn');
        const infoContent = infoDiv.querySelector('#infoContent');

        // 添加悬停效果
        addHoverEffect(toggleBtn, '#f5f5f5', '#e9ecef');
        addHoverEffect(copyBtn, '#4CAF50', '#45a049');

        // 拖拽功能
        if (!isMobile) {
            new DragHandler(infoDiv, infoDiv.querySelector('#dragHandle'));
        }

        // ��开/收起功能
        let isCollapsed = false;
        toggleBtn.addEventListener('click', () => {
            isCollapsed = !isCollapsed;
            infoContent.style.opacity = isCollapsed ? '0' : '1';
            infoContent.style.transform = isCollapsed ? 'translateY(-10px)' : 'translateY(0)';
            infoContent.style.display = isCollapsed ? 'none' : 'block';
            toggleBtn.textContent = isCollapsed ? '展开' : '收起';
            if (!isCollapsed) {
                infoContent.style.display = 'block';
                setTimeout(() => {
                    infoContent.style.opacity = '1';
                    infoContent.style.transform = 'translateY(0)';
                }, 10);
            }
        });

        // 复制功能
        copyBtn.addEventListener('click', async () => {
            const success = await copyToClipboard(realDownloadLink);
            showTip(success ? '已复制到剪贴板' : '复制失败', success);
        });
    }
})();