吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2591|回复: 33
上一主题 下一主题
收起左侧

[其他原创] [油猴脚本]蓝奏云获取链接

  [复制链接]
跳转到指定楼层
楼主
mr88fang 发表于 2024-6-20 09:54 回帖奖励
本帖最后由 mr88fang 于 2024-6-21 15:13 编辑

蓝奏云获取外部分享链接。内部:批量获取文件夹,文件分享链接;外部:自动提交携带密码的访问链接,批量获取下载链接,分享链接;

内部

  • 批量获取 文件夹 分享链接(携带密码)

  • 批量获取 文件 分享链接

  • 分享按钮

    • 当前选中的文件分享链接
  • 一键分享(不支持根目录)

    • 复制当前目录下所有文件分享链接

外部

  • 自动提交携带密码的访问链接

  • 批量获取 文件下载地址

    • 借鉴了 p8e2cn5eopn 帖子

    • 一开始打算全部 iframe 加载,但是蓝奏下载页面有如下代码,无法加载。所以改用 fetch 获取中间页 html,再 iframe 加载真实下载页面

    • if (window!=top) top.location.href = window.location.href;
  • 批量获取 文件 分享链接

  • 点击文件名直接下载

安装

  1. 安装 Tampermonkey 浏览器扩展,国内安装,黑色的猴子。
  2. 点击 脚本链接 或手动复制脚本代码。
  3. Tampermonkey 中创建一个新脚本,将代码粘贴到编辑器中并保存。

代码

// ==UserScript==
// @name           蓝奏获取外部链接
// @namespace     http://tampermonkey.net/
// @homepageURL  https://github.com/systemmin/kill-doc/blob/master/up.woozooo.com/index.js
// @version           1.0.1
// @description   内部:批量获取文件夹,文件分享链接;外部:自动提交携带密码的访问链接,批量获取下载链接,分享链接;
// @AuThor        MR.Fang
// @match         https://up.woozooo.com/*
// @match        https://*.lanzouj.com/*
// @Icon           https://www.google.com/s2/favicons?sz=64&domain=woozooo.com
// @grant        GM_addStyle
// @grant        GM_setClipboard
// @grant        unsafeWindow
// @run-at                  document-end
// @license      Apache-2.0
// ==/UserScript==

