百度网盘5MB每秒-你本来就很快

806 阅读2分钟

牙叔教程 简单易懂

先说结论: 不冲会员, 也可以达到5MB/S.


是MB大写B哦, B字节,

不是小b,比特;

这是百度网盘官方提供的方法, 只是一般人不知道,

速度限制:实测非会员下载5MB/s

现在我来跟你讲讲使用步骤.

第一步 打开网盘控制台

pan.baidu.com/union/conso…

第二步 点击创建应用

网页右上角

第三步 填写资料

名字随便填

点击创建

第四步 创建失败

去认证一下

pan.baidu.com/union/apply…

第五步 创建成功

第六步 看文档

pan.baidu.com/union/doc/

第七步 选择授权模式

前两个都要填写域名, 最后一个不用填写域名, 所以我选择

设备码模式

第八步 获取二维码

const axios = require('axios');
const { AppID, Appkey, Secretkey, Signkey } = require("./config.js");

axios.get('https://openapi.baidu.com/oauth/2.0/device/code', {
  params: {
    response_type: 'device_code',
    client_id: Appkey,
    scope: 'basic,netdisk'
  },
  headers: {
    'User-Agent': 'pan.baidu.com'
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.log(error);
  });

  // {
  //   device_code: 'e85exxxxxxxxxxx38b',
  //   user_code: '6xxxxxxxxk',
  //   verification_url: 'https://openapi.baidu.com/device',
  //   qrcode_url: 'https://openapi.baidu.com/device/qrcode/2d0382exxxxxxxxxx93e1/6xxxxxxck',
  //   expires_in: 300,
  //   interval: 5
  // }

获取到qrcode_url以后, 复制该链接到浏览器, 然后就会出现二维码, 用你的手机扫码二维码授权

第九步 获取Access Token

const axios = require('axios');
const { AppID, Appkey, Secretkey, Signkey } = require("./config.js");

axios.get('https://openapi.baidu.com/oauth/2.0/token', {
  params: {
    grant_type: 'device_token',
    code: 'e8xxxxxxxxxxxxxxxxxx38b',
    client_id: Appkey,
    client_secret: Secretkey
  },
  headers: {
    'User-Agent': 'pan.baidu.com'
  }
})
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.log(error);
  });
  // {
  //   expires_in: 2592000,
  //   refresh_token: '12xxxxxxxxxxxxxxxxxXw',
  //   access_token: '126xxxxxxxxxxxxxxxxJNeg',
  //   session_secret: '',
  //   session_key: '',
  //   scope: 'basic netdisk'
  // }

第十步 看下载文档

pan.baidu.com/union/doc/p…

第十一步 获取文件列表

async function getFileList() {
  try {
    const response = await axios.get("https://pan.baidu.com/rest/2.0/xpan/file", {
      params: {
        method: "list",
        dir: "/test",
        order: "time",
        start: 0,
        limit: 10,
        folder: 0,
        access_token: access_token,
        desc: 1,
      },
      headers: {
        "User-Agent": "pan.baidu.com",
      },
    });
    console.log(response.data);
  } catch (error) {
    console.log(error);
  }
}

我再目录test传了一个46.53MB的文件用于测试

返回的文件列表信息

{
  errno: 0,
  guid_info: '',
  list: [
    {
      tkbind_id: 0,
      owner_type: 0,
      category: 6,
      real_category: 'rar',
      fs_id: 1011xxxxxxxx288,
      md5: '5eeabxxxxxxxxxxx82183',
      oper_id: 231xxxxxxxxx846,
      server_ctime: 168xxxxxxxx05,
      extent_tinyint7: 0,
      wpfile: 0,
      local_mtime: 16xxxxxxxxx4658,
      size: 4xxxxxxxxx390,
      from_type: 0,
      pl: 1,
      share: 0,
      server_atime: 0,
      path: '/test/psxxxxxxxx.rar',
      local_ctime: 166xxxxxx79,
      server_mtime: 168xxxxxxxx05,
      server_filename: 'psxxxxxxx.rar',
      owner_id: 0,
      unlist: 0,
      isdir: 0
    }
  ],
  request_id: 87xxxxxxxxxxxxx00,
  guid: 0
}

第十二步 获取文件信息

async function getFileMetas() {
  try {
    const response = await axios.get("http://pan.baidu.com/rest/2.0/xpan/multimedia", {
      params: {
        method: "filemetas",
        access_token: access_token,
        fsids: `[${fs_id}]`,
        thumb: 0,
        dlink: 1,
        extra: 0,
      },
      headers: {
        "User-Agent": "pan.baidu.com",
      },
    });
    console.log(response.data);
  } catch (error) {
    console.log(error);
  }
  // {
  //   errmsg: 'succ',
  //   errno: 0,
  //   list: [
  //     {
  //       category: 6,
  //       dlink: 'https://d.pcs.baidu.com/file/5eexxxxxxxx183?fid=231xxxx',
  //       filename: 'pxxxxxx.rar',
  //       fs_id: 101xxxxxxxxxxxx1288,
  //       isdir: 0,
  //       local_ctime: 1xxxxxxxxxx579,
  //       local_mtime: 16xxxxxxxxx658,
  //       md5: '5eeabb4exxxxxxx2183',
  //       oper_id: 23xxxxxxxxxxx6846,
  //       path: '/test/xxxxxx.rar',
  //       server_ctime: 16xxxxxxx705,
  //       server_mtime: 16xxxxxxxxx3705,
  //       size: 48790390
  //     }
  //   ],
  //   names: {},
  //   request_id: '87xxxxxxxxxx651'
  // }
}

第十三步 下载文件

不允许使用浏览器直接下载超过50MB的文件, 超过50MB的文件需用开发者原生的软件或者app进行下载

我的文件刚好没有50MB, 我去整个100M的试试

上传了一个93MB的文件, 看看能不能正常下载

function downloadFile() {
  let dlink =
    "https://d.pcs.baidu.com/file/5exxxxxxxxxx"
  let url = `${dlink}&access_token=${access_token}`;

  return new Promise((resolve, reject) => {
    axios
      .get(url, {
        headers: {
          "User-Agent": "pan.baidu.com",
          Host: "d.pcs.baidu.com",
        },

        responseType: "stream",
      })
      .then((response) => {
        const writeStream = fs.createWriteStream("file.zip");
        response.data.pipe(writeStream);
        writeStream.on("finish", () => {
          resolve(true);
        });
        writeStream.on("error", (error) => {
          reject(error);
        });
      })
      .catch((error) => {
        console.log(error);
        reject(false);
      });
  });
}

你们知道下载时间多少吗?

async function main() {
  let startTime = new Date().getTime();
  let downloadRes = await downloadFile();
  console.log(downloadRes);
  let endTime = new Date().getTime();
  console.log(`下载耗时:${(endTime - startTime) / 1000}s`);
}
main();
下载耗时:17.833s // 93.06MB

Y的不比阿里慢呀

备注

目前下载sdk仅支持小文件下载,如果涉及大文件,可参考该demo进行升级改造,涉及到分片下载、断点下载等技术


以上代码均由ChatGPT4生成, 我用的是国内的服务商提供的chatGPT4服务, 不需要科技就可以正常用, 还支持画图


公众号 牙叔教程

这个ChatGPT星球有多牛逼