通用技术 非会员批量清理百度网盘重复文件方法

81—1 · 2018年04月04日 · 最后由 zhuangyu2018 回复于 2018年11月22日 · 12515 次阅读

由于网速不稳定,在某天添加一个很大的分享时多点了几次,导致重复添加一百多个不同文件夹路径的文件。今天打开时提示我可以一键清理,本觉得百度还是挺人性化,虽然没做重复添加的校验,还是给了我清理办法。燃鹅,当我点击删除时,弹出了"不充钱,玩不了 “的温馨提示,真是社会我百度。
气愤之余,打了个座,于是有了下面破解之法。

环境:

1.火狐浏览器 charles 抓包已配置好

步骤

1. 打开 web 百度网盘点击更多》垃圾清理》扫描重复文件(注意:这个功能有使用次数限制)



2.获取扫描完成页面的接口数据

页面如下:
(因为我的重复数据已经清理掉了,这里随便复制了个做示例)

接口是这个:

https://pan.baidu.com/api/garbagelist

保存数据到文件 baidu.json,如下:

#baidu.json
{
  "errno": 0,
  "info": {
    "group_crashed": false,
    "next_index": 2,
    "count": 2,
    "has_more": false
  },
  "list": [
    {
      "fs_id": 0,
      "data": [
        {
          "size": "36218244",
          "category": "6",
          "fs_id": "413693152779790",
          "path": "\/BugReport(1).zip",
          "isdir": 0,
          "s3_handle": "a50c2bf7017fb91bc5044e881e8a87d1",
          "isdelete": 0,
          "server_filename": "BugReport(1).zip",
          "server_mtime": "1519452813",
          "smart_choose": 1,
          "index": 0
        },
        ......
  ],
  "request_id": 2151336299004000452
}

ps:当我满心赞扬的点击这个删除键时,百度就是我下面的回应。

3.进入正题处理数据,获取需要删除的文件路径

我们需要上面从保存的 json 数据中,剔除掉一个作为保留,并把重复的路径放到新的数组中,这里我直接是打印出来的。

# -*-coding:utf-8-*-
import json

def get_need_delete_paths():
    with open('baidu.json', 'r') as f:
        data = json.loads(f.read())
    a = 1
    lists = data["list"]
    need_delete_paths = []
    for list in lists:
        list_data = list["data"]
        for i in range(1, len(list_data)):
            need_delete_paths.append(list_data[i]["path"])

    for path in need_delete_paths:
        if a == 1:
            print "\n ======================= \n ["
        if a - 40 == 0:
            a = 1
            print "]\n ======================= \n ["
        a = a + 1
        print '"'+path+'",'
    print "]\n ======================= \n"

get_need_delete_paths()

我的打印内容如下:(注意,因为后面的删除接口字段不能太长,所以我这边是每 40 条做了个分隔。)

4.获取删除文件接口

因为百度有登陆状态的校验,这里我们可以先随意找个没用的文件删除,再直接从 charles 里克隆这条接口。

#删除文件接口
https://pan.baidu.com/api/filemanager

4.1 获取删除文件接口

4.2 克隆接口,并把需要删除的文件路径贴到字段里,(注意是个数组格式)。

结果

这是我的删除记录,几百条重复数据,几下就清理干净了。

备注

有钱的、重复数据量少的请忽略。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 3 条回复 时间 点赞

妥妥的前后端校验没有严格一致的安全性 BUG😂

个人使用 charles 未成功捕获到删除请求。
后来换一种方式,通过 firefox 调试,修改请求连接。编辑和重发,最主要的是修改参数。
baidu_fk.py 中的输出结果。每一个数组中,将最后一个逗号 (,) 删除。然后 filelist:[...] 通过http://tool.oschina.net/encode?type=4 URL 编码,生成数据 result。再将 result 中开始的 filelist 后的冒号(:)改成等于 (=)。所有的逗号(,)替换成%2C 以及所有的斜杆(/)替换为%2F 。替换参数结束,发送请求,删除成功。
注意编码转换前的时候方括号中要紧跟数据
e.g.[驱蚊器,
fsdf]

而不是 [
驱蚊器,
fsdf
]。

我是用火狐的编辑和重发了 filemanager 接口;garbagelist 接口每次默认扫描出 150 个,在请求最后有参数 start=0&limit=150 可以改,Java 写的处理 gson
String str = FileUtil.readTxt(filePath);//garbagelist.gson 文件
JsonObject obj = GsonUtil.formatObj(str);
JsonArray arr = obj.getAsJsonArray("list"); //取重复数据
List rs = new ArrayList();
for(JsonElement element : arr){
JsonArray data = element.getAsJsonObject().getAsJsonArray("data");//每个 data
//默认删除第一条,即网盘中最后会保留一个文件
data.remove(0);
String jp = "";
for(int i=0;i<data.size();i++){
jp = data.get(i).getAsJsonObject().getAsJsonPrimitive("path").getAsString();
if(i==0){
jp =jp;
}else{
jp=","+jp;
}
}
rs.add(jp);
}
String strUrl ="filelist="+URLEncoderUtil.getURLEncoderString(new Gson().toJson(rs).toString());//URL 编码
System.out.println("Content-Length:"+strUrl.length());//请求头中要修改参数长度
FileUtil.bufferedWriterFile(strUrl,"d:\baidu-new.txt");

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册