Download Link Collector

Collects magnet/ed2k links and provides copy to clipboard.

Tendrás que instalar una extensión para tu navegador como Tampermonkey, Greasemonkey o Violentmonkey si quieres utilizar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Violentmonkey para instalar este script.

Necesitarás instalar una extensión como Tampermonkey o Userscripts para instalar este script.

Necesitará instalar una extensión como Tampermonkey para instalar este script.

Necesitarás instalar una extensión para administrar scripts de usuario si quieres instalar este script.

(Ya tengo un administrador de scripts de usuario, déjame instalarlo)

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión como Stylus para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

Necesitará instalar una extensión del gestor de estilos de usuario para instalar este estilo.

(Ya tengo un administrador de estilos de usuario, déjame instalarlo)

// ==UserScript==
// @name         Download Link Collector
// @namespace    dlc
// @version      0.1.0
// @description  Collects magnet/ed2k links and provides copy to clipboard.
// @author       wzzzzz
// @license MIT

// @include      *://*javbus.com/*
// @include      *://www.*bus*/*
// @include      *://www.*javsee*/*
// @include      *://www.*seejav*/*
// @include      *://www.south-plus.net/*

// @include      *://*sehuatang.net/*

// @include      *://*onejav.com/*

// @include      *://*avsox.*/*

// @include      *://*jav321.com/video/*
// @grant        GM_setClipboard
// ==/UserScript==
(function() {
    'use strict';

    // 收集磁力链接
    function collectLinks() {
        function traverseDOM(element) {
            let downloadLinks = [];

            if (element.nodeType === Node.TEXT_NODE) {
                // 如果当前节点是文本节点,则在文本中查找链接
                let innerText = element.nodeValue;
                let collect_str = collect(innerText);
                if (collect_str && collect_str.length) downloadLinks = downloadLinks.concat(collect_str);
            } else if (element.tagName === 'LI') {
                let collect_str = collect(element.innerHTML);
                if (collect_str && collect_str.length) downloadLinks = downloadLinks.concat(collect_str);
            } else if (element.nodeType === Node.ELEMENT_NODE) {
                // 如果当前节点是元素节点,则递归遍历其子元素
                for (let i = 0; i < element.childNodes.length; i++) {
                    downloadLinks = downloadLinks.concat(traverseDOM(element.childNodes[i]));
                }
            }

            return downloadLinks;
        }

        // 提取链接
        function collect(link_str) {
            if (!link_str) return '';
            let result = '';
            let pattern = /(magnet:\?xt=urn:btih:)[0-9a-fA-F]{40}/g;
            let pattern_lite = /[0-9a-fA-F]{40}[\s]?/g;
            let pattern_ed2k = /ed2k:\/\/\|file\|.+\|\//g;
            let matches = link_str.match(pattern);
            let matches_ed2k = link_str.match(pattern_ed2k);
            if (matches) {
                result = matches;
            } else if (matches_ed2k) {
                result = matches_ed2k;
            }
            else {
                let lites = link_str.match(pattern_lite);
                if (lites) {
                    lites = lites.map(str => `magnet:?xt=urn:btih:${str.replace(/^\s*|\s*$/g, '')}`);
                    result = lites;
                }
            }
            return result
        }

        // 链接去重
        function unique(arr) {
            let result = [];
            let obj = {};
            for (let i = 0; i < arr.length; i++) {
                let str = arr[i].toLowerCase();
                if (!obj[str]) {
                    result.push(arr[i]);
                    obj[str] = true;
                }
            }
            return result;
        }

        // 获取 <body> 元素
        let bodyElement = document.getElementsByTagName('body')[0];

        // 遍历 <body> 元素的所有子元素,并查找链接
        let downloadLinks = unique(traverseDOM(bodyElement));

        let linksText = downloadLinks.join("\n");

        console.log(downloadLinks);

        // 复制链接到剪贴板
        if (downloadLinks.length > 0) {
            let copyButton = document.createElement('button');
            copyButton.textContent = `Copy ${downloadLinks.length} Links`;
            copyButton.style.position = 'fixed';
            copyButton.style.bottom = '20px';
            copyButton.style.right = '20px';
            copyButton.style.zIndex = '9999';
            document.body.appendChild(copyButton);

            copyButton.addEventListener('click', function() {
                navigator.clipboard.writeText(linksText).then(function() {
                    alert('Links copied to clipboard!');
                }).catch(function(error) {
                    console.error('Failed to copy links to clipboard:', error);
                });
            });
        }
    }

    // 页面加载完成后收集磁力链接
    window.addEventListener('load', function() {
        collectLinks();
    });

})();