UNPKG

picgo-plugin-alist

Version:

使用alist作为中转并实现对各个网盘的图床应用

1 lines 26.7 kB
{"version":3,"file":"index.cjs","sources":["../src/config.ts","../src/option.ts","../src/utils/str.ts","../src/handler.ts","../src/index.ts"],"sourcesContent":["import type { IPluginConfig, PicGo } from 'picgo'\nimport type { InternalConfig, UserConfig } from './types'\n\nexport const uploaderName = 'alist'\nexport const bedName = `picBed.${uploaderName}`\n\nexport function getConfig(ctx: PicGo): IPluginConfig[] {\n let userConfig: UserConfig = ctx.getConfig(bedName)\n if (!userConfig) {\n // throw new Error(\"Can't find uploader config\")\n userConfig = <any>{}\n }\n\n const config: IPluginConfig[] = [\n {\n name: 'version',\n type: 'input',\n default: userConfig.version ?? '',\n message: '你的alist版本,2或3',\n required: true,\n alias: 'alist版本',\n },\n {\n name: 'url',\n type: 'input',\n default: userConfig.url ?? '',\n message: '你的alist地址,如https://alist.example.com。',\n required: true,\n alias: 'alist地址',\n },\n {\n name: 'uploadPath',\n type: 'input',\n default: userConfig.uploadPath ?? '',\n message: '上传的相对路径,如assets。',\n required: true,\n alias: '上传路径',\n },\n {\n name: 'token',\n type: 'password',\n default: userConfig.token ?? '',\n message: '填写用户token,获取请参考alist文档。',\n required: false,\n alias: '用户token',\n },\n {\n name: 'username',\n type: 'input',\n default: userConfig.username ?? '',\n message: '填写用户名,与用户token二选一。',\n required: false,\n alias: '用户名',\n },\n {\n name: 'password',\n type: 'password',\n default: userConfig.password ?? '',\n message: '填写密码,与用户token二选一。',\n required: false,\n alias: '密码',\n },\n {\n name: 'accessPath',\n type: 'input',\n default: userConfig.accessPath ?? '',\n message: '若留空,则访问路径与上传路径一致。',\n required: false,\n alias: '访问路径',\n },\n {\n name: 'accessDomain',\n type: 'input',\n default: userConfig.accessDomain ?? '',\n message: '自定义访问域名,若留空,则与alist地址一致。',\n required: false,\n alias: '访问域名',\n },\n {\n name: 'accessFileNameTemplate',\n type: 'input',\n default: userConfig.accessFileNameTemplate ?? '',\n message: `用于alist会重映射文件名的情况,详见github页面。例:prefix_$\\{fileName\\}_suffix`,\n required: false,\n alias: '访问文件名模板',\n },\n ]\n return config\n}\n\ntype SetConfigOptions = SetConfigSetOptions | SetConfigAddOptions\n\ninterface SetBaseConfigOptions {\n save?: boolean\n action?: 'set' | 'add'\n internal?: boolean\n}\n\ninterface SetConfigSetOptions extends SetBaseConfigOptions {\n action: 'set'\n internal: false\n}\n\ninterface SetConfigAddOptions extends SetBaseConfigOptions {\n action: 'add'\n internal: boolean\n}\n\nconst defaultOptions: SetBaseConfigOptions = {\n save: false,\n}\n\nexport function setConfig(ctx: PicGo, configs: Record<string, any>, options?: SetConfigOptions): void {\n const originalConfig: UserConfig = ctx.getConfig(bedName)\n\n const { save, action, internal } = { ...defaultOptions, ...options }\n\n let newConfig: any\n if (action === 'set') {\n newConfig = { ...configs }\n }\n else if (action === 'add') {\n if (internal) {\n newConfig = { ...originalConfig, ...Object.fromEntries(\n Object.entries(configs).map(([key, value]) => [`sys_${key}`, value]),\n ) }\n }\n else {\n newConfig = { ...originalConfig, ...configs }\n }\n }\n\n if (save) {\n ctx.saveConfig({\n [bedName]: newConfig,\n })\n }\n else {\n ctx.setConfig({\n [bedName]: newConfig,\n })\n }\n}\n\nexport function setToken(ctx: PicGo, token: string, refreshedAt: number): void {\n setConfig(ctx, { token, tokenRefreshedAt: String(refreshedAt) }, { save: true, action: 'add', internal: true })\n}\n\nexport function getToken(ctx: PicGo) {\n const token: string = ctx.getConfig(`${bedName}.sys_token`)\n const refreshedAt: string = ctx.getConfig(`${bedName}.sys_tokenRefreshedAt`)\n return {\n token,\n refreshedAt: Number(refreshedAt),\n }\n}\n","import type { IReqOptions } from 'picgo'\nimport type { PostOptions, RefreshOptions } from './types'\nimport FormData from 'form-data'\n\nexport function getRefreshOptions(options: RefreshOptions): IReqOptions {\n const { url, token, uploadPath, version } = options\n if (version === 2) {\n const v2options: IReqOptions = {\n method: 'POST',\n url: `${url}/api/admin/refresh`,\n resolveWithFullResponse: true,\n headers: {\n 'User-Agent': 'PicGo',\n 'Authorization': token,\n },\n data: {\n path: `/${uploadPath}`,\n },\n }\n return v2options\n }\n else if (version === 3) {\n const v3options: IReqOptions = {\n method: 'POST',\n url: `${url}/api/fs/list`,\n resolveWithFullResponse: true,\n headers: {\n 'User-Agent': 'PicGo',\n 'Authorization': token,\n },\n data: {\n page: 1,\n password: '',\n path: `/${uploadPath}`,\n per_page: 0,\n refresh: true,\n },\n }\n return v3options\n }\n}\n\nexport function getPostOptions(options: PostOptions): IReqOptions {\n const { url, files, token, uploadPath, version, fileName } = options\n if (version === 2) {\n const formData = new FormData()\n formData.append('files', files, {\n filename: fileName,\n })\n formData.append('path', uploadPath)\n\n const v2options: IReqOptions = {\n method: 'POST',\n url: `${url}/api/public/upload`,\n resolveWithFullResponse: true,\n headers: {\n 'User-Agent': 'PicGo',\n 'Authorization': token,\n },\n data: formData,\n }\n return v2options\n }\n else if (version === 3) {\n const formData = new FormData()\n formData.append('file', files, {\n filename: fileName,\n })\n\n const v3options: IReqOptions = {\n method: 'PUT',\n url: `${url}/api/fs/form`,\n resolveWithFullResponse: true,\n headers: {\n 'User-Agent': 'PicGo',\n 'Authorization': token,\n 'file-path': encodeURIComponent(`/${uploadPath}/${fileName}`),\n },\n data: formData,\n }\n return v3options\n }\n}\n","export function rmEndSlashes(str: string) {\n return str?.replace(/\\/*\\\\*$/g, '')\n}\n\nexport function rmBeginSlashes(str: string) {\n return str?.replace(/^\\/*\\\\*/g, '')\n}\n\nexport function rmBothEndSlashes(str: string) {\n return rmBeginSlashes(rmEndSlashes(str))\n}\n","import type { IReqOptions, PicGo } from 'picgo'\nimport type { AlistResponse, UserConfig } from './types'\nimport { bedName, getToken, setToken } from './config'\nimport { getPostOptions, getRefreshOptions } from './option'\nimport { rmBothEndSlashes, rmEndSlashes } from './utils/index'\n\ntype IImageInfo = PicGo['output'][0]\n\nconst UPLOAD_AUTH_RETRY_LIMIT_TIMES = 1\n\ninterface SingleUploadOptions {\n url: string\n token: string\n uploadPath: string\n accessPath: string\n version: number\n accessDomain: string\n accessFileNameTemplate?: string\n authMode: 'token' | 'username-password'\n password?: string\n username?: string\n}\n\ninterface AccessFileNameTemplateVars {\n fileName: string\n}\n\nfunction parseAccessFileNameTemplate(template: string, vars: AccessFileNameTemplateVars): string {\n const fileNameParts = vars.fileName.split('.')\n const extension = fileNameParts.length > 1 ? `.${fileNameParts.pop()}` : ''\n const nameWithoutExt = fileNameParts.join('.')\n\n let result = template.replace(/\\$\\{fileName\\}/g, nameWithoutExt)\n\n if (extension) {\n result += extension\n }\n\n return result\n}\n\nfunction handleFileName(fileName: string) {\n const fileNameParts = fileName.split('/')\n return {\n fileName: fileNameParts[fileNameParts.length - 1],\n prefixPath: fileNameParts.slice(0, -1).join('/'),\n }\n}\n\nasync function handleSingleUpload(\n ctx: PicGo,\n image: IImageInfo,\n options: SingleUploadOptions,\n): Promise<void> {\n const { url, token: originalToken, uploadPath: originalUploadPath, accessPath: originalAccessPath, version, accessDomain, accessFileNameTemplate } = options\n\n const handledFileName = handleFileName(image.fileName)\n\n const fileName = handledFileName.fileName\n const uploadPath = handledFileName.prefixPath ? `${originalUploadPath}/${handledFileName.prefixPath}` : originalUploadPath\n const accessPath = handledFileName.prefixPath ? `${originalAccessPath}/${handledFileName.prefixPath}` : originalAccessPath\n const accessFileName = accessFileNameTemplate ? parseAccessFileNameTemplate(accessFileNameTemplate, { fileName }) : fileName\n\n ctx.log.info(`[信息] version:${version}, uploadPath:${uploadPath}, fileName:${fileName}`)\n\n ctx.log.info(`[开始上传] ${image.fileName}`)\n let retryTimes = 0\n let token = originalToken\n\n while (retryTimes <= UPLOAD_AUTH_RETRY_LIMIT_TIMES) {\n // 上传文件\n const postOptions = getPostOptions({\n url,\n token,\n uploadPath,\n files: image.buffer,\n version,\n fileName,\n })\n\n ctx.log.info(`[开始上传] ${image.fileName} 第${retryTimes + 1}次尝试`)\n const uploadRes = await ctx.request<AlistResponse, IReqOptions>(postOptions)\n const authFailed = uploadRes.status === 401 || (uploadRes.status === 200 && uploadRes.data.code === 401)\n // 处理401认证失败的情况\n if (authFailed && options.authMode === 'username-password' && retryTimes < UPLOAD_AUTH_RETRY_LIMIT_TIMES) {\n ctx.log.warn(`[认证失败] 正在尝试重新获取token (${retryTimes + 1}/${UPLOAD_AUTH_RETRY_LIMIT_TIMES})`)\n token = await getTokenByAuth(ctx, url, options.username, options.password, { forceRefresh: true })\n retryTimes++\n continue\n }\n\n if (uploadRes.status !== 200)\n throw new Error(`[上传失败] 文件: ${fileName} 结果: ${uploadRes.statusCode} ${uploadRes.statusText}`)\n\n if (!uploadRes.data || uploadRes.data.code !== 200)\n throw new Error(`[上传失败] 文件: ${fileName} 结果: ${JSON.stringify(uploadRes.data)}`)\n\n ctx.log.info(`[上传请求结果] ${JSON.stringify(uploadRes.data)}`)\n\n // 刷新目录\n const refreshOptions = getRefreshOptions({ url, uploadPath, version, token })\n const refreshRes = await ctx.request<AlistResponse, IReqOptions>(refreshOptions)\n\n if (refreshRes.status !== 200)\n throw new Error(`[刷新失败] ${refreshRes.statusCode} ${refreshRes.statusText}`)\n\n if (!refreshRes.data || refreshRes.data.code !== 200)\n throw new Error(`[刷新失败] ${JSON.stringify(refreshRes.data)}`)\n\n ctx.log.info(`[刷新请求结果] ${JSON.stringify({ code: refreshRes.data.code, message: refreshRes.data.message })}`)\n\n const targetImgUrl = `${accessDomain}/${accessPath}/${accessFileName}`\n\n image.imgUrl = targetImgUrl\n\n ctx.log.info(`[上传成功] ${image.fileName} -> ${targetImgUrl}`)\n\n delete image.base64Image\n delete image.buffer\n\n break\n }\n}\n\ninterface GetTokenByAuthOptions {\n forceRefresh?: boolean\n}\n\nasync function getTokenByAuth(ctx: PicGo, url: string, username: string, password: string, options?: GetTokenByAuthOptions) {\n const storedToken = getToken(ctx)\n if (!options?.forceRefresh && storedToken?.token && storedToken?.refreshedAt && storedToken?.refreshedAt > Date.now() - 1000 * 60 * 60 * 24 * 1) {\n ctx.log.info('[信息] 从缓存中获取token')\n return storedToken.token\n }\n\n const refreshedAt = Date.now()\n ctx.log.info('[信息] 尝试使用用户名和密码请求API获取token')\n const res = await ctx.request<AlistResponse, IReqOptions>({\n method: 'POST',\n url: `${url}/api/auth/login`,\n resolveWithFullResponse: true,\n data: {\n username,\n password,\n },\n })\n if (res.status !== 200 || !res.data || res.data.code !== 200) {\n throw new Error(`[获取token失败] 请检查用户名和密码是否正确。 请求结果: ${res.statusCode} ${res.statusText} ${JSON.stringify(res.data ?? {})}`)\n }\n\n const token: string = res.data.data.token\n setToken(ctx, token, refreshedAt)\n\n return token\n}\n\nexport async function handle(ctx: PicGo): Promise<PicGo> {\n const userConfig: UserConfig = ctx.getConfig(bedName)\n const url = rmEndSlashes(userConfig.url)\n const username = userConfig.username\n const password = userConfig.password\n\n if (!userConfig)\n throw new Error('找不到上传器配置')\n\n if (!userConfig.token && (!username || !password)) {\n throw new Error('请填写用户名和密码或者token')\n }\n\n let token: string\n const authMode = username && password ? 'username-password' : 'token'\n if (authMode === 'username-password') {\n ctx.log.info('[信息] 用户名与密码模式')\n token = await getTokenByAuth(ctx, url, username, password)\n }\n else {\n token = userConfig.token\n }\n\n const options: SingleUploadOptions = {\n url,\n token,\n uploadPath: rmBothEndSlashes(userConfig.uploadPath),\n accessPath: userConfig.accessPath\n ? rmBothEndSlashes(userConfig.accessPath)\n : `d/${rmBothEndSlashes(userConfig.uploadPath)}`,\n version: Number(userConfig.version),\n accessDomain: userConfig.accessDomain\n ? rmBothEndSlashes(userConfig.accessDomain)\n : rmBothEndSlashes(userConfig.url),\n accessFileNameTemplate: userConfig.accessFileNameTemplate,\n authMode,\n username,\n password,\n }\n\n const uploads = ctx.output.map(async (image) => {\n try {\n await handleSingleUpload(ctx, image, options)\n }\n catch (error) {\n ctx.log.error(error)\n ctx.emit('notification', {\n title: '上传失败',\n body: error.message,\n })\n }\n })\n\n await Promise.all(uploads)\n return ctx\n}\n","import type { PicGo } from 'picgo'\nimport { getConfig, uploaderName } from './config'\nimport { handle } from './handler'\n\nexport default (ctx: PicGo) => {\n const register = () => {\n ctx.helper.uploader.register(uploaderName, {\n handle,\n name: 'alist',\n config: getConfig,\n })\n }\n return {\n uploader: uploaderName,\n register,\n }\n}\n"],"names":["FormData"],"mappings":"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"}