Greasy Fork

Greasy Fork is available in English.

MG-Linkcollector

提取页面中的磁力\Ed2k链接并收集到文本框中,支持跨网页收集,文本框内容实时更新。快捷键:监测当前页面(Alt+Q),删除当前链接(Alt+W),清除全部(Alt+A),一键复制(Alt+S),展开/关闭(无快捷键)。

当前为 2025-02-10 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

(function() {
  'use strict';

  // 提取磁力链接和Edk2链接
  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');
  }

  // 获取文本框的显示状态
  function getTextBoxDisplayState() {
    return localStorage.getItem('textBoxDisplayState') || 'none';
  }

  // 设置文本框的显示状态
  function setTextBoxDisplayState(state) {
    localStorage.setItem('textBoxDisplayState', state);
  }

  // 创建文本框和悬浮按钮
  function createTextBoxAndButtons() {
    var textBox = document.createElement('textarea');
    textBox.id = 'magnetLinksBox';
    textBox.style.position = 'fixed';
    textBox.style.bottom = '200px';
    textBox.style.right = '10px';
    textBox.style.width = '300px';
    textBox.style.height = '200px';
    textBox.style.zIndex = '9999';
    textBox.placeholder = '提取的磁力链接将显示在这里...';
    textBox.style.display = getTextBoxDisplayState(); // 根据保存的状态设置显示或隐藏

    var toggleButton = document.createElement('button');
    toggleButton.id = 'toggleLinksBoxButton';
    toggleButton.title = '快捷键: 无'; // 添加快捷键信息
    toggleButton.style.position = 'fixed';
    toggleButton.style.bottom = '10px';
    toggleButton.style.right = '10px';
    toggleButton.style.width = '100px';
    toggleButton.style.height = '40px';
    toggleButton.style.zIndex = '9999';
    toggleButton.style.background = '#4CAF50';
    toggleButton.style.color = 'white';
    toggleButton.style.border = 'none';
    toggleButton.style.borderRadius = '5px';
    toggleButton.style.cursor = 'pointer';
    toggleButton.style.fontSize = '14px';
    toggleButton.textContent = '展开/关闭';
    toggleButton.addEventListener('click', function() {
      var textBox = document.getElementById('magnetLinksBox');
      if (textBox.style.display === 'none') {
        var savedLinks = getSavedMagnetLinks();
        textBox.value = savedLinks.map((link, index) => `${index + 1}. ${link}`).join('\n');
        textBox.style.display = 'block';
        setTextBoxDisplayState('block'); // 保存显示状态
      } else {
        textBox.style.display = 'none';
        setTextBoxDisplayState('none'); // 保存隐藏状态
      }
    });

    var deleteCurrentButton = document.createElement('button');
    deleteCurrentButton.id = 'deleteCurrentLinksButton';
    deleteCurrentButton.title = '快捷键: Alt+W'; // 添加快捷键信息
    deleteCurrentButton.style.position = 'fixed';
    deleteCurrentButton.style.bottom = '60px';
    deleteCurrentButton.style.right = '10px';
    deleteCurrentButton.style.width = '100px';
    deleteCurrentButton.style.height = '40px';
    deleteCurrentButton.style.zIndex = '9999';
    deleteCurrentButton.style.background = '#FF9800';
    deleteCurrentButton.style.color = 'white';
    deleteCurrentButton.style.border = 'none';
    deleteCurrentButton.style.borderRadius = '5px';
    deleteCurrentButton.style.cursor = 'pointer';
    deleteCurrentButton.style.fontSize = '14px';
    deleteCurrentButton.textContent = '删除当前链接';
    deleteCurrentButton.addEventListener('click', function() {
      var currentLinks = extractMagnetLinks();
      deleteCurrentPageLinks(currentLinks);
      var textBox = document.getElementById('magnetLinksBox');
      textBox.value = getSavedMagnetLinks().join('\n');
    });

    var copyButton = document.createElement('button');
    copyButton.id = 'copyLinksButton';
    copyButton.title = '快捷键: Alt+S'; // 添加快捷键信息
    copyButton.style.position = 'fixed';
    copyButton.style.bottom = '110px';
    copyButton.style.right = '10px';
    copyButton.style.width = '100px';
    copyButton.style.height = '40px';
    copyButton.style.zIndex = '9999';
    copyButton.style.background = '#2196F3';
    copyButton.style.color = 'white';
    copyButton.style.border = 'none';
    copyButton.style.borderRadius = '5px';
    copyButton.style.cursor = 'pointer';
    copyButton.style.fontSize = '14px';
    copyButton.textContent = '一键复制';
    copyButton.addEventListener('click', function() {
      var textBox = document.getElementById('magnetLinksBox');
      var linksWithNumbers = textBox.value.split('\n');
      var plainLinks = linksWithNumbers.map(link => link.split('. ').slice(1).join('. ')).filter(link => link);
      textBox.value = plainLinks.join('\n');
      textBox.select();
      document.execCommand('copy');
      alert('已复制所有链接到剪贴板!');
      var savedLinks = getSavedMagnetLinks();
      textBox.value = savedLinks.map((link, index) => `${index + 1}. ${link}`).join('\n');
    });

    var clearAllButton = document.createElement('button');
    clearAllButton.id = 'clearAllLinksButton';
    clearAllButton.title = '快捷键: Alt+A'; // 添加快捷键信息
    clearAllButton.style.position = 'fixed';
    clearAllButton.style.bottom = '160px';
    clearAllButton.style.right = '10px';
    clearAllButton.style.width = '100px';
    clearAllButton.style.height = '40px';
    clearAllButton.style.zIndex = '9999';
    clearAllButton.style.background = '#F44336';
    clearAllButton.style.color = 'white';
    clearAllButton.style.border = 'none';
    clearAllButton.style.borderRadius = '5px';
    clearAllButton.style.cursor = 'pointer';
    clearAllButton.style.fontSize = '14px';
    clearAllButton.textContent = '清除全部';
    clearAllButton.addEventListener('click', function() {
      clearAllLinks();
      var textBox = document.getElementById('magnetLinksBox');
      textBox.value = '';
    });

    var monitorCurrentButton = document.createElement('button');
    monitorCurrentButton.id = 'monitorCurrentLinksButton';
    monitorCurrentButton.title = '快捷键: Alt+Q'; // 添加快捷键信息
    monitorCurrentButton.style.position = 'fixed';
    monitorCurrentButton.style.bottom = '210px';
    monitorCurrentButton.style.right = '10px';
    monitorCurrentButton.style.width = '100px';
    monitorCurrentButton.style.height = '40px';
    monitorCurrentButton.style.zIndex = '9999';
    monitorCurrentButton.style.background = '#008CBA';
    monitorCurrentButton.style.color = 'white';
    monitorCurrentButton.style.border = 'none';
    monitorCurrentButton.style.borderRadius = '5px';
    monitorCurrentButton.style.cursor = 'pointer';
    monitorCurrentButton.style.fontSize = '14px';
    monitorCurrentButton.textContent = '监测当前页面';
    monitorCurrentButton.addEventListener('click', function() {
      var newMagnetLinks = extractMagnetLinks();
      saveMagnetLinks(newMagnetLinks);
      var textBox = document.getElementById('magnetLinksBox');
      if (textBox.style.display !== 'none') {
        var savedLinks = getSavedMagnetLinks();
        textBox.value = savedLinks.map((link, index) => `${index + 1}. ${link}`).join('\n');
      }
    });

    document.body.appendChild(textBox);
    document.body.appendChild(toggleButton);
    document.body.appendChild(deleteCurrentButton);
    document.body.appendChild(copyButton);
    document.body.appendChild(clearAllButton);
    document.body.appendChild(monitorCurrentButton);
  }

  // 绑定快捷键
  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;
        }
      }
    });
  }

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

    if (allowAllSites) {
      return true;
    }

    for (var site of allowedSites) {
      if (currentUrl.startsWith(site)) {
        return true;
      }
    }
    return false;
  }

  // 设置菜单命令
  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', ''); // 获取允许的网站列表
    var allowAllSites = GM_getValue('allowAllSites', true); // 默认允许所有网站

    var html = `
      <div style="padding: 30px; background-color: white; border: 1px solid #ccc; border-radius: 8px; box-shadow: 0 2px 30px rgba(0, 0, 0, 0.1); width: 400px; height: 300px; font-size: 18px;">
        <h2>设置</h2>
        <p>作者: ${author}</p>
        <p>版本: ${version}</p>
        <label style="display: flex; align-items: center;">
          <span style="margin-right: 10px;">隐藏悬浮按钮</span>
          <label class="switch">
            <input type="checkbox" id="hideButtonsCheckbox" ${hideButtons ? 'checked' : ''}>
            <span class="slider round"></span>
          </label>
        </label>
        <br>
        <label style="display: flex; align-items: center;">
          <span style="margin-right: 10px;">允许适用脚本于任何网站</span>
          <label class="switch">
            <input type="checkbox" id="allowAllSitesCheckbox" ${allowAllSites ? 'checked' : ''}>
            <span class="slider round"></span>
          </label>
        </label>
        <br>
        <label style="display: flex; align-items: center;">
          <span style="margin-right: 10px;">仅允许用该脚本的网站(每行一个URL)</span>
          <textarea id="allowedSitesTextarea" style="width: 300px; height: 100px;">${allowedSites}</textarea>
        </label>
        <br>
        <button id="saveSettingsButton" style="margin-top: 20px; padding: 10px 20px; background-color: #4CAF50; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 16px;">保存</button>
        <button id="closeSettingsButton" style="margin-top: 10px; padding: 10px 20px; background-color: #F44336; color: white; border: none; border-radius: 5px; cursor: pointer; font-size: 16px;">关闭</button>
      </div>
    `;
    var div = document.createElement('div');
    div.innerHTML = html;
    div.style.position = 'fixed';
    div.style.top = '50%';
    div.style.left = '50%';
    div.style.transform = 'translate(-50%, -50%)';
    div.style.zIndex = '10000';
    document.body.appendChild(div);

    document.getElementById('saveSettingsButton').addEventListener('click', function() {
      var hideButtonsCheckbox = document.getElementById('hideButtonsCheckbox');
      GM_setValue('hideButtons', hideButtonsCheckbox.checked);

      var allowAllSitesCheckbox = document.getElementById('allowAllSitesCheckbox');
      GM_setValue('allowAllSites', allowAllSitesCheckbox.checked);

      var allowedSitesTextarea = document.getElementById('allowedSitesTextarea');
      GM_setValue('allowedSites', allowedSitesTextarea.value);

      // 更新按钮显示状态
      var toggleButton = document.getElementById('toggleLinksBoxButton');
      var deleteCurrentButton = document.getElementById('deleteCurrentLinksButton');
      var copyButton = document
            var clearAllButton = document.getElementById('clearAllLinksButton');
      var monitorCurrentButton = document.getElementById('monitorCurrentLinksButton');
      if (hideButtonsCheckbox.checked) {
        toggleButton.style.display = 'none';
        deleteCurrentButton.style.display = 'none';
        copyButton.style.display = 'none';
        clearAllButton.style.display = 'none';
        monitorCurrentButton.style.display = 'none';
      } else {
        toggleButton.style.display = 'block';
        deleteCurrentButton.style.display = 'block';
        copyButton.style.display = 'block';
        clearAllButton.style.display = 'block';
        monitorCurrentButton.style.display = 'block';
      }

      // 关闭设置菜单
      document.body.removeChild(div);
    });

    document.getElementById('closeSettingsButton').addEventListener('click', function() {
      document.body.removeChild(div);
    });
  });

  // 主逻辑
  if (isAllowedSite()) {
    createTextBoxAndButtons();
    bindHotkeys();
  }
})();