release: v0.4.0

This commit is contained in:
2026-05-18 05:11:57 +08:00
parent b758391861
commit da5bd01535
147 changed files with 8876 additions and 6941 deletions

View File

@@ -1,4 +1,7 @@
// Native fetch available in Node 20+
// @ts-nocheck
// 阿里云盘驱动 — 分享链接验证
// 依赖 aliyun-api.ts 统一端点模块 — URL 不再硬编码
import { ALIYUN_API_HOST, ALIYUN_WEB_HOST, EP as AE, getShareHeaders } from './aliyun-api';
export interface AliyunConfig {
cookie?: string;
@@ -7,7 +10,6 @@ export interface AliyunConfig {
export class AliyunDriver {
private config: AliyunConfig;
private baseUrl = 'https://api.aliyundrive.com';
constructor(config: AliyunConfig = {}) {
this.config = config;
@@ -38,13 +40,6 @@ export class AliyunDriver {
/**
* Validate a share link using Aliyun's public anonymous API.
* No cookie or token required — this endpoint is open.
*
* API:
* POST https://api.aliyundrive.com/v2/share_link/get_share_by_anonymous
* Body: { "share_id": "XXXYYY", "share_pwd": "" }
*
* Success: returns share_name, file_infos, creator info
* Failure: returns error code (ShareLinkExpired, ShareLinkCancelled, etc.)
*/
async validateShareLink(shareUrl: string): Promise<{
valid: boolean;
@@ -59,15 +54,10 @@ export class AliyunDriver {
try {
const response = await fetch(
`${this.baseUrl}/v2/share_link/get_share_by_anonymous`,
ALIYUN_API_HOST + AE.SHARE_GET_BY_ANONYMOUS,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
'Referer': 'https://www.aliyundrive.com/',
'Accept-Language': 'zh-CN,zh;q=0.9',
},
headers: getShareHeaders(),
body: JSON.stringify({
share_id: shareId,
share_pwd: '',
@@ -77,37 +67,42 @@ export class AliyunDriver {
);
if (!response.ok) {
return { valid: false, message: `HTTP ${response.status}: API 请求失败` };
return { valid: false, message: 'HTTP ' + response.status + ': API 请求失败' };
}
const data = await response.json() as any;
const data = await response.json();
// Check for error codes
if (data.code) {
switch (data.code) {
case 'ShareLinkExpired':
return { valid: false, message: '分享已失效(已过期)' };
case 'ShareLinkCancelled':
return { valid: false, message: '分享已被取消' };
case 'NotFound.ShareLink':
return { valid: false, message: '分享链接不存在' };
case 'ShareLinkPasswordIncorrect':
return { valid: true, message: '需要提取码(链接有效)' };
default:
return { valid: false, message: data.message || `未知错误 (${data.code})` };
}
const errorMessages: Record<string, string> = {
'ShareLinkExpired': '分享链接已过期',
'ShareLinkCancelled': '分享链接已取消',
'ShareLinkNotFound': '分享链接不存在',
'ForbiddenFileInTheDrive': '文件已被禁止访问',
'UserNotAuthenticated': '需要登录才能访问',
'InvalidResource.NotFound': '资源不存在',
};
return {
valid: false,
message: errorMessages[data.code] || data.message || 'API 返回错误: ' + data.code,
};
}
// Success — valid share link
const fileInfos = data.file_infos || [];
// 成功:提取分享信息
const fileCount = data.file_infos?.length || 0;
const shareName = data.share_name || data.display_name || '';
return {
valid: true,
message: `有效链接(${fileInfos.length} 个文件)`,
fileCount: fileInfos.length,
shareName: data.share_name || '',
message: '链接有效',
fileCount,
shareName,
};
} catch (err: any) {
return { valid: false, message: `网络错误: ${err.message || err}` };
} catch (err) {
return { valid: false, message: '网络错误: ' + (err instanceof Error ? err.message : String(err)) };
}
}
async getNickname(): Promise<string | null> {
return this.config.nickname || null;
}
}