第一步
更具分享链接获取文件列表
请求方式POST
请求url + 固定params默认参数
https://pan.baidu.com/share/wxlist?channel=weixin&version=2.2.2&clienttype=25&web=1&page=1&num=1000&order=time
请求头
headers: {
'User-Agent': 'Mozilla/5.0 (Linux; Android 7.1.1; MI 6 Build/NMF26X; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/043807 Mobile Safari/537.36 MicroMessenger/6.6.1.1220(0x26060135) NetType/4G Language/zh_CN MicroMessenger/6.6.1.1220(0x26060135) NetType/4G Language/zh_CN miniProgram',
'Cookie': this.svipCookie,
'Referer': 'https://pan.baidu.com/disk/home',
}
params参数
params = {
shorturl: surl,
root: dir ? 0 : 1,
...(pwd ? { pwd } : null),
...(dir ? { dir } : null),
}
第二步获取sign和timestamp
请求方式GET
https://pan.baidu.com/share/tplconfig?fields=sign,timestamp&channel=chunlei&web=1&clienttype=0
headers: {
'Cookie': 普通账户cookie,
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
'Referer': 'https://pan.baidu.com/disk/home',
}
//url参数
params: {
share_id: shareId,
uk,
surl,
app_id: this.appid,
}
第三步获取下载直链
请求方式POST
https://pan.baidu.com/
/api/sharedownload?sign=${sign}×tamp=${timestamp}&channel=chunlei&web=1&app_id${this.appid}&clienttype=0
请求头:
headers: {
cookie: 普通账户cookie
}
请求体body参数 FormData表单形式提交
formData.append('encrypt', 0);
formData.append('extra', JSON.stringify({ sekey: seckey }));
formData.append('product', 'share');
formData.append('timestamp', timestamp);
vcode_input && formData.append('vcode_input', vcode_input);
vcode_str && formData.append('vcode_str', vcode_str);
formData.append('uk', uk);
formData.append('primaryid', shareId);
formData.append('fid_list', fidList);
vcode_input和vcode_str触发验证码则需要提交验证码参数
第四步获取真实下载地址
请求方式POST
请求url为第三步拿到的dlink参数
注意:请求时要替换头部url为
https://d.pcs.baidu.com/file/${md5}
替换成
https://d.pcs.baidu.com/rest/2.0/pcs/file
md5为第三步sharedownload返回的文件参数md5
请求参数:(待在url上)
除了上一步dlink携带的参数外,额外需要提交的params url参数为
app_id: '250528',
method: 'locatedownload',
check_blue: 1,
vip: 2,
version: '7.39.1.1',
channel: '00000000000000000000000000000000',
clienttype: 8,
ehps: 0,
dtype: 1,
ver: "4.0",
es: 1,
esl: 1,
devuid: 'BDIMXV2-O_0B5DF5389B5D4775946635E4E18D8314-C_0-D_5CDF_B803_70B0_42BC.-M_BCECA007D4F6-V_0D274B62',
rand: '85605dd38fed0309183c4db5fb362dfe5cbd553',
path: md5, //此md5为变量,在上面能拿到
注意:除了path其他都为常量固定
devuid和rand有待考察
成功可获取到直链地址
参数类型为数组
urls:[
{
dilnk:"http:..",
rand:1
},
{
dilnk:"http:..",
rand:2
},
...
]
请求方式GET
返回一堆链接筛选哪条可以下载 (一般只有1-3条链接可下载)
注意:
1.下载时在末尾拼接&origin=dlna
2.header带'User-Agent': 'netdisk;7.39.1.1;PC;PC-Windows;10.0.19045;WindowsBaiduYunGuanJia'
js代码实现逻辑可参考
const baseURL = dlink;
const serializeParams = (params) => {
return Object.keys(params)
.map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join('&');
};
// Serialize the params and append to the baseURL
const urlParams = serializeParams(params);
const fullURL = (`${baseURL}&${urlParams}`).replace(`https://d.pcs.baidu.com/file/${md5}`, 'https://d.pcs.baidu.com/rest/2.0/pcs/file');
let urls = [];
const res = await lastValueFrom(
this.httpService
.post(
fullURL,
{},
{
headers: {
'User-Agent': 'netdisk;7.39.1.1;PC;PC-Windows;10.0.19045;WindowsBaiduYunGuanJia',
'cookie': this.svipCookie, //会员账号cookie
},
},
));
const { data, data: { errno } } = res;
console.log('data', data.urls);
urls = data.urls.map((v) => ({
...v,
url: `${v.url}`,
}));
//返回一堆链接筛选哪条可以下载 (一般只有1-3条链接可下载)
for (let i = 0; i < urls.length; i++) {
try {
const resData = await lastValueFrom(
this.httpService
.get(
urls[i].url.split('?')[0],
{
timeout: 1000 * 2,
}),
)
} catch (e) {
//如果错误异常error_msg字符产包含sign关键字则说明可下载
if (e.response.data.error_msg.includes('sign')) {
downloadLink = `${urls[i].url}&origin=dlna`;
break;
}
}
}
补充:第三步sharedownload接口需要图形验证码校验
获取dbstoken
请求方式GET
https://pan.baidu.com/api/gettemplatevariable?fields=[%22bdstoken%22]
headers :
{
'cookie':普通账号cookie,
}
获取验证码返回前端
https://pan.baidu.com/api/getvcode?prod=pan&channel=chunlei&web=1&app_id=250528&clienttype=0&bdstoken=${tokenData.data.result.bdstoken}
获取第三步sharedownload接口需要的vcode_str
vcode_input字段为用户手动输入的图形验证码参数