Spaces:
Sleeping
Sleeping
| import { AxiosHeaders, AxiosInstance } from "axios"; // 导入 AxiosHeaders | |
| import { createAxiosInstance } from "../utils/axiosInstance"; | |
| import { ShareInfoResponse, FolderListResponse, SaveFileParams } from "../types/cloud"; | |
| import { injectable } from "inversify"; | |
| import { Request } from "express"; | |
| import UserSetting from "../models/UserSetting"; | |
| import { ICloudStorageService } from "@/types/services"; | |
| import { logger } from "../utils/logger"; | |
| interface Cloud115ListItem { | |
| cid: string; | |
| n: string; | |
| s: number; | |
| } | |
| interface Cloud115FolderItem { | |
| cid: string; | |
| n: string; | |
| ns: number; | |
| } | |
| () | |
| export class Cloud115Service implements ICloudStorageService { | |
| private api: AxiosInstance; | |
| private cookie: string = ""; | |
| constructor() { | |
| this.api = createAxiosInstance( | |
| "https://webapi.115.com", | |
| AxiosHeaders.from({ | |
| Host: "webapi.115.com", | |
| Connection: "keep-alive", | |
| xweb_xhr: "1", | |
| Origin: "", | |
| "Content-Type": "application/x-www-form-urlencoded", | |
| "User-Agent": | |
| "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 MicroMessenger/6.8.0(0x16080000) NetType/WIFI MiniProgramEnv/Mac MacWechat/WMPF MacWechat/3.8.9(0x13080910) XWEB/1227", | |
| Accept: "*/*", | |
| "Sec-Fetch-Site": "cross-site", | |
| "Sec-Fetch-Mode": "cors", | |
| "Sec-Fetch-Dest": "empty", | |
| Referer: "https://servicewechat.com/wx2c744c010a61b0fa/94/page-frame.html", | |
| "Accept-Encoding": "gzip, deflate, br", | |
| "Accept-Language": "zh-CN,zh;q=0.9", | |
| }) | |
| ); | |
| this.api.interceptors.request.use((config) => { | |
| config.headers.cookie = this.cookie; | |
| return config; | |
| }); | |
| } | |
| async setCookie(req: Request): Promise<void> { | |
| const userId = req.user?.userId; | |
| const userSetting = await UserSetting.findOne({ | |
| where: { userId }, | |
| }); | |
| if (userSetting && userSetting.dataValues.cloud115Cookie) { | |
| this.cookie = userSetting.dataValues.cloud115Cookie; | |
| } else { | |
| throw new Error("请先设置115网盘cookie"); | |
| } | |
| } | |
| async getShareInfo(shareCode: string, receiveCode = ""): Promise<ShareInfoResponse> { | |
| const response = await this.api.get("/share/snap", { | |
| params: { | |
| share_code: shareCode, | |
| receive_code: receiveCode, | |
| offset: 0, | |
| limit: 20, | |
| cid: "", | |
| }, | |
| }); | |
| if (response.data?.state && response.data.data?.list?.length > 0) { | |
| return { | |
| data: { | |
| list: response.data.data.list.map((item: Cloud115ListItem) => ({ | |
| fileId: item.cid, | |
| fileName: item.n, | |
| fileSize: item.s, | |
| })), | |
| }, | |
| }; | |
| } else { | |
| logger.error("未找到文件信息:", response.data); | |
| throw new Error("未找到文件信息"); | |
| } | |
| } | |
| async getFolderList(parentCid = "0"): Promise<FolderListResponse> { | |
| const response = await this.api.get("/files", { | |
| params: { | |
| aid: 1, | |
| cid: parentCid, | |
| o: "user_ptime", | |
| asc: 1, | |
| offset: 0, | |
| show_dir: 1, | |
| limit: 50, | |
| type: 0, | |
| format: "json", | |
| star: 0, | |
| suffix: "", | |
| natsort: 0, | |
| snap: 0, | |
| record_open_time: 1, | |
| fc_mix: 0, | |
| }, | |
| }); | |
| if (response.data?.state) { | |
| return { | |
| data: response.data.data | |
| .filter((item: Cloud115FolderItem) => item.cid && !!item.ns) | |
| .map((folder: Cloud115FolderItem) => ({ | |
| cid: folder.cid, | |
| name: folder.n, | |
| path: response.data.path, | |
| })), | |
| }; | |
| } else { | |
| logger.error("获取目录列表失败:", response.data.error); | |
| throw new Error("获取115pan目录列表失败:" + response.data.error); | |
| } | |
| } | |
| async saveSharedFile(params: SaveFileParams): Promise<{ message: string; data: unknown }> { | |
| const param = new URLSearchParams({ | |
| cid: params.folderId || "", | |
| share_code: params.shareCode || "", | |
| receive_code: params.receiveCode || "", | |
| file_id: params.fids?.[0] || "", | |
| }); | |
| const response = await this.api.post("/share/receive", param.toString()); | |
| logger.info("保存文件:", response.data); | |
| if (response.data.state) { | |
| return { | |
| message: response.data.error, | |
| data: response.data.data, | |
| }; | |
| } else { | |
| logger.error("保存文件失败:", response.data.error); | |
| throw new Error("保存115pan文件失败:" + response.data.error); | |
| } | |
| } | |
| } | |