baidu

百度网盘新版API

突然发现百度网盘又更新 API 了....明明 UI 一点都没有更新.我严重怀疑这个前端工程师是有多寂寞... 没事就更新 JS...这已经是我观察发现的第三次更新了...每次都导致我的 aria2c 导出脚本失效...

于是我又苦苦寻找新版的 JS 到底是怎么实现下载的,虽说可以直接操纵 DOM 获取选中的文件的 fs_id 信息 然后 POST 数据获取 dlink(下载地址),但是这样怎么也不够优雅啊...因为百度自己的 JS 肯定实现了这部分内容 于是我便花了更多的时间找 API,但是百度那既压缩又混淆的 JS 代码真是读起来特带劲啊(我绝对不是抖 M)

于是说一下百度的新版 API 吧:

# Toast 模块

新版 API 把每个功能全部模块化,声明某个模块的方法是使用 require 方法.

var SetMessage = function(msg, type) {
  var Toast = require('common:widget/toast/toast.js');
  Toast.obtain.useToast({
    toastMode: Toast.obtain[type],
    msg: msg,
    sticky: false
  });
};
1
2
3
4
5
6
7
8

于是我便封装了一个函数用来实现消息提示.

# data-center 模块

var File = require('common:widget/data-center/data-center.js');
return File.get('selectedList');
1
2

data-center 模块可以获取选择的文件的 fs_id,通过传入 fs_id 可以获取 dlink. File.get("selectedItemList")可以获取选择的文件的 DOM 结构.

# commonService 模块

var Service = require('common:widget/commonService/commonService.js');
Service.getDlink(
  JSON.stringify(File.get('selectedList')),
  'dlink',
  self.aria2_rpc.bind(self)
);
1
2
3
4
5
6

commonService 模块有很多实用的功能,但是我们目前只需要这么一个就足够了,有需要的可以自己研究下.getDlink 接受三个参数.第一个是 每个要下载的文件的 fs_id,多个文件是数组的字符串方式传入,第二个是获取 dlink 的类型,总共有三个类型 batsh,dlink,nolimit,第一个类型 是把传入的多个文件合并成一个压缩包进行下载,返回一个 dlink,第二个是单独获取每个文件的 dlink,第三个还没有尝试过.第三个参数是回调函数 会传入 POST 之后获取的 json 数据.

# 设置 UA

因为我现在还没找到怎么获取选择的文件名的列表,所以在 aria2c 的时候无法手动指定文件名.貌似不写 UA 的情况下会被限速. 设置 chrome 的 UA 文件名会被 encode,所以 aria2c 的时候设置 UA 为百度云管家的 UA

var UA = 'netdisk;4.4.0.6;PC;PC-Windows;6.2.9200;WindowsBaiduYunGuanJia';
1

百度云盘升级之后仅仅只有 dlink 还不行,还需要一个 name 为BDUSS的 cookie. 但是这个 cookie 被设置为 http only,所以 JS 是无论如何也获取不到的.目前只能采用手动设置的方法. 还好这个 cookie 每个用户基本都是唯一的,设置一次永久使用,否则真是麻烦.

完整版实现GitHub