(function() {
        'use strict'
        GM_addStyle('.td-down{max-width:200px;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;} th{text-align: start;}')
        const {
                host,
                href,
                origin
        } = location;

        // 获取外链 URL
        const BASE_URL = 'https://up.woozooo.com/doupload.php';

        /**
         * @description 子 iframe 发送消息 
         * @param {String} message 
         * @param {String} type: real 真实下载页面
         */
        const childMessage = (message, type) => {
                if (!window.parent) return;
                window.parent.postMessage({
                        type: type,
                        value: message ? message : ''
                }, "*")
        }

        // 监听页面消息事件,父子共用
        window.addEventListener("message", (e) => {
                console.log(e)
                const {
                        data
                } = e;
                // 非单个文件下载时
                if (data.type === 'real' && document.getElementById('pwdload')) {
                        loadDataIframe(data.value)
                }
        })

        /**
         * 复制到剪切板
         * @param text
         */
        const copyToClipboard = (text) => {
                var input = document.createElement("textarea");
                input.value = text;
                document.body.appendChild(input);
                input.select();
                document.execCommand("copy");
                document.body.removeChild(input);
        }

        // 获取文件对象 {name,id,size}
        const listFiles = () => {
                return [...document.querySelector('#filelist').childNodes].map(item => {
                        return {
                                name: item.querySelector('.f_name_title').innerText,
                                size: item.querySelector('.f_size').innerText,
                                id: item.id.substring(1)
                        }
                });
        }
        // 获取文件夹对象 {name,id}
        const listFolders = () => {
                return [...document.querySelector('#sub_folder_list').childNodes].map(item => {
                        return {
                                name: item.querySelector('.follink').innerText,
                                id: item.id.substring(3)
                        }
                });
        }

        // 获取外部链接
        const external = async (body, type) => {
                const response = await fetch(BASE_URL, {
                        method: 'POST',
                        headers: {
                                'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
                        },
                        body: body
                })
                if (response.ok) {
                        const data = await response.json();
                        if (type === 1) {
                                const {
                                        pwd,
                                        new_url
                                } = data.info;
                                return new_url + '密码:' + pwd;
                        } else if (type === 2) {
                                const {
                                        f_id,
                                        is_newd
                                } = data.info;
                                return is_newd + '/' + f_id;
                        }
                }
                return undefined;
        }

        // 创建 table 盒子
        const createBox = (content) => {
                const template = `<table border="1px" style="border-color: azure;" width="100%" cellpadding="10px" cellspacing="0px">
                        <thead>
                                <tr>
                                        <th>文件名</th>
                                        <th>链接</th>
                                        <th>文件大小</th>
                                </tr>
                        </thead>
                        <tbody>
                                ${content}
                        </tbody>
                </table>`;
                const file_text = document.getElementById('file-text');
                if (file_text) {
                        file_text.innerHTML = template;
                } else {
                        const div = document.createElement('div')
                        div.innerHTML = template;
                        div.style.padding = "10px";
                        div.style.border = "1px solid #eee";
                        div.id = 'file-text'
                        document.getElementById('f_tp').after(div)
                }
        }

        // 开始
        async function start() {
                let htmlStr = '';
                // 文件夹
                const folders = listFolders();
                if (folders.length) {
                        for (let key of folders) {
                                const url = await external(`task=18&folder_id=${key.id}`, 1)
                                if (url)
                                        key['url'] = url
                        }
                        htmlStr += folders.map(item =>
                                `<tr><td>${item.name}</td><td>${item.url}</td><td>/</td></tr>`).join('\n')
                }
                // 文件
                const files = listFiles();
                if (files.length) {
                        for (let key of files) {
                                const url = await external(`task=22&file_id=${key.id}`, 2)
                                if (url)
                                        key['url'] = url
                        }
                        htmlStr += files.map(item =>
                                `<tr><td>${item.name}</td><td>${item.url}</td><td>${item.size}</td></tr>`).join('\n')
                }
                createBox(htmlStr);
        }

        const createButton = (content) => {
                const a = document.createElement('a')
                a.innerText = '批量链接';
                a.title = '一次性获取所有外部链接';
                a.href = "javascript:;";
                a.className = 'diskdao';
                a.onclick = function() {
                        start()
                }
                const mydisk_file_bar = document.querySelector('.mydisk_file_bar');
                if (mydisk_file_bar) {
                        mydisk_file_bar.append(a);
                }
        }

        // ===========================内部访问
        if (host === 'up.woozooo.com') {
                createButton();
        }

        // 创建文件下载页面 table
        const createTable = (content) => {
                const d2 = document.querySelector('.d2');
                const infos = document.querySelector('#infos');
                const template = `<table style="border-color: azure;" width="100%" cellpadding="10px" cellspacing="0px">
                        <thead>
                                <tr>
                                        <th>文件名</th>
                                        <th>下载链接</th>
                                        <th>分享链接</th>
                                        <th>大小</th>
                                        <th>时间</th>
                                </tr>
                        </thead>
                        <tbody>
                                ${content}
                        </tbody>
                </table>`;
                const file_text = document.getElementById('file-text');
                if (file_text) {
                        file_text.innerHTML = template;
                } else {
                        const div = document.createElement('div')
                        div.innerHTML = template;
                        div.style.padding = "10px";
                        div.style.border = "1px solid #eee";
                        div.id = 'file-text'
                        d2.before(div)
                }
                d2.style.display = 'none';
                infos.style.display = 'none';
        }

        // 获取下载列表数据
        const loadData = () => {
                return [...document.querySelectorAll('#infos>div div:first-child')].map(item => {
                        let a = item.querySelector('a');
                        let img = item.querySelector('img');
                        return {
                                name: a.innerText,
                                url: a.href,
                                img: img.src,
                                size: item.nextElementSibling.innerText,
                                time: item.nextElementSibling.nextElementSibling.innerText,
                                down: ''
                        }
                })
        }
        // 创建 iframe
        const createIframe = (src) => {
                let iframe = document.querySelector('iframe');
                if (!iframe) {
                        iframe = document.createElement('iframe')
                        iframe.style.visibility = "hidden";
                        document.body.append(iframe);
                        iframe.src = src;
                } else {
                        iframe.src = src;
                }
        }
        // 获取中间页面 HTML 内容
        const getMiddleHTML = async (url) => {
                try {
                        const response = await fetch(url);
                        const html = await response.text();
                        const parser = new DOMParser();
                        const doc = parser.parseFromString(html, 'text/html');
                        const iframe = doc.querySelector('iframe');
                        return iframe.src;
                } catch (e) {
                        console.log(e)
                }
        }

        // 加载真实下载页面
        const loadDataIframe = async (url) => {
                const start = Number(localStorage.start) || 0;
                const listData = JSON.parse(localStorage.listData) || [];
                if (url) {
                        listData[start].down = url;
                        localStorage.listData = JSON.stringify(listData);
                }
                let index = -1;
                for (let i = 0; i < listData.length; i++) {
                        const data = listData[i];
                        index = i;
                        if (!data.down) {
                                localStorage.start = i + '';
                                const targetURL = await getMiddleHTML(data.url);
                                createIframe(targetURL)
                                index = -1
                                break;
                        }
                }
                if (index === listData.length - 1) {
                        console.log('加载结束')
                        reRendering()
                }
        }

        // 数据保存到本地
        const saveLocalStorage = () => {
                const listData = loadData();
                localStorage.listData = JSON.stringify(listData);
                loadDataIframe()
        }
        // 重新渲染页面
        const reRendering = () => {
                const listData = JSON.parse(localStorage.listData) || [];

                const content = listData.map(item => {
                        return `<tr> <td> <img src="${item.img}" align="absmiddle" border="0"> <a href="${item.url}" target="_blank">${item.name}</a></td>
                        <td><div  class="td-down" title="${item.down}">${item.down}</div></td>
                        <td>${item.url}</td>
                        <td>${item.size}</td>
                        <td><time>${item.time}</time></td></tr>`;
                }).join('\n')
                createTable(content);

                // 获取下载地址列表
                const downs = listData.map(item => item.down).join('\n');
                // 获取外部链接
                const urls = listData.map(item => item.url).join('\n');

                // 处理按钮
                const save = document.getElementById('save')
                save.style.display = 'flex';
                save.style.justifyContent = 'space-around';

                let button = save.querySelector('a').cloneNode(true);
                button.href = 'javascript:;';
                button.target = "_self"
                button.onclick = function() {
                        GM_setClipboard(urls)
                        alert('拷贝成功');
                }
                let span = button.querySelector('span');
                span.innerText = '一键拷贝分享链接';
                span.style.color = "red";
                save.append(button);

                button = save.querySelector('a').cloneNode(true);
                button.href = 'javascript:;';
                button.target = "_self"
                button.onclick = function() {
                        GM_setClipboard(downs)
                        alert('拷贝成功');
                }
                span = button.querySelector('span');
                span.innerText = '一键拷贝下载链接';
                span.style.color = "green";
                save.append(button);

        }

        // 下载
        if (host.includes('lanzouj.com') && !href.includes('fn?')) {
                const iframe = document.querySelector('iframe');
                if (!iframe) {
                        // 携带密码访问
                        const href = decodeURI(location.href); // URL 解码
                        const last = href.lastIndexOf(':');
                        if (last != -1 && last != 5) { // 携带密码访问 404
                                localStorage.pwd = href.substring(last + 1);
                                const target = href.substring(0, href.lastIndexOf('密码'));
                                window.location.href = target
                        } else { // 输入密码页面
                                // 输入密码跳转下载页面
                                if (localStorage.pwd) {
                                        document.getElementById('pwd').value = localStorage.pwd;
                                        document.getElementById('sub').onclick();
                                }
                        }

                        // 监听
                        const sub = document.getElementById('sub')
                        if (sub) {
                                sub.addEventListener('click', (event) => {
                                        const pwd = document.getElementById('pwd').value
                                        if (pwd)
                                                localStorage.pwd = pwd;
                                })

                        }

                        // 监听、渲染
                        const targetElement = document.getElementById('pwdload');
                        const observer = new MutationObserver(function(mutations) {
                                mutations.forEach(function(mutation) {
                                        saveLocalStorage()
                                        observer.disconnect(); // 释放
                                });
                        });
                        observer.observe(targetElement, {
                                attributes: true
                        });
                } 
        }
        // 真实下载 iframe 页面
        if (href.includes('fn?')) {
                const targetElement = document.getElementById('tourl');
                const observer = new MutationObserver(function(mutations) {
                        mutations.forEach(function(mutation) {
                                const addedNodes = mutation.addedNodes;
                                if (addedNodes.length) {
                                        const aNode = addedNodes[0];
                                        if (aNode.nodeName === 'A') {
                                                childMessage(aNode.href, 'real')
                                                observer.disconnect(); // 释放
                                        }
                                }
                        });
                });
                observer.observe(targetElement, {
                        childList: true
                });
        }

})();

