从零实现“百度网盘批量重命名”工具

简介: 工具的发明能够节省体力,同时也可以减少重复劳动,软件也是工具的一种。今天要说的是,引用 IT 技术,减少大量文件重命名这种重复的劳动。

image.png

该图片由Roshan Bhatia在Pixabay上发布


你好,我是看山。


本文收录在Java 进阶系列中。


工具的发明能够节省体力,同时也可以减少重复劳动,软件也是工具的一种。今天要说的是,引用 IT 技术,减少大量文件重命名这种重复的劳动。


一直在用的存储云盘是百度网盘,里面收集了大量文件。各种资料、电子书,使用空间达到了 2500G。之前还清理过一些低质的书籍,结果使用工具导出发现,在待整理目录中,居然有 1942 条电子书的记录。所以想要整理一番,这么多的文件,一个一个点实在难用。


提出需求

书归正传,这么多的文件,命名格式千奇百怪,因为有一些资料是从别人的分享中保存的,有的还会带网址的,可见网站运营也是无所不用其极了。从网上找到一些批量改名的工具,大多是 Windows 版本的,而且是加前缀或者后缀之类的,不太适用。


我想要的是,自己指定文件名,然后批量执行。就相当于有一双手,帮我在百度网盘中执行官方提供的重命名。之所以不用官方的重命名,是因为太难用,而且浪费时间(后面会具体说一下百度网盘的这个设计,也是可以借鉴的)。


想要实现自己的想法,需要有两步:


以 Excel 格式导出所有文件名

在导出的 Excel 文件中,定义目标名称,不需要改名的可以不用修改

导入整理后的文件,检查是否重命名成功

设计方案

根据需求,我们来设计方案。


找到关键接口

首先,我们需要能够导出所有的文件名。


百度网盘提供了网页版、客户端版,为了省时省事,我们使用网页版检查逻辑。打开控制台,发现进入目录时会有一个/api/list的请求,如下图:

image.png



根据响应内容,我们可以看出来,这个接口可以获取指定目录的文件列表。这个请求是 Get 请求,包含了好几个参数,还不太请求参数的作用,先放过。


通常来说,简单的网络请求是通过 Cookie 鉴权,所以我们就无脑使用 Cookie 了。


接下来需要找到重命名的请求,同样的,执行百度网盘提供的重命名即可,新增了哪些请求。如下图:

image.png



可以看到,这里的重命名分为了两步:


提交重命名任务,返回任务 id

使用任务 id 查询任务执行情况

这就是前面说的可借鉴的地方。对于百度网盘这种应用,虽然下载限速被各种诟病,还有阿里云盘的强势追击,但是不得不说,百度网盘还是现在用的比较多的云存储工具。必须有针对性的优化,将某些二级功能异步任务化,比如重命名。


先通过一个请求创建重命名任务,任务创建成功返回任务 ID。这个时候,百度网盘后端服务监听新任务,如果后端压力大,任务可以缓慢执行或不执行;

既然是异步任务化,客户端(包括网页或客户端)需要检查任务执行情况。任务执行情况根据约定可以有进行中或者完成,还可以有拒绝、失败、过期等其他情况。

导出导入文件

我们可以借助阿里开源的 EasyExcel 导出 Excel 文件(具体操作,可以查看 写文件、写的好看、填充文件 三篇)。


这个时候需要定义导出文件的内容,根据重命名的请求我们可以知道,我们需要文件路径、文件的新名字,为了操作简单,我们可以直接把原名也导出来。为了检查网盘文件是否有重复的,最好把文件的摘要码也导出来。


至此,我们的需求和方案都设计好了,下面就开始编码。


开始编码

开始编码前,我们需要定义一下鉴权参数:cookie、bdstoken,再定义一个扩展参数 path,我们只导出指定目录的文件列表。


定义基础类

根据设计方案中的定义,我们先创建导出文件的基础类:


