baiduwangpan/bin/wangpan.js

311 lines
9.7 KiB
JavaScript
Raw Normal View History

2021-03-24 20:57:40 +08:00
const axios = require('axios');
const fs = require('fs');
const crypto = require('crypto');
const FormData = require('form-data');
const request = require("request")
const https = require('https');
const size = 4 * 1024 * 1024
let promistlist = []
let daxiao
function getsize(url) {
return new Promise((res, err) => {
fs.stat("./a.exe", {}, (err, stats) => {
if (!err) {
daxiao = stats.size
let fenpian = Math.ceil(stats.size / size)
res({
size: daxiao,
num: fenpian
})
} else {
err("文件路径错误或文件不存在")
}
})
})
}
function getfile({ i, url }) {
return new Promise((res) => {
let data = '';
let start = i * size
let end = (i + 1) * size - 1
const stream = fs.createReadStream(url, {
start,
end
})
stream.on('data', (chunk) => {
// console.log(`接收到 ${chunk.length} 个字节的数据`);
if (!data) {
data = chunk
} else {
data = Buffer.concat([data, chunk])
}
});
stream.on('end', () => {
res(data)
});
})
}
function upgetfile({ i, url }) {
i = parseInt(i)
return new Promise((res) => {
let data = '';
const stream = fs.createReadStream(url, {
start: i * size,
end: (i + 1) * size - 1
})
// res(stream)
stream.on('data', (chunk) => {
// console.log(`接收到 ${chunk.length} 个字节的数据`);
if (!data) {
data = chunk
} else {
data = Buffer.concat([data, chunk])
}
});
stream.on('end', () => {
res(data)
});
})
}
async function getmd5list(url, info) {
promistlist = []
// fs.createReadStream
for (let i = 0; i < info.num; i++) {
let data = await getfile({ url, i })
const hash = crypto.createHash('md5');
hash.update(data);
const md5 = hash.digest('hex');
console.log(md5);
promistlist.push(md5)
}
return promistlist
}
async function precreate(info, url) {
let block_list = await getmd5list(url, info)
block_list = JSON.stringify(block_list)
let data = {
path: encodeURI('/app/服务器备份/baidu.exe'),
size: info.size,
isdir: 0,
autoinit: 1,
block_list,
rtype: 1,
}
let str = ""
for (let i in data) {
str += `${i}=${data[i]}&`
}
axios.post('https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ', str).then((res) => {
upload({
url,
info,
uploadid: res.data.uploadid,
pian: res.data.block_list
})
})
}
function uploadfile(i,data,uploadid){
return new Promise((r)=>{
console.log(data.length)
let urls = '/rest/2.0/pcs/superfile2?'
let params = {
access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ',
method: 'upload',
type: "tmpfile",
path: encodeURI('/app/服务器备份/baidu.exe'),
uploadid,
partseq: i
}
for (let j in params) {
urls += j + '=' + params[j] + '&'
}
const options = {
hostname: 'd.pcs.baidu.com',
port: 443,
path: urls,
method: 'PUT',
headers: {
'content-type':'multipart/form-data',
'Content-Length': data.length
}
};
const req = https.request(options, (res) => {
console.log('状态码:', res.statusCode);
console.log('请求头:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
r(1)
});
req.on('error', (e) => {
console.error(e);
});
req.write(data);
req.end();
})
}
async function upload({ url, info, uploadid, pian }) {
for (let i of pian) {
let data = await upgetfile({ url, i })
await uploadfile(i,data,uploadid)
// var formData = new FormData();
// formData.append('file', data);
// console.log(formData.getBuffer())
// headers['content-length'] = length;
// const from = new FormData();
// // const blob = Buffer.from(data);
// from.append('file', data);
// axios.post('https://d.pcs.baidu.com/rest/2.0/pcs/superfile2', {file: data}, {
// headers: {
// 'content-type': 'multipart/form-data; boundary=----WebKitFormBoundary' + new Date().getTime()
// },
// params: {
// access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ',
// method: 'upload',
// type: "tmpfile",
// path: encodeURI('/app/服务器备份/baidu.exe'),
// uploadid,
// partseq: i
// }
// }).then((res) => {
// console.log(res)
// }).catch(err => {
// console.log(err)
// })
// var headers = formData.getHeaders();
// formData.getLength(async function (err, length) {
// if (err) {
// return;
// }
// //设置长度important!!!
// headers['content-length'] = length;
// // let $upload = axios.create({ withCredentials: false });
// // await $upload.post('https://d.pcs.baidu.com/rest/2.0/pcs/superfile2', formData, {
// // headers,
// // params: {
// // access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ',
// // method: 'upload',
// // type: "tmpfile",
// // path: encodeURI('/app/服务器备份/baidu.exe'),
// // uploadid,
// // partseq: i
// // }
// // }).then((res) => {
// // console.log(res)
// // }).catch(err => {
// // console.log(err)
// // })
// // await axios.post(data.url, formData, { headers }).then(res => {
// // console.log("上传成功", res.data);
// // }).catch(res => {
// // console.log(res.data);
// // })
// let url = 'https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?'
// let params = {
// access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ',
// method: 'upload',
// type: "tmpfile",
// path: encodeURI('/app/服务器备份/baidu.exe'),
// uploadid,
// partseq: i
// }
// for (let j in params) {
// url += j + '=' + params[j] + '&'
// }
// request.post({
// url, formData, function(err, httpResponse, body) {
// if (err) {
// return console.error('upload failed:', err);
// }
// console.log('Upload successful! Server responded with:', body);
// }
// })
// })
// let urls = 'https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?'
// let params = {
// access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ',
// method: 'upload',
// type: "tmpfile",
// path: encodeURI('/app/服务器备份/baidu.exe'),
// uploadid,
// partseq: i
// }
// for (let j in params) {
// urls += j + '=' + params[j] + '&'
// }
// // console.log(urls)
// request.post({
// url: urls, form:{file: Buffer.from(data)}, function(err, httpResponse, body) {
// console.log(111)
// if (err) {
// return console.error('upload failed:', err);
// }
// console.log('Upload successful! Server responded with:', body);
// }
// })
// formData.submit(`https://d.pcs.baidu.com/rest/2.0/pcs/superfile2?method=upload&access_token=121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ&type=tmpfile&path=${encodeURI('/app/服务器备份/baidu.exe')}&uploadid=${uploadid}&partseq=${i}`, function(err, res) {
// console.log(res.statusCode);
// });
}
// https://pan.baidu.com/rest/2.0/xpan/file?method=create
let data = {
path:encodeURI('/app/服务器备份/baidu.exe'),
size: daxiao,
isdir:0,
rtype: 1,
uploadid,
block_list:JSON.stringify(promistlist)
}
let s = ''
for(let i in data){
s += i + "=" + data[i] + '&'
}
console.log(s)
axios.post('https://pan.baidu.com/rest/2.0/xpan/file?method=create',s,{
params:{
access_token: '121.f22e108b18705600a0dc665d12cf71ae.Yngau4V98lC_hUvMGnljcSZurJnoohuPYavgk4n.HJDCoQ',
}
}).then((res)=>{
console.log(res)
})
}
async function start(url) {
let info;
try {
info = await getsize(url)
} catch (err) {
console.log(err)
}
console.log(info)
precreate(info, url)
}
module.exports = {
start
}