问题

今天整理清理百度账号的小号时,遇到一个问题:将百度小号的文件转存到主账号时,提示:超过转存限制数量,需要开通VIP会员继续。查了下说明,非会员限制为500个。

不过,之后又遇到问题:上传也限制了500个的数量(是的,我才发现,也不知道是啥时候变得这么坑爹了!)。这下,以后新上传的文件再也不用担心遇到转存超标问题了,因为你根本也上传不上去了!🐶

BTW,百度网盘的下载速度,决定了它冷备份的作用身份,所以,确实是应该采用压缩上传的方式。(就好像工业数据备份使用磁带一个道理,不需要支持随机访问数据)
PS,关于网盘的场景选择使用,可以详见这里详述:免费网盘如何选择,不再赘述。

项目源码类

推荐:直接使用客户端下载后,再重新上传网盘

这种具体多小文件、且多级目录没有规律的场景,不适合脚本处理,实际上转存的速度也很慢!(对,你没看错,百度网盘的转存时间随着文件增多而急剧上升,众多小文件的情况下,真不如下载上传快!

下载小文件还有个好处是:文件的实际下载速度会明显高于限速,根据文件大小而异,实际表现可能是限速的好多倍。其原因倒也不稀奇:因为限速是使用了标准时间内的下载量来决定,而小文件很快下完了,开始下载下一个存在一个结束和启动的冷处理间隔,这个冷处理间隔是没有速度的,所以,看上去的效果就是下载文件的过程中,速度会突破限速

标准场景:相机照片目录

该标准场景的特点是:文件居多,每个文件还巨大,文件命名有规律

使用如下脚本自动选择后再手动点击转存,使用方法见脚本内注释:

// ===== 百度网盘文件批量选择工具 =====
// 在Chrome控制台执行此代码,将自动选中指定范围的文件
// 使用方法:
// 0. 准备工作:将函数默认值改为自己所需要的形式(也是初次执行的参数)
// 1. 打开百度网盘页面,下滑到底,显示所有条目!!!(注意,页面是懒加载技术,不下滑到底,后面的元素不可见也不可脚本选中!!)
// 2. 按F12打开开发者工具
// 3. 切换到Console标签页
// 4. 粘贴此代码并按Enter执行,会立刻执行一次默认参数的处理!!
// 5. 之后可以多次调用 selectFilesByRange() 函数并传入不同参数
//
//
// 注意事项:
// 1. 百度网盘非VIP会员限制每次转存500个文件,从1000-1500是501个,记得头或尾去掉一个。
// 2. 该函数会自动取消勾选非范围内的条目,所以,连续执行该函数输入自己需要勾选条目范围即可,它会自动取消上次勾选的项。
// 3. 循环对每个条目模拟点击来选择,不是瞬间完成,数量越多越慢。提示“开始处理文件: xxxx”时,耐心等待即可,一般是秒级完成。
// 4. 处理完毕后会打印:{added: xxx, removed: yyy}(往上翻也有中文提示),核对勾选和取消勾选数量是否正确。


function selectFilesByRange(startNum = 1000, endNum = 1499, prefix = "照片 ", suffix = ".jpg") {
    // 验证输入
    if (typeof prefix !== 'string' || typeof suffix !== 'string') {
        console.error("错误:prefix 和 suffix 必须是字符串");
        return { added: 0, removed: 0 };
    }
    
    if (isNaN(startNum) || isNaN(endNum)) {
        console.error("错误:startNum 和 endNum 必须是数字");
        return { added: 0, removed: 0 };
    }
    
    if (startNum > endNum) {
        console.error("错误:起始编号不能大于结束编号");
        return { added: 0, removed: 0 };
    }
    
    console.log(`开始处理文件: ${prefix}[${startNum}-${endNum}]${suffix}`);
    
    const fileItems = document.querySelectorAll('dd.AuPKyz');
    let addedCount = 0;   // 新选中的文件数
    let removedCount = 0; // 取消选中的文件数
    
    // 创建正则表达式
    const regex = new RegExp(`^${prefix}(\\d+)${suffix}$`);
    
    fileItems.forEach(item => {
        const fileNameElement = item.querySelector('.filename');
        if (!fileNameElement) return;
        
        const fileName = fileNameElement.title || fileNameElement.textContent;
        const match = fileName.match(regex);
        const isSelected = item.classList.contains('JS-item-active');
        const checkbox = item.querySelector('span.EOGexf');
        
        if (!checkbox) return;
        
        // 触发点击事件的函数
        const clickCheckbox = () => {
            const event = new MouseEvent('click', {
                view: window,
                bubbles: true,
                cancelable: true
            });
            checkbox.dispatchEvent(event);
        };

        if (match) {
            const fileNumber = parseInt(match[1], 10);
            if (!isNaN(fileNumber) && fileNumber >= startNum && fileNumber <= endNum) {
                // 符合范围且未选中的文件,将其选中
                if (!isSelected) {
                    clickCheckbox();
                    addedCount++;
                }
            } else if (isSelected) {
                // 符合命名但不在范围内的文件,取消选中
                clickCheckbox();
                removedCount++;
            }
        } else if (isSelected) {
            // 不符合命名的文件,但当前已选中的,取消选中
            clickCheckbox();
            removedCount++;
        }
    });
    
    console.log(`操作完成:\n - 新选中: ${addedCount} 个文件\n - 取消选中: ${removedCount} 个文件`);
    console.log(`匹配范围: "${prefix}[${startNum}-${endNum}]${suffix}"`);
    return { added: addedCount, removed: removedCount };
}

// 粘贴后立即执行一次当前默认参数的处理
selectFilesByRange();

// 示例调用
// selectFilesByRange(1000, 1499);
// selectFilesByRange(500, 799, "图片", ".png");

其他场景和懒人模式

使用如下脚本按照数量进行依次处理,其间不要改变排序顺序:

// ===== 百度网盘文件批量选择工具 =====
// 在Chrome控制台执行此代码,将自动选中指定范围的文件
// 使用方法:
// 0. 准备工作:将函数默认值改为自己所需要的形式(也是初次执行的参数)
// 1. 打开百度网盘页面,下滑到底,显示所有条目!!!(注意,页面是懒加载技术,不下滑到底,后面的元素不可见也不可脚本选中!!)
// 2. 按F12打开开发者工具
// 3. 切换到Console标签页
// 4. 粘贴此代码并按Enter执行,会立刻执行一次默认参数的处理!!
// 5. 之后可以多次调用 selectBatch() 函数并传入接下来的批次
//
// 参数说明:
//   batchIndex - 批次号(从1开始)
//   batchSize - 每个批次处理的文件数(默认500)
//
// 注意事项:
// 1. 百度网盘非VIP会员限制每次转存500个文件,默认不需要改动batchSize参数。
// 2. 该函数会自动取消勾选非范围内的条目,所以,连续执行该函数输入自己需要勾选条目范围即可,它会自动取消上次勾选的项。
// 3. 循环对每个条目模拟点击来选择,不是瞬间完成,数量越多越慢。提示“开始处理第x批文件”时,耐心等待即可,一般是秒级完成。
// 4. 处理完毕后会打印【后续处理建议】,根据提示继续输入命令执行即可。


function selectBatch(batchIndex = 1, batchSize = 500) {
    // 验证输入
    if (isNaN(batchIndex) || isNaN(batchSize)) {
        console.error("错误:batchIndex 和 batchSize 必须是数字");
        return { added: 0, removed: 0 };
    }
    
    if (batchIndex < 1) {
        console.error("错误:批次号必须从1开始");
        return { added: 0, removed: 0 };
    }
    
    if (batchSize < 1) {
        console.error("错误:每批数量必须至少为1");
        return { added: 0, removed: 0 };
    }
    
    const startIndex = (batchIndex - 1) * batchSize;
    const endIndex = startIndex + batchSize - 1;
    
    console.log(`开始处理第${batchIndex}批文件 (序号${startIndex + 1}-${endIndex + 1}, 共${batchSize}个)`);
    
    const fileItems = document.querySelectorAll('dd.AuPKyz');
    const totalItems = fileItems.length;
    let addedCount = 0;   // 新选中的文件数
    let removedCount = 0; // 取消选中的文件数
    
    fileItems.forEach((item, index) => {
        const isSelected = item.classList.contains('JS-item-active');
        const checkbox = item.querySelector('span.EOGexf');
        
        if (!checkbox) return;
        
        // 触发点击事件的函数
        const clickCheckbox = () => {
            const event = new MouseEvent('click', {
                view: window,
                bubbles: true,
                cancelable: true
            });
            checkbox.dispatchEvent(event);
        };
        
        if (index >= startIndex && index <= endIndex) {
            // 当前批次范围且未选中的文件,将其选中
            if (!isSelected) {
                clickCheckbox();
                addedCount++;
            }
        } else if (isSelected) {
            // 不在当前批次范围但已选中的文件,取消选中
            clickCheckbox();
            removedCount++;
        }
    });
    
    console.log(`操作完成:\n - 新选中: ${addedCount} 个文件\n - 取消选中: ${removedCount} 个文件`);
    console.log(`处理范围: 页面顺序中的第${startIndex + 1}${endIndex + 1}个文件`);
    
    // 提示下一批处理建议
    const nextStart = endIndex + 1;
    const nextEnd = nextStart + batchSize - 1;
    const hasNext = fileItems.length > nextStart;
    
    console.log(`\n总文件数: ${totalItems}(页面共加载${totalItems}个文件)`);
    
    if (hasNext) {
        console.log(`\n【后续处理建议】\n若需处理下一批(${batchIndex + 1}批),请执行:\nselectBatch(${batchIndex + 1})`);
    } else {
        console.log("\n已处理完所有文件");
    }
    
    return { added: addedCount, removed: removedCount };
}

// 粘贴后立即执行一次默认处理(第1批次)
selectBatch();

// 示例调用:
// selectBatch(2);    // 处理第2批(序号501-1000)
// selectBatch(3, 200); // 处理第3批,每批200个文件

其他说明

本地文件数量确认脚本(macOS / Linux)

查看当前文件夹的总文件数量(递归统计,不统计目录数量):

find . -type f 2>/dev/null | wc -l

查看当前文件夹中所有一级子目录各自的总文件数量(递归统计,不统计目录数量):

for dir in */; do count=$(find "$dir" -type f 2>/dev/null | wc -l); echo "$dir : $count 个文件"; done
分享因版权问题被自动取消

当备份自用软件时,尝试在各个账号之间通过分享、转存来转移文件时,极有可能会遇到分享被自动取消的问题,提示为因版权、色情、政治等违反了平台规则。

可以尝试直接2个账号添加好友,点击 “分享” 按钮,然后选择分享给好友,即可绕开该平台规则的限制。但是,仍然会有数量限制,会导致保存失败且无法选择部分保存。(不嫌麻烦,可以发送子目录后自行拼装,对于很多小文件的子目录还是下载+上传的效率优于转存的效率)

脚本存疑

在编写脚本时,发现百度网盘的分享页的样式命名很奇怪,没什么含义,例如:'dd.AuPKyz'span.EOGexf,怀疑它们是临时随机生成的。专门去测试了一下不同账号的分享,发现结果却都是一致的,并没有随机改变。不过,测试结果仅限我有限的几个账号,测试均可用。

如果要是遇到问题,留言下你的分享链接,我可以看下情况并适当调整下脚本内容。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