@Data
public class FileName {
    @ExcelProperty("路径")
    private String path;
    @ExcelProperty("MD5")
    private String md5;
    @ExcelProperty("原名称")
    private String originName;
    @ExcelProperty("新名称")
    private String newName;
}

因为涉及到网络请求,我们需要定义请求参数。请求有一些共同参数:

@Data
public abstract class BaseRequest {
    protected String channel = "chunlei";
    protected String web = "1";
    protected String appId = "250528";
    protected String bdstoken = "";
    protected String logid = "";
    protected String clienttype = "0";
}

文件列表参数为:

@EqualsAndHashCode(callSuper = true)
@Data
public class FileListRequest extends BaseRequest {
    private String order = "name";
    private String desc = "0";
    private String showempty = "0";
    private int page = 1;
    private int num = 100;
    private String dir = "/";
    private String t = "";
}

重命名参数为:


@EqualsAndHashCode(callSuper = true)
@Data
public class FileRenameRequest extends BaseRequest {
    private String opera = "rename";
    private String async = "2";
    private String onnest = "fail";
}

我们还需要一个查询任务状态的参数:


@EqualsAndHashCode(callSuper = true)
@Data
public class TaskStatusRequest extends BaseRequest {
    private Long taskid;
}

定义请求类

前面有了基础类和请求类,接下来我们定义请求接口,这些类就是模板化的方法了,我们简单看一下。如果想要获取源码,关注公号「看山的小屋」回复“java”获取源码。


先定义文件列表请求方法:


private List<FileListItem> listFileCurrentPath(FileListRequest fileListRequest) {
    final String body = HttpRequest.get("https://pan.baidu.com/api/list")
            .form(fileListRequest.paramMap())
            .header(this.headers)
            .cookie(this.cookie)
            .execute()
            .body();
    final FileListResponse response = JSONUtil.toBean(body, FileListResponse.class);
    if (response.getErrno() == 0) {
        return response.getList();
    }
    return Collections.emptyList();
}

在定义文件重命名请求方法:


private Long rename(FileRenameRequest fileRenameRequest, String params) {
    final String queryParam = HttpUtil.toParams(fileRenameRequest.paramMap());
    final HttpRequest httpRequest = HttpRequest.post("https://pan.baidu.com/api/filemanager?" + queryParam)
            .header(this.headers)
            .cookie(this.cookie)
            .body(params);
    final String body = httpRequest.execute().body();
    final FileRenameResponse response = JSONUtil.toBean(body, FileRenameResponse.class);
    if (response.getErrno() == 0) {
        return response.getTaskid();
    }
    return -1L;
}

最后定义检查任务状态请求方法:


private TaskStatusResponse queryTaskStatus(TaskStatusRequest taskStatusRequest, String params) {
    TaskStatusResponse response;
    final String queryParam = HttpUtil.toParams(taskStatusRequest.paramMap());
    do {
        final String body = HttpRequest.post("https://pan.baidu.com/share/taskquery?" + queryParam)
                .header(this.headers)
                .cookie(this.cookie)
                .body(params)
                .execute()
                .body();
        response = JSONUtil.toBean(body, TaskStatusResponse.class);
    } while (response.getErrno() != 0 || StringUtils.equalsAny(response.getStatus(), "running", "pending"));
    return response;
}

体验升级

全部类定义完成后,我们可以直接在 IDE 中运行。但是,既然是工具,每次使用还得打开 IDE,是不是有些 low 了。为了升级体验,我们可以打成 jar 包,使用的时候直接运行 jar 包就行了。可以借助 maven 插件maven-assembly-plugin实现,这个插件能够把我们的源码和三方库都打在一个 jar 包中,这样就是一个 FatJar 走天下了。


<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.3</version>
    <configuration>
        <appendAssemblyId>false</appendAssemblyId>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <manifest>
                <addClasspath>true</addClasspath>
                <classpathPrefix>lib/</classpathPrefix>
                <mainClass>cn.howardliu.effectjava.rename.TaskRunner</mainClass>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>assembly</goal>
            </goals>
        </execution>
    </executions>