n_1.png (95.13 KB, 下载次数: 3)

首页

首页

n_2.png (92.45 KB, 下载次数: 2)

下载页面

下载页面

免费评分

参与人数 9吾爱币 +14 热心值 +8 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
0120 + 1 + 1 我很赞同!
Bob5230 + 1 + 1 热心回复!
此心已为你上锁 + 1 谢谢@Thanks!
52k + 1 + 1 我很赞同!
shelovesi + 1 谢谢@Thanks!
st0rm + 1 + 1 谢谢 @Thanks!
ilj + 1 + 1 用心讨论,共获提升!
FitContent + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
摇滚的鱼学破解 发表于 2024-6-20 15:04
本帖最后由 摇滚的鱼学破解 于 2024-6-20 15:07 编辑
mr88fang 发表于 2024-6-20 13:41
F5刷新试试,或者是不是和其他脚本有冲突,是不是黑色的猴子

反馈下,刚又试了下 用火狐浏览器可以  有批量链接 也有大批量的分享内容 但是没有那个分享按钮
。如果要点那个批量链接得把所有上传的东西加载出来再点那个批量链接,否则只能显示加载出来的内容,这个脚本挺好的 至少可以把里面内容的链接都拷贝出来,赞个!

image.png (52.86 KB, 下载次数: 1)

