百度网盘新版API

Posted on

突然发现百度网盘又更新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
        });
    }

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

data-center模块

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

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));

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每个用户基本都是唯一的,设置一次永久使用,否则真是麻烦.

完整版实现GitHub

书签:baidu_aria2c