</plugin>

干完,手工。


文末总结

本文从零开始实现制作一个网络小工具,实现百度网盘文件的批量重命名。这个工具是这类工具的一个代表,只要是网络应用,存在 http 请求,我们都可以通过这类方式实现网络小工具。

目录
相关文章
|
6月前
|
存储 Cloud Native Docker
百度搜索:蓝易云【云原生之使用Docker部署Notepad个人任务管理工具】
这样,你就成功地使用Docker部署了Notepad个人任务管理工具。通过Docker部署Notepad可以使应用的安装和配置更加便捷,并且可以隔离应用环境,避免影响到宿主机的系统。希望以上教程对你有所帮助!如果你有其他问题,请随时继续提问。
94 0
|
6月前
|
Devops 网络安全 Docker
百度搜索:蓝易云【DevOps系列文章之Docker部署web ssh工具sshwifty教程。】
同时,了解DevOps和Docker的基本原理和概念也对你进行部署和管理这样的工具非常有帮助。你可以进一步研究Docker容器化技术和相关的DevOps实践,以更好地理解和应用这些概念。
98 0
|
Java
百度搜索:蓝易云【hutool Http 工具发送POST请求的几种方式。】
以上是使用Hutool发送POST请求的几种方式。根据实际需求和代码复杂度,选择合适的方式来发送POST请求。
308 0
|
NoSQL 关系型数据库 MySQL
百度搜索:蓝易云 ,【Linux工具】-yum/gdb使用教程!
这些是yum和gdb的基本使用教程。希望对您有所帮助!请注意,这只是一个简要概述,这些工具具有更多功能和选项,您可以查阅相关的文档和资料以获取更详细的信息和指导。
76 0
|
缓存 NoSQL Linux
百度搜索:蓝易云【【Linux工具】yum和gdb详细使用教程。】
以上是 yum 和 gdb 的简单使用教程。使用这些工具可以方便地进行软件包管理和程序调试。如需了解更多命令和功能,请参考它们的官方文档或使用相应的帮助命令。
609 0
|
Linux
百度搜索:蓝易云【如何在Linux系统安装文件同步工具:FreeFileSync?】
请注意,具体安装步骤可能会因不同的Linux发行版而有所差异。如果遇到任何问题,建议查阅FreeFileSync的官方文档或论坛,其中可能会提供更详细的安装说明和支持信息。
126 3
|
6月前
|
监控 Ubuntu
百度搜索:蓝易云【如何使用各种工具和命令来检查Ubuntu中的CPU使用情况?】
这些工具和命令可以帮助你实时监控和检查Ubuntu系统中的CPU使用情况。你可以根据需要选择合适的工具来查看CPU使用情况,并根据情况采取相应的措施来优化系统性能。
92 1
|
6月前
|
测试技术 Linux
百度搜索:蓝易云【【Linux】硬件性能测试工具安装。】
以上是一些常见的硬件性能测试工具,你可以根据需要选择适合的工具进行安装和使用。注意,在安装和运行这些工具时,请遵循官方文档和指南,并在测试过程中小心操作,以避免对系统造成不良影响。
114 1
|
6月前
|
传感器 监控 自动驾驶
百度Apollo :自动驾驶全新工具Dreamview+,便捷灵活更丰富
百度Apollo :自动驾驶全新工具Dreamview+,便捷灵活更丰富
125 0
|
6月前
|
Linux
百度搜索:蓝易云【Linux系统下获取系统、BIOS、进程、网络等相关信息的方法和工具。】
综上所述,通过使用命令行工具和图形化工具,可以在Linux系统下获取系统、BIOS、进程和网络等相关信息。根据具体的需求和使用场景,选择合适的工具和命令可以帮助你更好地了解和管理Linux系统。
100 2

热门文章

最新文章