百度网盘新版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
});
};
2
3
4
5
6
7
8
于是我便封装了一个函数用来实现消息提示.
# data-center 模块
var File = require('common:widget/data-center/data-center.js');
return File.get('selectedList');
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)
);
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';
# 设置 cookie
百度云盘升级之后仅仅只有 dlink 还不行,还需要一个 name 为BDUSS
的 cookie.
但是这个 cookie 被设置为 http only,所以 JS 是无论如何也获取不到的.目前只能采用手动设置的方法.
还好这个 cookie 每个用户基本都是唯一的,设置一次永久使用,否则真是麻烦.