坚果云
Version vom
Dieses Skript sollte nicht direkt installiert werden. Es handelt sich hier um eine Bibliothek für andere Skripte, welche über folgenden Befehl in den Metadaten eines Skriptes eingebunden wird // @require https://update.greasyfork.org/scripts/463081/1169729/webdav.js
class webdav {
constructor(Account, Password) {
this.Account = Account
this.Password = Password
}
NewFolder(FolderName) {
let url = `https://dav.jianguoyun.com/dav/${FolderName}/`
let type = "MKCOL" // 新建
let header = { "authorization": `Basic ${btoa(this.Account + ':' + this.Password)}` }
return new Promise(
(complete, error) => {
GM_xmlhttpRequest({
method: type,
timeout: 3000,
headers: header,
url: url,
onload: complete,
onerror: error,
ontimeout: error
})
}
)
}
UploadFiles(FolderName, FileName, FileData, DataType) {
let url = `https://dav.jianguoyun.com/dav/${FolderName}/${FileName}`
let type = "PUT" // 上传
let header = { "authorization": `Basic ${btoa(this.Account + ':' + this.Password)}` }
return new Promise(
(complete, error) => {
GM_xmlhttpRequest({
method: type,
timeout: 3000,
data: FileData,
headers: header,
url: url,
dataType: DataType,
onload: function (response) {
if (response.status == 201 || response.status == 204) {
complete(true)
} else {
console.error(response)
complete(false)
}
},
onerror: error,
ontimeout: error
})
}
)
}
DownloadFile(FolderName, FileName) {
let url = `https://dav.jianguoyun.com/dav/${FolderName}/${FileName}`
let type = "GET" // 上传
let header = { "authorization": `Basic ${btoa(this.Account + ':' + this.Password)}` }
return new Promise(
(complete, error) => {
GM_xmlhttpRequest({
method: type,
timeout: 3000,
headers: header,
url: url,
onload: function (response) {
if (response.status == 200) {
complete(response.responseText)
} else {
console.error(response)
complete(false)
}
},
onerror: error,
ontimeout: error
})
}
)
}
GetAllFile(path, depth) {
return new Promise((resolve, reject) => {
GM_xmlhttpRequest({
method: "PROPFIND",
url: "https://dav.jianguoyun.com/dav/" + path,
headers: {
"Authorization": `Basic ${btoa(this.Account + ':' + this.Password)}`,
"Depth": depth
},
onload: function (response) {
if (response.status == 207) {
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(response.responseText, "text/xml");
var responses = xmlDoc.getElementsByTagNameNS("DAV:", "response");
var urls = [];
for (var i = 0; i < responses.length; i++) {
var href = responses[i].getElementsByTagNameNS("DAV:", "href")[0].textContent;
var propstat = responses[i].getElementsByTagNameNS("DAV:", "propstat")[0];
var status = propstat.getElementsByTagNameNS("DAV:", "status")[0].textContent;
if (status.includes("200 OK")) {
var resourcetype = propstat.getElementsByTagNameNS("DAV:", "resourcetype")[0];
if (resourcetype.getElementsByTagNameNS("DAV:", "collection").length > 0) {
href += "/";
}
urls.push(href);
}
}
resolve(urls);
}
else {
console.error(response);
reject(new Error("The request failed with status code " + response.status));
}
}
});
});
}
ExistsFile(path) {
return new Promise((resolve, reject) => {
console.log(this);
GM_xmlhttpRequest({
method: "HEAD",
url: "https://dav.jianguoyun.com/dav/" + path,
headers: {
"Authorization": `Basic ${btoa(this.Account + ':' + this.Password)}`
},
onload: function (response) {
var status = response.status;
// 如果状态码是200,表示文件夹存在
if (status == 200) {
resolve(true)
}
// 如果状态码是404,表示文件夹不存在
else if (status == 404) {
resolve(false)
} else if (status == 403) {
resolve(false)
reject("权限不足,拒绝访问")
}
else {
reject("The status code is " + status + " and the status text is " + response.statusText)
}
}
});
}
)
}
}
function AutoUploadFiles(Account, Password, FilePath, FileName, FileData = undefined) {
if (!FileData) {
FileData = {}
GM_listValues().forEach(function (value, index, array) {
FileData[value] = GM_getValue(value)
})
FileData = JSON.stringify(FileData)
}
return new Promise(
complete => {
let LBackupTimestamp = GM_getValue("LBackupTimestamp", 0)
let NBackupTimestamp = Date.now()
if (NBackupTimestamp - LBackupTimestamp > 24 * 60 * 60 * 1000) {
console.log("FileData |", FileData)
let dav = new webdav(Account, Password)
dav.ExistsFile(FilePath).then(
async response => {
if (!response) {//not exist
await dav.NewFolder(FilePath)
}
complete(await dav.UploadFiles(FilePath, FileName, FileData, "json"))
GM_setValue("LBackupTimestamp", NBackupTimestamp)
}
)
} else {
complete("The backup interval cannot be less than 24 hours")
}
}
)
}