牙叔教程 简单易懂
先说结论: 不冲会员, 也可以达到5MB/S.
是MB大写B哦, B字节,
不是小b,比特;
这是百度网盘官方提供的方法, 只是一般人不知道,
速度限制:实测非会员下载5MB/s
现在我来跟你讲讲使用步骤.
第一步 打开网盘控制台
https://pan.baidu.com/union/console/applist?from=person
第二步 点击创建应用
网页右上角
第三步 填写资料
名字随便填
点击创建
第四步 创建失败
去认证一下
https://pan.baidu.com/union/apply?
第五步 创建成功
第六步 看文档
https://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'
// }
第十步 看下载文档
https://pan.baidu.com/union/doc/pkuo3snyp
第十一步 获取文件列表
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服务, 不需要科技就可以正常用, 还支持画图