您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
坚果云
当前为
此脚本不应直接安装,它是供其他脚本使用的外部库。如果您需要使用该库,请在脚本元属性加入:// @require https://update.gf.qytechs.cn/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") } } ) }
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址