Greasy Fork

Greasy Fork is available in English.

磁力链接收集器

收集页面上的所有磁力链接并去重显示

当前为 2024-12-29 提交的版本,查看 最新版本

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

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

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

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

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

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         磁力链接收集器
// @namespace    http://tampermonkey.net/
// @version      0.1
// @description  收集页面上的所有磁力链接并去重显示
// @author       Thomas Hayes
// @match        *://*/*
// @grant        none
// @license MIT
// ==/UserScript==

(function() {
    'use strict';

    // 创建悬浮文本框
    function createFloatingBox() {
        const box = document.createElement('div');
        const style = {
            position: 'fixed',
            right: '20px',
            top: '20px',
            zIndex: '9999',
            backgroundColor: 'white',
            border: '1px solid #ccc',
            padding: '10px',
            borderRadius: '5px',
            boxShadow: '0 0 10px rgba(0,0,0,0.1)'
        };
        Object.assign(box.style, style);
        
        // 创建拖拽把手
        const dragHandle = document.createElement('div');
        dragHandle.style.cssText = `
            padding: 5px;
            margin: -10px -10px 10px -10px;
            background-color: #808080;
            color: white;
            border-bottom: 1px solid #222;
            cursor: move;
            user-select: none;
            border-radius: 5px 5px 0 0;
            display: flex;
            justify-content: space-between;
            align-items: center;
        `;

        // 添加拖拽功能
        let isDragging = false;
        let currentX;
        let currentY;
        let initialX;
        let initialY;

        dragHandle.addEventListener('mousedown', function(e) {
            isDragging = true;
            initialX = e.clientX - box.offsetLeft;
            initialY = e.clientY - box.offsetTop;
        });

        document.addEventListener('mousemove', function(e) {
            if (!isDragging) return;

            e.preventDefault();
            currentX = e.clientX - initialX;
            currentY = e.clientY - initialY;

            // 确保不会拖出屏幕
            const maxX = window.innerWidth - box.offsetWidth;
            const maxY = window.innerHeight - box.offsetHeight;
            
            currentX = Math.min(Math.max(0, currentX), maxX);
            currentY = Math.min(Math.max(0, currentY), maxY);

            box.style.left = currentX + 'px';
            box.style.top = currentY + 'px';
            box.style.right = 'auto';
        });

        document.addEventListener('mouseup', function() {
            isDragging = false;
        });

        // 把手左侧文字
        const handleText = document.createElement('span');
        handleText.textContent = '磁力链接';
        dragHandle.appendChild(handleText);
        
        const textarea = document.createElement('textarea');
        textarea.style.width = '40em';
        textarea.style.height = '10em';
        textarea.style.margin = '10px 0';
        textarea.readOnly = true;
        
        const buttonContainer = document.createElement('div');
        buttonContainer.style.display = 'flex';
        buttonContainer.style.gap = '10px';
        
        const copyBtn = document.createElement('button');
        copyBtn.textContent = '复制';
        copyBtn.onclick = () => {
            textarea.select();
            navigator.clipboard.writeText(textarea.value)
                .then(() => {
                    const originalText = copyBtn.textContent;
                    copyBtn.textContent = '已复制!';
                    setTimeout(() => {
                        copyBtn.textContent = originalText;
                    }, 1000);
                })
                .catch(err => {
                    console.error('复制失败:', err);
                    alert('复制失败,请手动复制');
                });
        };
        
        const closeBtn = document.createElement('button');
        closeBtn.textContent = '关闭';
        closeBtn.onclick = () => {
            box.remove();
            // 重新显示提示按钮
            const hintBtn = createHintButton();
            document.body.appendChild(hintBtn);
        };
        
        buttonContainer.appendChild(copyBtn);
        buttonContainer.appendChild(closeBtn);
        
        box.appendChild(dragHandle);
        box.appendChild(textarea);
        box.appendChild(buttonContainer);
        
        // 修改 ESC 键关闭功能
        const escKeyHandler = function(e) {
            if (e.key === 'Escape') {
                box.remove();
                // 移除事件监听器,避免内存泄漏
                document.removeEventListener('keydown', escKeyHandler);
                // 重新显示提示按钮
                const hintBtn = createHintButton();
                document.body.appendChild(hintBtn);
            }
        };
        document.addEventListener('keydown', escKeyHandler);

        // 当框被关闭时也要移除事件监听器
        const originalCloseHandler = closeBtn.onclick;
        closeBtn.onclick = () => {
            originalCloseHandler();
            document.removeEventListener('keydown', escKeyHandler);
        };

        return { box, textarea };
    }

    // 获取并去重磁力链接
    function getMagnetLinks() {
        const links = document.querySelectorAll('a');
        const magnetLinks = new Set();
        
        links.forEach(link => {
            const href = link.href;
            if (href && href.startsWith('magnet:')) {
                if (!magnetLinks.has(href)) {
                    magnetLinks.add(href);
                }
            }
        });
        
        return Array.from(magnetLinks);
    }

    // 创建提示按钮
    function createHintButton() {
        const hintBtn = document.createElement('div');
        const style = {
            position: 'fixed',
            right: '20px',
            top: '20px',
            width: '30px',
            height: '30px',
            backgroundColor: '#808080',
            color: 'white',
            borderRadius: '50%',
            display: 'flex',
            alignItems: 'center',
            justifyContent: 'center',
            cursor: 'pointer',
            fontSize: '16px',
            fontWeight: 'bold',
            boxShadow: '0 2px 5px rgba(0,0,0,0.2)',
            zIndex: '9998',
            userSelect: 'none'
        };
        Object.assign(hintBtn.style, style);
        
        hintBtn.textContent = 'M';
        
        // 添加悬停效果
        hintBtn.addEventListener('mouseover', () => {
            hintBtn.style.backgroundColor = '#666';
        });
        hintBtn.addEventListener('mouseout', () => {
            hintBtn.style.backgroundColor = '#808080';
        });
        
        // 点击时显示磁力链接框
        hintBtn.addEventListener('click', () => {
            hintBtn.remove();
            showMagnetBox();
        });
        
        return hintBtn;
    }

    // 显示磁力链接框
    function showMagnetBox() {
        const { box, textarea } = createFloatingBox();
        const magnetLinks = getMagnetLinks();
        textarea.value = magnetLinks.join('\n');
        document.body.appendChild(box);
    }

    // 主函数
    function main() {
        const magnetLinks = getMagnetLinks();
        if (magnetLinks.length > 0) {
            // 创建并显示提示按钮
            const hintBtn = createHintButton();
            document.body.appendChild(hintBtn);
        }
    }

    // 页面加载完成后自动检查
    if (document.readyState === 'complete') {
        main();
    } else {
        window.addEventListener('load', main);
    }

    // 快捷键,显示磁力链接框
    document.addEventListener('keydown', function(e) {
        if (e.altKey && e.key === 'g') {
            showMagnetBox();
        }
    });
})();