feat: 添加 WPS 云文档/WPS 云盘解析支持 (closes #133)

- 新增 PwpsTool 解析器,支持 WPS 云文档直链获取
- 调用 WPS API: https://www.kdocs.cn/api/office/file/{shareKey}/download
- 前端添加 kdocs.cn 链接识别规则
- 前端预览功能优化:WPS 云文档直接使用原分享链接预览
- 后端预览接口特殊处理:判断 shareKey 以 pwps: 开头自动重定向
- 支持提取文件名和有效期信息
- 更新 README 文档,添加 WPS 云文档支持说明

Parser 模块设计:
- 遵循开放封闭原则,易于扩展新网盘
- 只需实现 IPanTool 接口和注册枚举即可
- 支持自定义域名解析和责任链模式

技术特性:
- 免登录获取下载直链
- 支持在线预览(利用 WPS 原生功能)
- 文件大小限制:10M(免费版)/2G(会员版)
- 初始空间:5G(免费版)
This commit is contained in:
q
2025-10-20 13:33:53 +08:00
parent abde7841ac
commit 4fc4ed8640
9 changed files with 295 additions and 3 deletions

View File

@@ -340,6 +340,11 @@
host: /migu\.cn/,
name: '咪咕音乐分享'
},
kdocs: {
reg: /https:\/\/www\.kdocs\.cn\/l\/.+/,
host: /www\.kdocs\.cn/,
name: 'WPS云文档'
},
other: {
reg: /https:\/\/([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*\.)+[a-zA-Z]{2,}\/s\/.+/,
host: /.*/,

View File

@@ -110,7 +110,7 @@
</div>
<div class="file-meta-row">
<span class="file-meta-label">文件预览</span>
<a :href="previewBaseUrl + encodeURIComponent(downloadUrl)" target="_blank" class="file-meta-link">点击预览</a>
<a :href="getPreviewLink()" target="_blank" class="file-meta-link">点击预览</a>
</div>
<div class="file-meta-row">
<span class="file-meta-label">文件名</span>{{ extractFileNameAndExt(downloadUrl).name }}
@@ -299,6 +299,18 @@ export default {
}
},
methods: {
// 生成预览链接WPS 云文档特殊处理)
getPreviewLink() {
// 判断 shareKey 是否以 pwps: 开头WPS 云文档)
const shareKey = this.parseResult?.data?.shareKey
if (shareKey && shareKey.startsWith('pwps:')) {
// WPS 云文档直接使用原始分享链接
return this.link
}
// 其他类型使用默认预览服务
return this.previewBaseUrl + encodeURIComponent(this.downloadUrl)
},
// 主题切换
handleThemeChange(isDark) {
this.isDarkMode = isDark

View File

@@ -20,7 +20,7 @@
</div>
<div class="file-meta-row">
<span class="file-meta-label">在线预览</span>
<a :href="previewBaseUrl + encodeURIComponent(downloadUrl)" target="_blank" class="preview-btn">点击在线预览</a>
<a :href="getPreviewLink()" target="_blank" class="preview-btn">点击在线预览</a>
</div>
</div>
</div>
@@ -42,11 +42,24 @@ export default {
error: '',
parseResult: {},
downloadUrl: '',
shareUrl: '', // 添加原始分享链接
fileTypeUtils,
previewBaseUrl
}
},
methods: {
// 生成预览链接WPS 云文档特殊处理)
getPreviewLink() {
// 判断 shareKey 是否以 pwps: 开头WPS 云文档)
const shareKey = this.parseResult?.data?.shareKey
if (shareKey && shareKey.startsWith('pwps:')) {
// WPS 云文档直接使用原始分享链接
return this.shareUrl
}
// 其他类型使用默认预览服务
return this.previewBaseUrl + encodeURIComponent(this.downloadUrl)
},
async fetchFile() {
const url = this.$route.query.url
if (!url) {
@@ -54,6 +67,7 @@ export default {
this.loading = false
return
}
this.shareUrl = url // 保存原始分享链接
try {
const res = await axios.get('/json/parser', { params: { url } })
this.parseResult = res.data