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

@@ -160,6 +160,21 @@ public class ParserApi {
*/
@RouteMapping(value = "/view/:type/:key", method = RouteMethod.GET, order = 2)
public void view(HttpServerRequest request, HttpServerResponse response, String type, String key) {
// WPS 网盘类型特殊处理直接使用原分享链接WPS 支持在线预览)
if ("pwps".equalsIgnoreCase(type)) {
try {
// 重建原分享链接
ParserCreate parserCreate = ParserCreate.fromType(type).shareKey(key);
String originalUrl = parserCreate.getShareLinkInfo().getStandardUrl();
if (StringUtils.isNotBlank(originalUrl)) {
ResponseUtil.redirect(response, originalUrl);
return;
}
} catch (Exception e) {
log.warn("PWPS 预览链接构建失败: {}", e.getMessage());
}
}
String previewURL = SharedDataUtil.getJsonStringForServerConfig("previewURL");
serverApi.parseKeyJson(request, type, key).onSuccess(res -> {
redirect(response, previewURL, res);
@@ -178,6 +193,24 @@ public class ParserApi {
*/
@RouteMapping(value = "/preview", method = RouteMethod.GET, order = 9)
public void viewURL(HttpServerRequest request, HttpServerResponse response, String pwd) {
// WPS 网盘类型特殊处理直接使用原分享链接WPS 支持在线预览)
try {
String url = URLParamUtil.parserParams(request);
ParserCreate parserCreate = ParserCreate.fromShareUrl(url);
ShareLinkInfo shareLinkInfo = parserCreate.getShareLinkInfo();
// 如果是 PWPS 类型,直接重定向到原分享链接
if ("pwps".equalsIgnoreCase(shareLinkInfo.getType())) {
String originalUrl = shareLinkInfo.getStandardUrl();
if (StringUtils.isNotBlank(originalUrl)) {
ResponseUtil.redirect(response, originalUrl);
return;
}
}
} catch (Exception e) {
log.warn("解析预览链接失败: {}", e.getMessage());
}
String previewURL = SharedDataUtil.getJsonStringForServerConfig("previewURL");
new ServerApi().parseJson(request, pwd).onSuccess(res -> {
redirect(response, previewURL, res);