Greasy Fork is available in English.
坚果云
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/1191838/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,
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
})
}
)
}
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) => {
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(true)//reject("权限不足,拒绝访问")
}
else {
reject("The status code is " + status + " and the status text is " + response.statusText)
}
}
});
}
)
}
AutoBack(fileName, Exclude = [], Callback) {
let tim = new Date
let format = `${tim.getFullYear()}-${tim.getMonth()}-${tim.getDate()}`
let NewFileName = `${fileName}-${format}.json`
if (GM_getValue('backup', null) != format) {
var FileData = {}
GM_listValues().forEach(function (value) {
if (Exclude.indexOf(value) == -1) {
FileData[value] = GM_getValue(value)
}
})
FileData = JSON.stringify(FileData)
let FilePath = "config/" + fileName
new Promise(
complete => {
this.ExistsFile(FilePath).then(
async response => {
if (!response) {//not exist
await this.NewFolder(FilePath)
}
console.log(FilePath, NewFileName, FileData, "json");
let status = await this.UploadFiles(FilePath, NewFileName, FileData, "json")
if (status) {
console.log("上传备份成功");
GM_setValue('backup', format)
if (Callback != null) {//回调
Callback.call({ webdav: this })
}
} else {
console.log("上传备份失败");
}
complete(status)
}
)
}
)
}
}
}