优化超星解析,清理冗余代码

This commit is contained in:
q
2026-02-04 17:09:01 +08:00
parent f6209a8959
commit 2056a91071
4 changed files with 129 additions and 178 deletions

View File

@@ -263,7 +263,7 @@ public enum PanDomainTemplate {
// https://pan-yz.cldisk.com/external/m/file/953658049102462976
Pcx("超星云盘(需要referer头)",
compile("https://pan-yz\\.cldisk\\.com/external/m/file/(?<KEY>\\w+)"),
compile("https://pan-yz\\.(chaoxing\\.com|cldisk\\.com)/external/m/file/(?<KEY>\\w+)(\\?.*)?"),
"https://pan-yz.cldisk.com/external/m/file/{shareKey}",
PcxTool.class),
// WPS分享格式https://www.kdocs.cn/l/ck0azivLlDi3 API格式https://www.kdocs.cn/api/office/file/{shareKey}/download

View File

@@ -1,11 +1,13 @@
package cn.qaiu.parser.impl;
import cn.qaiu.entity.FileInfo;
import cn.qaiu.entity.ShareLinkInfo;
import cn.qaiu.parser.PanBase;
import cn.qaiu.util.FileSizeConverter;
import io.vertx.core.Future;
import io.vertx.core.MultiMap;
import io.vertx.core.json.JsonObject;
import io.vertx.uritemplate.UriTemplate;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* <a href="https://passport2.chaoxing.com">超星云盘</a>
@@ -19,24 +21,135 @@ public class PcxTool extends PanBase {
public Future<String> parse() {
client.getAbs(shareLinkInfo.getShareUrl())
.send().onSuccess(res -> {
// 'download': 'https://d0.ananas.chaoxing.com/download/de08dcf546e4dd88a17bead86ff6338d?at_=1740211698795&ak_=d62a3acbd5ce43e1e8565b67990691e4&ad_=8c4ef22e980ee0dd9532ec3757ab19f8&fn=33.c'
String body = res.bodyAsString();
// 获取download
String str = "var fileinfo = {";
String fileInfo = res.bodyAsString().substring(res.bodyAsString().indexOf(str) + str.length() - 1
, res.bodyAsString().indexOf("};") + 1);
fileInfo = fileInfo.replace("'", "\"");
JsonObject jsonObject = new JsonObject(fileInfo);
String download = jsonObject.getString("download");
if (download.contains("fn=")) {
complete(download);
} else {
fail("获取下载链接失败: 不支持的文件类型: {}", jsonObject.getString("suffix"));
try {
// 提取文件信息
setFileInfo(body);
// 直接用正则提取download链接
String download = extractDownloadUrl(body);
if (download != null && download.contains("fn=")) {
complete(download);
} else {
fail("获取下载链接失败");
}
} catch (Exception e) {
fail("解析文件信息失败: {}", e.getMessage());
}
}).onFailure(handleFail(shareLinkInfo.getShareUrl()));
return promise.future();
}
/**
* 从HTML中提取download链接
*/
private String extractDownloadUrl(String html) {
// 匹配 'download': 'https://xxx' 或 "download": "https://xxx"
Pattern pattern = Pattern.compile("['\"]download['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
/**
* 从HTML中提取文件信息并设置到shareLinkInfo
*/
private void setFileInfo(String html) {
try {
FileInfo fileInfo = new FileInfo();
// 提取文件名:从<title>标签或文件名input
String fileName = extractByRegex(html, "<title>([^<]+)</title>");
if (fileName == null) {
fileName = extractByRegex(html, "<input id=\"filename\" type=\"hidden\" value=\"([^\"]+)\"");
}
// 提取文件大小:'filesize': 'xxx' 或 "filesize": "xxx"
String fileSizeStr = extractByRegex(html, "['\"]filesize['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
Long fileSize = null;
if (fileSizeStr != null) {
try {
fileSize = Long.parseLong(fileSizeStr);
} catch (NumberFormatException ignored) {}
}
// 提取文件类型/后缀:'suffix': 'xxx' 或 "suffix": "xxx"
String suffix = extractByRegex(html, "['\"]suffix['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 提取objectId文件ID'objectId': 'xxx' 或 "objectId": "xxx"
String objectId = extractByRegex(html, "['\"]objectId['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 提取创建者:'creator': 'xxx' 或 "creator": "xxx"
String creator = extractByRegex(html, "['\"]creator['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 提取上传时间:'uploadDate': timestamp
String uploadDate = extractByRegex(html, "['\"]uploadDate['\"]\\s*:\\s*(\\d+)");
// 提取缩略图:'thumbnail': 'xxx' 或 "thumbnail": "xxx"
String thumbnail = extractByRegex(html, "['\"]thumbnail['\"]\\s*:\\s*['\"]([^'\"]+)['\"]");
// 设置文件信息
if (fileName != null) {
fileInfo.setFileName(fileName);
}
if (fileSize != null) {
fileInfo.setSize(fileSize);
fileInfo.setSizeStr(FileSizeConverter.convertToReadableSize(fileSize));
}
if (suffix != null) {
fileInfo.setFileType(suffix);
}
if (objectId != null) {
fileInfo.setFileId(objectId);
}
if (creator != null) {
fileInfo.setCreateBy(creator);
}
if (uploadDate != null) {
try {
long timestamp = Long.parseLong(uploadDate);
// 转换为日期格式
java.time.Instant instant = java.time.Instant.ofEpochMilli(timestamp);
java.time.LocalDateTime dateTime = java.time.LocalDateTime.ofInstant(instant,
java.time.ZoneId.systemDefault());
fileInfo.setCreateTime(dateTime.format(
java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
} catch (NumberFormatException ignored) {}
}
if (thumbnail != null) {
fileInfo.setPreviewUrl(thumbnail);
}
fileInfo.setPanType(shareLinkInfo.getType());
// 将文件信息存储到shareLinkInfo的otherParam中
shareLinkInfo.getOtherParam().put("fileInfo", fileInfo);
} catch (Exception e) {
log.warn("提取文件信息失败: {}", e.getMessage());
}
}
/**
* 使用正则表达式提取内容
*/
private String extractByRegex(String text, String regex) {
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(text);
if (matcher.find()) {
return matcher.group(1);
}
return null;
}
// public static void main(String[] args) {
// String s = new PcxTool(ShareLinkInfo.newBuilder().shareUrl("https://pan-yz.cldisk.com/external/m/file/953658049102462976")