Greasy Fork 还支持 简体中文。

网盘提取工具

尽可能在支持的网盘自动输入提取码,省去下载的烦恼。

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         网盘提取工具
// @namespace    http://www.fishlee.net/
// @version      3.3
// @description  尽可能在支持的网盘自动输入提取码,省去下载的烦恼。
// @author       木鱼(iFish)
// @match        *://*/*
// @grant        unsafeWindow
// @icon         https://ssl-static.fishlee.net/resources/emot/xr/22.gif
// ==/UserScript==

(function(window, self, unsafeWindow) {
    'use strict';
    let timeStart = new Date().getTime();
    let location = self.location;
    let host = location.host;
    let path = location.pathname;
    let code, input;
    let getCode = function(rule) {
        code = location.hash.slice(1, 5);
        if ((rule || /([a-z\d]{4})/i.exec(code))) {
            code = RegExp.$1;
        } else code = null;
        return code;
    };
    if (/(pan|e?yun)\.baidu\.com/.test(host)) {
        //百度云盘
        if (path.indexOf("/share/") !== -1 && document.querySelector('form[name="accessForm"]') && getCode()) {
            let target = document.querySelector('.pickpw input');
            if (!target)
                return;

            target.value = code;
            unsafeWindow.document.querySelector('form[name="accessForm"]').onsubmit();
        }
    } else if (/\.lanzou[sx]?\.com/.test(host) && getCode()) {
        let target = document.querySelector('#pwd');
        if (!target)
            return;

        target.value = code;
        let btn = unsafeWindow.document.querySelector('#sub') || unsafeWindow.document.querySelector('.passwddiv-btn');

        btn && btn.dispatchEvent(new UIEvent('click'));
    } else if (/cloud.189.cn/.test(host) && getCode()) {
        let target = document.getElementById('code_txt');
        if (!target)
            return;

        target.value = code;

        let nameLabel = document.querySelector('.shareDate');
        let delayFunc = () => {
            if (!nameLabel.innerText) {
                console.log('delay 500ms due to page load not complete.');
                setTimeout(delayFunc, 500);
            } else {
                unsafeWindow.$(target.nextElementSibling).click();
            }
        };
        setTimeout(delayFunc, 500);
    } else {
        //其它网站,检测链接
        Array.prototype.slice.call(document.querySelectorAll("a[href*='pan.baidu.com'], a[href*='lanzou.com'], a[href*='lanzous.com'], a[href*='lanzoux.com']")).forEach(function(link) {
            let txt = link.nextSibling && link.nextSibling.nodeValue;
            let linkcode = /码.*?([a-z\d]{4})/i.exec(txt) && RegExp.$1;
            if (!linkcode) {
                txt = link.parentNode.innerText;
                linkcode = /码.*?([a-z\d]{4})/i.exec(txt) && RegExp.$1;
            }
            if (linkcode) {
                let href = link.getAttribute("href");
                link.setAttribute("href", href + "#" + linkcode);
            }
        });
    }
    let timeEnd = new Date().getTime();
    console.log("[网盘提取工具] 链接处理完成,耗时:" + (timeEnd - timeStart) + "毫秒. 处理模式:DOM处理");
})(window, window.self, unsafeWindow);
(function() {
    'use strict';
    //consts...
    let CODE_RULE_COMMON = /^([a-z\d]{4})$/i;
    let MAX_SEARCH_CODE_RANGE = 5;
    //functions...
    let textNodesUnder = function(el) {
        let n, a = [],
            walk = document.createTreeWalker(el, NodeFilter.SHOW_TEXT, null, false);
        while ((n = walk.nextNode())) {
            if (n.nodeName === '#text')
                a.push(n);
        }
        return a;
    };
    let generalLinkifyText = function(source, eles, index, testReg, validateRule) {
        let count = 0,
            text = source,
            match;
        while ((match = testReg.exec(source))) {
            count++;

            let url = (match[1] || "http://") + match[2];
            let originalText = (match[1] || "") + match[2];
            let code = match[3] || findCodeFromElements(eles, index, validateRule) || "";
            if (!code)
                continue;
            console.log("[网盘提取工具] 已处理网盘地址,URL=" + url + ",提取码=" + code + "模式:TEXTNODE");
            //fix double #
            url = url.split('#')[0];
            text = text.replace(originalText, "<a href='" + url + "#" + code + "' target='_blank'>" + url + '</a>');
        }
        return {
            count,
            text
        };
    };
    let linkifyTextBlockBaidu = function(...args) {
        return generalLinkifyText(...[
            ...args,
            /(https?:\/\/)?((?:pan|e?yun)\.baidu\.com\/s\/(?:[a-z\d\-_]+)(?:#[a-z\d-_]*)?)(?:.*?码.*?([a-z\d]+))?/gi,
            CODE_RULE_COMMON
        ]);
    };
    let linkifyTextBlockLanZou = function(...args) {
        return generalLinkifyText(...[
            ...args,
            /(https?:\/\/)?((?:pan|d|www)\.lanzou[sx]?\.com\/(?:[a-z\d]+))(?:.*?码.*?([a-z\d]+))?/gi,
            CODE_RULE_COMMON
        ]);
    };
    let linkifyTextBlock189cn = function(...args) {
        return generalLinkifyText(...[
            ...args,
            /(https?:\/\/)?(cloud\.189?\.cn\/t\/(?:[a-z\d]+))(?:.*?码.*?([a-z\d]+))?/gi,
            CODE_RULE_COMMON
        ]);
    }
    let findCodeFromElements = function(eles, index, rule) {
        for (let i = 0; i < MAX_SEARCH_CODE_RANGE && i < eles.length; i++) {
            let txt = eles[i + index].textContent;
            let codeReg = /码.*?([a-z\d]+)/gi;
            let codeMatch = codeReg.exec(txt) && RegExp.$1;
            if (!codeMatch) continue;
            let linkTestReg = /(https?:|\.(net|cn|com|gov|cc|me))/gi;
            if (linkTestReg.exec(txt) && linkTestReg.lastIndex <= codeReg.lastIndex) {
                break;
            }
            if (rule.test(codeMatch)) return codeMatch;
        }
        return null;
    };
    let linkify = function() {
        let eles = textNodesUnder(document.body);
        let processor = [
            linkifyTextBlockBaidu,
            linkifyTextBlockLanZou,
            linkifyTextBlock189cn
        ];
        for (let i = 0; i < eles.length; i++) {
            let ele = eles[i];
            if (ele.parentNode.tagName == 'a' || !ele.textContent) continue;

            let txt = ele.textContent;
            let loopCount = 0;

            for (var action of processor) {
                let {
                    count,
                    text
                } = action(txt, eles, i + 1);
                loopCount += count;
                txt = text;
            }
            if (loopCount > 0) {
                var span = document.createElement("span");
                span.innerHTML = txt;
                ele.parentNode.replaceChild(span, ele);
            }
        }
    };
    let timeStart = new Date().getTime();
    linkify();
    let timeEnd = new Date().getTime();
    console.log("[网盘提取工具] 链接处理完成,耗时:" + (timeEnd - timeStart) + "毫秒. 处理模式:TEXTNODE处理");
})();