该图片由Roshan Bhatia在Pixabay上发布

你好,我是看山。

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

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

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

提出需求

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

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

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

  1. 以 Excel 格式导出所有文件名
  2. 在导出的 Excel 文件中,定义目标名称,不需要改名的可以不用修改
  3. 导入整理后的文件,检查是否重命名成功

设计方案

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

找到关键接口

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

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

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

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

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

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

  1. 提交重命名任务,返回任务 id
  2. 使用任务 id 查询任务执行情况

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

  1. 先通过一个请求创建重命名任务,任务创建成功返回任务 ID。这个时候,百度网盘后端服务监听新任务,如果后端压力大,任务可以缓慢执行或不执行;
  2. 既然是异步任务化,客户端(包括网页或客户端)需要检查任务执行情况。任务执行情况根据约定可以有进行中或者完成,还可以有拒绝、失败、过期等其他情况。

导出导入文件

我们可以借助阿里开源的 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 请求,我们都可以通过这类方式实现网络小工具。

如果想要获取源码,关注公号「看山的小屋」回复“java”获取源码。


你好,我是看山。游于码界,戏享人生。如果文章对您有帮助,请点赞、收藏、关注。我还整理了一些精品学习资料,关注公众号「看山的小屋」,回复“资料”即可获得。

个人主页:https://www.howardliu.cn
个人博文:看山聊 Java:从零实现“百度网盘批量重命名”工具
CSDN 主页:https://kanshan.blog.csdn.net/
CSDN 博文:看山聊 Java:从零实现“百度网盘批量重命名”工具

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

  1. 百度网盘批量重命名工具怎么用,百度网盘怎么批量修改文件名

    这里写百度网盘批量重命名工具怎么用,百度网盘怎么批量修改文件名自定义目录标题 很多时候,我们百度网盘里的文件需要重命名,方便我们整理文件.如果一个一个修改,很费时费力,那么,有没有百度网盘批量重命名工 ...

  2. 百度网盘批量重命名文件免费脚本---2020.07

    文章目录 背景 使用工具 使用方法 使用限制 其他替代产品(收费) 1.邓西软件 2.百度网盘批量处理大师 一.批量重命名 二.批量分享 三.批量转存 四.批量离线 五.批量同步 六.批量永存 七.其 ...

  3. BPFT1.7,全名BaiduPanFilesTransfers免费的百度网盘批量转存工具【精】

    BaiduPanFilesTransfers 介绍使用 免费的百度网盘批量转存工具,基于Python 3.8+Tkinter 详细介绍使用请访问:小众软件 缺点及推荐 目前缺点是不能传大数量的链接!目 ...

  4. 百度网盘批量改名字工具

    百度网盘批量改名字工具,不用再一个一个改了 链接:https://pan.baidu.com/s/1LRWxi4qVK9dmz-4StCiwBQ  提取码:0ers

  5. 邓西百度网盘批量转存检测工具 v1.0.0818

    简介: 邓西百度网盘批量转存检测工具可以帮助用户对百度网盘分享链接进行自动批量保存,并检测分享链接的有效性,您可以将以TXT格式及电子表格方式直接导入链接,根据需求选择是保存还是检测链接,具体的使用方 ...

  6. ​百度网盘批量转存分享增量更新软件工具助手

    1.简要介绍 : 百度网盘资源自动更新工具是一款百度网盘资源自动更新转存工具,可以将对方分享的资源转存到自己的网盘中,不受一次只能转存500个文件的限制. 2.详细介绍: 百度网盘批量转存软件是一款对 ...

  7. 邓西百度网盘批量分享工具

    简介: 邓西百度网盘批量分享工具可以用来分享百度网盘上的资源文件,通过这款软件用户可以更加轻松方便地将自己网盘中的资源分享给其他用户,支持批量分享的操作,非常适合需要分享很多文件的用户,如果一个个分享 ...

  8. C#百度网盘批量转存助手工具_绿色安全版 百度云盘一键转存小黄人软件原创20161204已测可用

    有谁合伙或投资我吗? 已实现抓取百度网盘所有用户有效分享链接和对应文件名.24小时自动爬虫抓取.下一步,做百度网盘资源搜索网站. 还实现了一些辅助功能:批量逐个分享,得到文件名和对应链接列表. 批量转 ...

  9. 最新的百度网盘不限速下载工具 - 100兆速度理论10m/s

    Yama之前安利过很多百度云盘下载不限速工具,随着时间推移,百度对这些账户还是限速,毕竟白嫖VIP的特权,可是会有封号.拉黑的风险(滑稽) 最新的百度网盘不限速下载工具,至于能用多久就随缘吧,最好用小 ...

  10. 使用Matlab制作的视频媒体批量重命名工具

    视频媒体批量重命名工具 1.Abstract   编程语言:Matlab.python   思路:利用python获取视频创建时间,通过Matlab实现对视频关键帧的读取与显示,以及对于用户打标信息与 ...

最新文章

  1. iOS架构设计-URL缓存(上)
  2. CSS-用伪元素制作小箭头(轮播图的左右切换btn)
  3. python绘图实例-Python中turtle绘图学习笔记和实例
  4. 控制台上的内容不输入到nohup.out
  5. how to add the language things at the idiscover
  6. jzoj4272-序章-弗兰德的秘密【树形dp】
  7. BZOJ4881 线段游戏(二分图+树状数组/动态规划+线段树)
  8. tomcat是什么_为什么开发者放弃了Tomcat,选择了Undertow?
  9. 嘻哈电音综合插件-Digikitz Linked Linked Vibes Workstation WiN-MAC
  10. SVN合并分支到主干(简单易懂)
  11. php led显示屏控制软件下载,中航led控制软件
  12. Android 3D画廊
  13. 鸿蒙之始有几个老婆,先天五太
  14. 新鲜的字节跳动实习面经(Android开发岗),字节跳动面试分享
  15. 临床医学计算机思维的应用情况,【临床医学论文】临床医学教育中循证医学思维的应用(共6584字)...
  16. 七周成为数据分析师 | 数据库
  17. 用无线网卡做wifi热点共享网络的方法
  18. python 管理 交换机_用python 脚本控制telnet登录交换机
  19. Cloud Foundry 峰会进入中国 全球专家与你面对面
  20. SQL语言(一)数据查询

热门文章

  1. Dissect ActiveX Control Safety
  2. 将win7笔记本电脑变身WiFi热点,让手机、笔记本共享上网
  3. 微信支付和分享到朋友圈-struts版本
  4. dfuse 为你提供定制网络服务
  5. qnx slm7.1(程序员开发手册-翻译)
  6. 查询给定区域内曲面平均高程
  7. 程序员必备算法——排列组合
  8. 不可多得的干货!双非渣本Android四年磨一剑,终局之战
  9. SpringBoot对接微信公众号,持续更新
  10. html 组合快捷键,ctrl常用组合键有哪些