baiduwangpan/bin/wangpan.js

311 lines
9.7 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}