Greasy Fork

Greasy Fork is available in English.

天翼云盘批量转存

只支持纯文件,转存的时候切换页面会导致列表加载不全

当前为 2024-05-30 提交的版本,查看 最新版本

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name         天翼云盘批量转存
// @namespace    蒋晓楠
// @version      20230818
// @description  只支持纯文件,转存的时候切换页面会导致列表加载不全
// @author       蒋晓楠
// @license MIT
// @match        https://cloud.189.cn/web/share?code=*
// @icon         https://www.google.com/s2/favicons?domain=189.cn
// @grant GM_addStyle
// @grant GM_addElement
// ==/UserScript==
//动作间隔,单位毫秒,根据自己的网速和电脑性能调节
let ActionInterval=1000;
//一次保存数量,普通用户最多1000,设太大容易卡住
let SaveNumber=100;
//保存文件夹名
let SaveDirectoryName="天翼云盘批量转存";
//加载数量倍率,当剩余文件数量小于保存数量乘这个倍率时才进行再次加载
let LoadNumberRate=1.5;
//以下变量不要修改
//文件列表,它自己的分页都有问题,出现重复文件,会导致保存失败
let NowFileList=[];
//加载是否完成
let LoadFinish=false;
function ScrollFileList() {
    let FileHolder=document.querySelector(".file-list-ul");
    let LastName="";
    //根据列表数量延长加载时间
    let Interval=setInterval(function () {
        if (document.querySelector(".file-list-load")===null){
            let NowLength=FileHolder.querySelectorAll("li").length;
            if (NowLength<SaveNumber*LoadNumberRate){
                console.log("当前加载完成,数量"+NowLength);
                let CheckLastName=FileHolder.querySelector(".selDiv").previousSibling.querySelector(".file-item-name-fileName-span").textContent.trim();
                if(CheckLastName===LastName){
                    console.log("全部加载完成");
                    LoadFinish=true;
                    clearInterval(Interval);
                }
                else{
                    LastName=CheckLastName;
                    FileHolder.scrollTo(0,FileHolder.scrollHeight);
                }
            }
            else{
                console.log("当前剩余文件数量过多");
            }
        }
        else {
            console.log("正在加载");
        }
    },ActionInterval);
}

function RemoveRepeatItem() {
    document.querySelectorAll(".file-list-ul>li").forEach(function (Item) {
        if (NowFileList.indexOf(Item.querySelector(".file-item-name-fileName-span").textContent.trim())>-1){
            Item.remove();
        }
    });
}

function SelectListFile() {
    let Items=document.querySelectorAll(".file-list-ul>li");
    for (let i = 0; i <Items.length; i++) {
        if (i<SaveNumber){
            let Name=Items[i].querySelector(".file-item-name-fileName-span").textContent.trim();
            NowFileList.push(Name);
            Items[i].querySelector(".file-item-check").click();
        }
        else
        {
            break;
        }
    }
    console.log("完成文件选择",NowFileList);
}

async function ClickNewSaveButton() {
    return new Promise(resolve => {
        let Interval=setInterval(function () {
            //点击转存
            let SaveButton = document.querySelector("[class^=FileListHead_file-list-li-head-select]").nextSibling.firstChild;
            if(SaveButton!==null){
                clearInterval(Interval);
                SaveButton.click();
                return resolve();
            }
        },0);
    });
}

async function SelectSaveDirectory() {
    return new Promise(resolve => {
        let Check=setInterval(function () {
            let AllDirectory=document.querySelectorAll("[class^=DirectoryTree_directory-li] [class^=DirectoryTree_c-directory-tree]>div");
            for (let i = 0; i < AllDirectory.length; i++) {
                let Name=AllDirectory[i].querySelector(".directory-name").textContent;
                if (Name===SaveDirectoryName){
                    clearInterval(Check)
                    AllDirectory[i].childNodes[0].childNodes[1].dispatchEvent(new MouseEvent("mousedown"));
                    break;
                }
            }
            return resolve();
        },ActionInterval);
    });
}

function ClickYesButton() {
    let YesButton=document.querySelector("[class^=Directory_directory-button-confirm]");
    YesButton.click();
}

async function SaveIsDone() {
    let LoadingBlock=document.querySelector("[class^=loading_c-loading]");
    return new Promise(resolve => {
        let Loading=setInterval(function () {
            if (LoadingBlock.style.display==="none"){
                clearInterval(Loading);
                return resolve();
            }
        },ActionInterval);
    });
}

function RemoveSelectItem() {
    let List=document.querySelectorAll(".file-list-ul .selected");
    for (let i = 0; i < List.length; i++) {
        List[i].querySelector("input").click();
        List[i].remove();
    }
}

async function StartSave() {
    console.log("开始保存");
    //删除重复项目
    RemoveRepeatItem();
    //选择列表文件
    SelectListFile();
    //点击转存
    await ClickNewSaveButton();
    //选择保存文件夹
    await SelectSaveDirectory()
    //点击确定
    ClickYesButton();
    //等待转存完成
    await SaveIsDone();
    //移除选择项
    RemoveSelectItem();
    console.log("当前保存完成");
    if (LoadFinish&&document.querySelectorAll(".file-list-ul>li").length===0){
        alert("全部保存完成");
    }
    else{
        StartSave();
    }
}

function InitHtml() {
    let Holder=document.querySelector(".file-operate");
    let SaveAllButton=GM_addElement(Holder,"button",{textContent:"全部保存",class:"JXNButton"});
    //绑定事件
    SaveAllButton.onclick=function () {
        //隐藏保存按钮
        SaveAllButton.style.display="none";
        ScrollFileList();
        StartSave();
    }
}

function InitCss() {
    GM_addStyle(`.JXNButton {
    position: absolute;
    left: 0;
    padding: 5px 10px;
    background-color: dodgerblue;
    color: white;
    border: none;
    cursor: pointer;
    border-radius: 5px;
}`);
}

async function WaitUI() {
    return new Promise(resolve => {
        let CheckHtml=setInterval(function () {
            if (document.querySelector(".file-list-ul")!==null){
                console.log("列表加载完成");
                clearInterval(CheckHtml);
                resolve();
            }
        },ActionInterval);
    });
}

function Run() {
    //等待界面加载完成
    WaitUI().then(()=>{
        InitCss();
        InitHtml();
    });
}
Run();