510 lines
13 KiB
JavaScript
510 lines
13 KiB
JavaScript
/*
|
|
* @Author: samples jadehh@live.com
|
|
* @Date: 2023-12-14 11:03:04
|
|
* @LastEditors: samples jadehh@live.com
|
|
* @LastEditTime: 2023-12-14 11:03:04
|
|
* @FilePath: /lib/ali_object.js
|
|
* @Description: 阿里云盘基础类
|
|
*/
|
|
import {_} from "./cat.js";
|
|
|
|
const UA = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
|
|
const CLIENT_ID = "76917ccccd4441c39457a04f6084fb2f";
|
|
import * as Utils from "./utils.js";
|
|
// 引用会导致出错
|
|
// import qs from "qs";
|
|
// import axios from "axios";
|
|
// import https from "https";
|
|
|
|
function getHeader() {
|
|
const params = {};
|
|
params["User-Agent"] = UA;
|
|
params.Referer = "https://www.aliyundrive.com/";
|
|
return params;
|
|
}
|
|
|
|
class User {
|
|
constructor() {
|
|
this.driveId = "";
|
|
this.userId = "";
|
|
this.tokenType = "";
|
|
this.accessToken = "";
|
|
this.refreshToken = "";
|
|
}
|
|
|
|
static objectFrom(json_str) {
|
|
if (_.isEmpty(json_str)) {
|
|
return new User();
|
|
}
|
|
|
|
let resonse = JSON.parse(json_str), user = new User();
|
|
user.driveId = resonse.default_drive_id;
|
|
user.userId = resonse.user_id;
|
|
user.tokenType = resonse.token_type;
|
|
user.accessToken = resonse.access_token;
|
|
user.refreshToken = resonse.refresh_token; // 刷新Token记录原有的Token
|
|
return user;
|
|
}
|
|
|
|
getDriveId() {
|
|
return _.isEmpty(this.driveId) ? "" : this.driveId;
|
|
}
|
|
|
|
getUserId() {
|
|
return _.isEmpty(this.userId) ? "" : this.userId;
|
|
}
|
|
|
|
getTokenType() {
|
|
return _.isEmpty(this.tokenType) ? "" : this.tokenType;
|
|
}
|
|
|
|
getAccessToken() {
|
|
return _.isEmpty(this.accessToken) ? "" : this.accessToken;
|
|
}
|
|
|
|
getRefreshToken() {
|
|
return _.isEmpty(this.refreshToken) ? "" : this.refreshToken;
|
|
}
|
|
|
|
setRefreshToken(refresh_token) {
|
|
this.refreshToken = refresh_token
|
|
}
|
|
|
|
getAuthorization() {
|
|
return this.getTokenType() + " " + this.getAccessToken();
|
|
}
|
|
|
|
isAuthed() {
|
|
return this.getTokenType().length > 0 && this.getAccessToken().length > 0;
|
|
}
|
|
|
|
clean() {
|
|
this.refreshToken = "";
|
|
this.accessToken = "";
|
|
return this;
|
|
}
|
|
|
|
async save() {
|
|
await local.set("ali", "aliyundrive_user", this.toString());
|
|
|
|
|
|
return this;
|
|
}
|
|
|
|
toString() {
|
|
return JSON.stringify(this.toDict());
|
|
}
|
|
|
|
toDict() {
|
|
return {
|
|
default_drive_id: this.getDriveId(),
|
|
user_id: this.getUserId(),
|
|
token_type: this.getTokenType(),
|
|
access_token: this.getAccessToken(),
|
|
refresh_token: this.getRefreshToken()
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
class OAuth {
|
|
constructor() {
|
|
this.tokenType = "";
|
|
this.accessToken = "";
|
|
this.refreshToken = "";
|
|
}
|
|
|
|
static objectFrom(json_str) {
|
|
if (_.isEmpty(json_str)) {
|
|
return new OAuth();
|
|
}
|
|
let oauth_json = JSON.parse(json_str), oAuth = new OAuth();
|
|
oAuth.tokenType = oauth_json.token_type;
|
|
oAuth.accessToken = oauth_json.access_token;
|
|
oAuth.refreshToken = oauth_json.refresh_token;
|
|
return oAuth;
|
|
}
|
|
|
|
getTokenType() {
|
|
return _.isEmpty(this.tokenType) ? "" : this.tokenType;
|
|
}
|
|
|
|
getAccessToken() {
|
|
return _.isEmpty(this.accessToken) ? "" : this.accessToken;
|
|
}
|
|
|
|
getRefreshToken() {
|
|
return _.isEmpty(this.refreshToken) ? "" : this.refreshToken;
|
|
}
|
|
|
|
getAuthorization() {
|
|
return this.getTokenType() + " " + this.getAccessToken();
|
|
}
|
|
|
|
clean() {
|
|
this.refreshToken = "";
|
|
this.accessToken = "";
|
|
return this;
|
|
}
|
|
|
|
async save() {
|
|
await local.set("ali", "aliyundrive_oauth", this.toString());
|
|
|
|
return this;
|
|
}
|
|
|
|
toString() {
|
|
return JSON.stringify(this.toDict());
|
|
}
|
|
|
|
toDict() {
|
|
return {
|
|
token_type: this.getTokenType(), access_token: this.getAccessToken(), refresh_token: this.getRefreshToken()
|
|
};
|
|
}
|
|
}
|
|
|
|
class Drive {
|
|
constructor() {
|
|
this.defaultDriveId = "";
|
|
this.resourceDriveId = "";
|
|
this.backupDriveId = "";
|
|
}
|
|
|
|
static objectFrom(json_str) {
|
|
if (_.isEmpty(json_str)) {
|
|
return new Drive();
|
|
}
|
|
let obj = JSON.parse(json_str), drive = new Drive();
|
|
drive.defaultDriveId = obj.default_drive_id;
|
|
drive.resourceDriveId = obj.resource_drive_id;
|
|
drive.backupDriveId = obj.backup_drive_id;
|
|
return drive;
|
|
}
|
|
|
|
getDefaultDriveId() {
|
|
return _.isEmpty(this.defaultDriveId) ? "" : this.defaultDriveId;
|
|
}
|
|
|
|
getResourceDriveId() {
|
|
return _.isEmpty(this.resourceDriveId) ? "" : this.resourceDriveId;
|
|
}
|
|
|
|
getBackupDriveId() {
|
|
return _.isEmpty(this.backupDriveId) ? "" : this.backupDriveId;
|
|
}
|
|
|
|
clean() {
|
|
this.defaultDriveId = "";
|
|
this.backupDriveId = "";
|
|
this.resourceDriveId = "";
|
|
return this;
|
|
}
|
|
|
|
async save() {
|
|
await local.set("ali", "aliyundrive_drive", this.toString());
|
|
return this;
|
|
}
|
|
|
|
toString() {
|
|
const params = {
|
|
default_drive_id: this.getDefaultDriveId(),
|
|
resource_drive_id: this.getResourceDriveId(),
|
|
backup_drive_id: this.getBackupDriveId()
|
|
};
|
|
return JSON.stringify(params);
|
|
}
|
|
|
|
}
|
|
|
|
class Code {
|
|
constructor() {
|
|
this.redirectUri = "";
|
|
}
|
|
|
|
static objectFrom(json_str) {
|
|
if (_.isEmpty(json_str)) {
|
|
return new Code();
|
|
}
|
|
let code_json = JSON.parse(json_str), code = new Code();
|
|
code.redirectUri = code_json.redirectUri;
|
|
return code;
|
|
}
|
|
|
|
getRedirectUri() {
|
|
return _.isEmpty(this.redirectUri) ? "" : this.redirectUri;
|
|
}
|
|
|
|
getCode() {
|
|
return this.getRedirectUri().split("code=")[1];
|
|
}
|
|
}
|
|
|
|
class Item {
|
|
constructor(file_id) {
|
|
this.items = [];
|
|
this.nextMarker = "";
|
|
this.fileId = file_id;
|
|
this.shareId = "";
|
|
this.name = "";
|
|
this.type = "";
|
|
this.fileExtension = "";
|
|
this.category = "";
|
|
this.size = "";
|
|
this.parent = "";
|
|
this.shareToken = ""
|
|
}
|
|
|
|
static objectFrom(json_str, shareToken) {
|
|
if (_.isEmpty(json_str)) {
|
|
return new Item();
|
|
}
|
|
|
|
let item_json = JSON.parse(json_str), item = new Item();
|
|
|
|
item.nextMarker = typeof item_json.next_marker == "undefined" ? "" : item_json.next_marker;
|
|
item.fileId = typeof item_json.file_id == "undefined" ? "" : item_json.file_id;
|
|
item.shareId = typeof item_json.share_id == "undefined" ? "" : item_json.share_id;
|
|
item.shareToken = shareToken
|
|
item.name = typeof item_json.name == "undefined" ? "" : item_json.name;
|
|
item.type = typeof item_json.type == "undefined" ? "" : item_json.type;
|
|
item.fileExtension = typeof item_json.file_extension == "undefined" ? "" : item_json.file_extension;
|
|
item.category = typeof item_json.category == "undefined" ? "" : item_json.category;
|
|
item.size = typeof item_json.size == "undefined" ? "" : item_json.size;
|
|
item.parent = typeof item_json.parent_file_id == "undefined" ? "" : item_json.parent_file_id;
|
|
typeof item.items != "undefined" && Array.isArray(item_json.items) && !_.isEmpty(item_json.items) && item_json.items.forEach(function (x) {
|
|
let new_item = Item.objectFrom(JSON.stringify((x)), shareToken)
|
|
item.items.push(new_item);
|
|
});
|
|
return item;
|
|
}
|
|
|
|
getItems() {
|
|
return _.isEmpty(this.items) ? [] : this.items;
|
|
}
|
|
|
|
getNextMarker() {
|
|
return _.isEmpty(this.nextMarker) ? "" : this.nextMarker;
|
|
}
|
|
|
|
getFileId() {
|
|
return _.isEmpty(this.fileId) ? "" : this.fileId;
|
|
}
|
|
|
|
getShareId() {
|
|
return _.isEmpty(this.shareId) ? "" : this.shareId;
|
|
}
|
|
|
|
getFileExtension() {
|
|
return _.isEmpty(this.fileExtension) ? "" : this.fileExtension;
|
|
}
|
|
|
|
getName() {
|
|
return _.isEmpty(this.name) ? "" : this.name;
|
|
}
|
|
|
|
getType() {
|
|
return _.isEmpty(this.type) ? "" : this.type;
|
|
}
|
|
|
|
getExt() {
|
|
return _.isEmpty(this.fileExtension) ? "" : this.fileExtension;
|
|
}
|
|
|
|
getCategory() {
|
|
return _.isEmpty(this.category) ? "" : this.category;
|
|
}
|
|
|
|
getSize() {
|
|
return this.size === 0 ? "" : "[" + Utils.getSize(this.size) + "]";
|
|
}
|
|
|
|
getParent() {
|
|
return _.isEmpty(this.parent) ? "" : "[" + this.parent + "]";
|
|
}
|
|
|
|
parentFunc(item) {
|
|
this.parent = item;
|
|
return this;
|
|
}
|
|
|
|
// getDisplayName() {
|
|
// return this.getParent() + " " + this.getName() + " " + this.getSize();
|
|
// }
|
|
|
|
getDisplayName(type_name) {
|
|
let name = this.getName();
|
|
name = name.replaceAll("玩偶哥 q 频道:【神秘的哥哥们】", "")
|
|
if (type_name === "电视剧") {
|
|
let replaceNameList = ["4k", "4K"]
|
|
name = name.replaceAll("." + this.getFileExtension(), "")
|
|
name = name.replaceAll(" ", "").replaceAll(" ", "")
|
|
for (const replaceName of replaceNameList) {
|
|
name = name.replaceAll(replaceName, "")
|
|
}
|
|
name = Utils.getStrByRegexDefault(/\.S01E(.*?)\./, name)
|
|
const numbers = name.match(/\d+/g);
|
|
if (numbers.length > 0) {
|
|
name = numbers[0]
|
|
}
|
|
}
|
|
return name + " " + this.getParent() + " " + this.getSize();
|
|
}
|
|
|
|
}
|
|
|
|
class Sub {
|
|
constructor() {
|
|
this.url = "";
|
|
this.name = "";
|
|
this.lang = "";
|
|
this.format = "";
|
|
}
|
|
|
|
static create() {
|
|
return new Sub();
|
|
}
|
|
|
|
setName(name) {
|
|
this.name = name;
|
|
return this;
|
|
}
|
|
|
|
setUrl(url) {
|
|
this.url = url;
|
|
return this;
|
|
}
|
|
|
|
setLang(lang) {
|
|
this.lang = lang;
|
|
return this;
|
|
}
|
|
|
|
setFormat(format) {
|
|
this.format = format;
|
|
return this;
|
|
}
|
|
|
|
setExt(ext) {
|
|
switch (ext) {
|
|
case "vtt":
|
|
return this.setFormat("text/vtt");
|
|
case "ass":
|
|
case "ssa":
|
|
return this.setFormat("text/x-ssa");
|
|
default:
|
|
return this.setFormat("application/x-subrip");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
async function getUserCache() {
|
|
return await local.get("ali", "aliyundrive_user");
|
|
}
|
|
|
|
async function getOAuthCache() {
|
|
return await local.get("ali", "aliyundrive_oauth");
|
|
}
|
|
|
|
function getShareId(share_url) {
|
|
let patternAli = /https:\/\/www\.alipan\.com\/s\/([^\\/]+)(\/folder\/([^\\/]+))?|https:\/\/www\.aliyundrive\.com\/s\/([^\\/]+)(\/folder\/([^\\/]+))?/
|
|
let matches = patternAli.exec(share_url)
|
|
const filteredArr = matches.filter(item => item !== undefined);
|
|
if (filteredArr.length > 1) {
|
|
return matches[1]
|
|
} else {
|
|
return ""
|
|
}
|
|
}
|
|
|
|
async function ali_request(url, opt) {
|
|
|
|
let resp;
|
|
let data;
|
|
try {
|
|
data = opt ? opt.data || null : null;
|
|
const postType = opt ? opt.postType || null : null;
|
|
const returnBuffer = opt ? opt.buffer || 0 : 0;
|
|
const timeout = opt ? opt.timeout || 5000 : 5000;
|
|
|
|
const headers = opt ? opt.headers || {} : {};
|
|
if (postType === 'form') {
|
|
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
|
|
if (data != null) {
|
|
data = qs.stringify(data, {encode: false});
|
|
}
|
|
}
|
|
let respType = returnBuffer === 1 || returnBuffer === 2 ? 'arraybuffer' : undefined;
|
|
resp = await axios(url, {
|
|
responseType: respType,
|
|
method: opt ? opt.method || 'get' : 'get',
|
|
headers: headers,
|
|
data: data,
|
|
timeout: timeout,
|
|
httpsAgent: https.Agent({
|
|
rejectUnauthorized: false,
|
|
}),
|
|
});
|
|
data = resp.data;
|
|
|
|
const resHeader = {};
|
|
for (const hks of resp.headers) {
|
|
const v = hks[1];
|
|
resHeader[hks[0]] = Array.isArray(v) ? (v.length === 1 ? v[0] : v) : v;
|
|
}
|
|
|
|
if (!returnBuffer) {
|
|
if (typeof data === 'object') {
|
|
data = JSON.stringify(data);
|
|
}
|
|
} else if (returnBuffer === 1) {
|
|
return {code: resp.status, headers: resHeader, content: data};
|
|
} else if (returnBuffer === 2) {
|
|
return {code: resp.status, headers: resHeader, content: data.toString('base64')};
|
|
}
|
|
return {code: resp.status, headers: resHeader, content: data};
|
|
} catch (error) {
|
|
// await Utils.log(`请求失败,URL为:${url},失败原因为:${error}`)
|
|
resp = error.response
|
|
try {
|
|
return {code: resp.status, headers: resp.headers, content: JSON.stringify(resp.data)};
|
|
} catch (err) {
|
|
return {headers: {}, content: ''};
|
|
}
|
|
}
|
|
}
|
|
|
|
async function post(url, params) {
|
|
url = url.startsWith("https") ? url : "https://api.aliyundrive.com/" + url;
|
|
let response = await postJson(url, params, getHeader());
|
|
return response.content;
|
|
}
|
|
|
|
async function postJson(url, params, headers) {
|
|
params["Content-Type"] = "application/json";
|
|
return await req(url, {
|
|
headers: headers, method: "post", data: params
|
|
});
|
|
}
|
|
|
|
|
|
export {
|
|
UA,
|
|
CLIENT_ID,
|
|
OAuth,
|
|
Code,
|
|
Sub,
|
|
User,
|
|
Item,
|
|
Drive,
|
|
getHeader,
|
|
getShareId,
|
|
getOAuthCache,
|
|
getUserCache,
|
|
post,
|
|
postJson
|
|
}; |