image.png
推荐
 楼主| mr88fang 发表于 2024-6-20 15:46 |楼主
摇滚的鱼学破解 发表于 2024-6-20 15:04
反馈下,刚又试了下 用火狐浏览器可以  有批量链接 也有大批量的分享内容 但是没有那个分享按钮
。如果 ...

这显示的表格是可以直接复制,我使用Typora软件,直接复制表格粘贴到Typora中有 md格式的。不知道你说的分享是想要个一键复制到剪切板吗?
沙发
feiyu361 发表于 2024-6-20 10:06
3#
jun269 发表于 2024-6-20 10:07
我还以为是一个客户端工具来着,结果是要安装浏览器插件
4#
 楼主| mr88fang 发表于 2024-6-20 10:10 |楼主
jun269 发表于 2024-6-20 10:07
我还以为是一个客户端工具来着,结果是要安装浏览器插件

哈哈哈哈,浏览器不是更方便嘛
5#
dr-pan 发表于 2024-6-20 10:17
,路过学习了
6#
xin1you1di1 发表于 2024-6-20 10:31
学习了 学习了
7#
张道陵 发表于 2024-6-20 10:45
谢谢分享
8#
HWSH4 发表于 2024-6-20 10:47
感谢大佬分享
9#
choujinjin 发表于 2024-6-20 10:51

感谢大佬分享
10#
otho 发表于 2024-6-20 10:52
反手直接拿下!感谢楼主
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 12:44

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表