Greasy Fork

Greasy Fork is available in English.

MG-Linkcollector

提取页面中的磁力\Ed2k链接并收集到文本框中,支持跨网页收集,文本框内容实时更新。快捷键:监测当前页面(Alt+Q),删除当前链接(Alt+W),清除全部(Alt+A),一键复制(Alt+S),展开/关闭(无快捷键)。新增功能:自动获取新标签页的链接,聚焦页面超过2秒后再次自动获取。

当前为 2025-03-05 提交的版本,查看 最新版本

// ==UserScript==
// @name         MG-Linkcollector
// @namespace    http://tampermonkey.net/
// @version      2.1.2
// @description  提取页面中的磁力\Ed2k链接并收集到文本框中,支持跨网页收集,文本框内容实时更新。快捷键:监测当前页面(Alt+Q),删除当前链接(Alt+W),清除全部(Alt+A),一键复制(Alt+S),展开/关闭(无快捷键)。新增功能:自动获取新标签页的链接,聚焦页面超过2秒后再次自动获取。
// @author       黄萌萌可爱多
// @match        *://*/*
// @license      MIT
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        GM_getValue
// @grant        GM_setClipboard
// ==/UserScript==

(function() {
  'use strict';

  // 提取磁力链接和Ed2k链接
  function extractMagnetLinks() {
    var magnetLinks = [];
    var linkElements = document.getElementsByTagName('a');
    for (var i = 0; i < linkElements.length; i++) {
        var linkElement = linkElements[i];
        var link = linkElement.href;
        if (link.startsWith('magnet:') || link.startsWith('ed2k:')) {
            magnetLinks.push(link);
        }
    }
    var walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null, false);
    while (walker.nextNode()) {
        var node = walker.currentNode;
        var text = node.textContent.trim();
        if (text.startsWith('magnet:') || text.startsWith('ed2k:')) {
            magnetLinks.push(text);
        }
    }
    return magnetLinks;
  }

  // 从localStorage中获取已保存的磁力链接
  function getSavedMagnetLinks() {
    var savedLinks = localStorage.getItem('magnetLinks');
    return savedLinks ? JSON.parse(savedLinks) : [];
  }

  // 将新的磁力链接保存到localStorage
  function saveMagnetLinks(magnetLinks) {
    var savedLinks = getSavedMagnetLinks();
    var combinedLinks = Array.from(new Set([...savedLinks, ...magnetLinks]));
    try {
      localStorage.setItem('magnetLinks', JSON.stringify(combinedLinks));
    } catch (e) {
      if (e instanceof DOMException && e.code === 22) {
        console.warn('localStorage空间不足,正在清理旧数据...');
        var maxLinks = 100;
        if (combinedLinks.length > maxLinks) {
          combinedLinks = combinedLinks.slice(-maxLinks);
        }
        localStorage.setItem('magnetLinks', JSON.stringify(combinedLinks));
        console.log('清理完成,现在可以继续保存新数据。');
      } else {
        throw e;
      }
    }
  }

  // 删除当前页面的磁力链接
  function deleteCurrentPageLinks(currentLinks) {
    var savedLinks = getSavedMagnetLinks();
    var updatedLinks = savedLinks.filter(link => !currentLinks.includes(link));
    localStorage.setItem('magnetLinks', JSON.stringify(updatedLinks));
  }

  // 清除所有磁力链接
  function clearAllLinks() {
    localStorage.removeItem('magnetLinks');
    alert("已清除全部链接"); // 添加提醒
  }

  // 更新文本框内容
  function updateTextBox() {
    var textBox = document.getElementById('magnetLinksBox');
    var savedLinks = getSavedMagnetLinks();
    textBox.value = savedLinks.map((link, index) => `${index + 1}. ${link}`).join('\n');
  }

  // 创建文本框和悬浮按钮
  function createTextBoxAndButtons() {
    var textBox = document.createElement('textarea');
    textBox.id = 'magnetLinksBox';
    textBox.style.position = 'fixed';
    textBox.style.bottom = '170px';  // 从 200px 调整为 170px
    textBox.style.right = '10px';
    textBox.style.width = '300px';
    textBox.style.height = '200px';
    textBox.style.zIndex = '9999';
    textBox.placeholder = '提取的磁力链接将显示在这里...';
    textBox.readOnly = true; // 设置为只读
    document.body.appendChild(textBox);

    var buttonBaseStyle = {
      position: 'fixed',
      right: '10px',
      width: '70px', // 缩小30%
      height: '28px', // 缩小30%
      zIndex: '9999',
      border: 'none',
      borderRadius: '5px',
      cursor: 'pointer',
      fontSize: '10px', // 缩小字体以适应按钮
      marginBottom: '5px', // 按钮之间的间隔
      whiteSpace: 'nowrap' // 防止换行
    };

    var monitorCurrentButton = document.createElement('button');
    monitorCurrentButton.id = 'monitorCurrentLinksButton';
    monitorCurrentButton.title = '快捷键: Alt+Q';
    monitorCurrentButton.style.background = '#008CBA';
    monitorCurrentButton.style.color = 'white';
    Object.assign(monitorCurrentButton.style, buttonBaseStyle);
    monitorCurrentButton.style.bottom = '10px';
    monitorCurrentButton.textContent = '监测当前页面';
    monitorCurrentButton.addEventListener('click', function() {
      var newMagnetLinks = extractMagnetLinks();
      saveMagnetLinks(newMagnetLinks);
      updateTextBox();
    });
    document.body.appendChild(monitorCurrentButton);

    var deleteCurrentButton = document.createElement('button');
    deleteCurrentButton.id = 'deleteCurrentLinksButton';
    deleteCurrentButton.title = '快捷键: Alt+W';
    deleteCurrentButton.style.background = '#FF9800';
    deleteCurrentButton.style.color = 'white';
    Object.assign(deleteCurrentButton.style, buttonBaseStyle);
    deleteCurrentButton.style.bottom = '43px';
    deleteCurrentButton.textContent = '删除当前链接';
    deleteCurrentButton.addEventListener('click', function() {
      var currentLinks = extractMagnetLinks();
      deleteCurrentPageLinks(currentLinks);
      updateTextBox();
    });
    document.body.appendChild(deleteCurrentButton);

    var clearAllButton = document.createElement('button');
    clearAllButton.id = 'clearAllLinksButton';
    clearAllButton.title = '快捷键: Alt+A';
    clearAllButton.style.background = '#F44336';
    clearAllButton.style.color = 'white';
    Object.assign(clearAllButton.style, buttonBaseStyle);
    clearAllButton.style.bottom = '76px';
    clearAllButton.textContent = '清除全部';
    clearAllButton.addEventListener('click', function() {
      clearAllLinks();
      updateTextBox();
    });
    document.body.appendChild(clearAllButton);

    var copyButton = document.createElement('button');
    copyButton.id = 'copyLinksButton';
    copyButton.title = '快捷键: Alt+S';
    copyButton.style.background = '#2196F3';
    copyButton.style.color = 'white';
    Object.assign(copyButton.style, buttonBaseStyle);
    copyButton.style.bottom = '109px';
    copyButton.textContent = '一键复制';
    copyButton.addEventListener('click', function() {
      var savedLinks = getSavedMagnetLinks();
      GM_setClipboard(savedLinks.join('\n'), 'text');
      alert('已复制所有链接到剪贴板!');
    });
    document.body.appendChild(copyButton);

    var toggleButton = document.createElement('button');
    toggleButton.id = 'toggleLinksBoxButton';
    toggleButton.title = '展开/关闭';
    toggleButton.style.background = '#4CAF50';
    toggleButton.style.color = 'white';
    Object.assign(toggleButton.style, buttonBaseStyle);
    toggleButton.style.bottom = '142px';  // 保持原有按钮位置不变
    toggleButton.textContent = '展开/关闭';
    toggleButton.addEventListener('click', function() {
        var textBox = document.getElementById('magnetLinksBox');
        if (textBox.style.display === 'none') {
            textBox.style.display = 'block';
            GM_setValue('textBoxVisible', true);
        } else {
            textBox.style.display = 'none';
            GM_setValue('textBoxVisible', false);
        }
    });
    document.body.appendChild(toggleButton);
  }

  // 绑定快捷键
  function bindHotkeys() {
    document.addEventListener('keydown', function(event) {
      if (event.altKey) {
        switch (event.key.toLowerCase()) {
          case 'q':
            document.getElementById('monitorCurrentLinksButton').click();
            break;
          case 'w':
            document.getElementById('deleteCurrentLinksButton').click();
            break;
          case 'a':
            document.getElementById('clearAllLinksButton').click();
            break;
          case 's':
            document.getElementById('copyLinksButton').click();
            break;
        }
      }
    });
  }

  // 监听localStorage变化并更新文本框
  function setupStorageListener() {
    window.addEventListener('storage', function(event) {
      if (event.key === 'magnetLinks') {
        updateTextBox();
      }
    });
  }

  // 自动获取链接的逻辑
  function autoExtractLinks() {
    var newMagnetLinks = extractMagnetLinks();
    saveMagnetLinks(newMagnetLinks);
    updateTextBox();
  }

  // 监听窗口焦点变化
  function listenFocusEvents() {
    let lastFocusTime = Date.now();
    let isFocused = false;

    window.addEventListener('focus', function() {
      isFocused = true;
      let currentTime = Date.now();
      if (currentTime - lastFocusTime > 2000) { // 超过2秒
        autoExtractLinks();
      }
      lastFocusTime = currentTime;
    });

    window.addEventListener('blur', function() {
      isFocused = false;
    });
  }

  // 检查当前页面是否在允许的网站列表中
  function isAllowedSite() {
    var allowAllSites = GM_getValue('allowAllSites', true);
    if (allowAllSites) {
        return true;
    }
    var allowedSites = GM_getValue('allowedSites', '').split('\n').map(site => site.trim()).filter(site => site !== '');
    var currentUrl = window.location.href;
    for (var site of allowedSites) {
        if (currentUrl.startsWith(site)) {
            return true;
        }
    }
    return false;
  }

  // 油猴面板设置
  function setupSettings() {
    GM_registerMenuCommand('设置', function() {
      var hideButtons = GM_getValue('hideButtons', false);
      var version = GM_info.script.version;
      var author = GM_info.script.author;
      var allowedSites = GM_getValue('allowedSites', '');
    });
  }

  createTextBoxAndButtons();
  bindHotkeys();
  setupStorageListener();
  listenFocusEvents();
  if (isAllowedSite()) {
    autoExtractLinks();
  }
  setupSettings();

})();