diff --git a/parser/pom.xml b/parser/pom.xml
index 0a22b0b..b5791d1 100644
--- a/parser/pom.xml
+++ b/parser/pom.xml
@@ -59,12 +59,12 @@
UTF-8
- 4.5.22
+ 4.5.24
0.10.2
1.18.38
- 2.0.5
+ 2.0.16
3.18.0
- 2.14.2
+ 2.18.6
1.5.19
4.13.2
diff --git a/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java b/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java
index e35d048..042e1ec 100644
--- a/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java
+++ b/parser/src/main/java/cn/qaiu/parser/impl/PodTool.java
@@ -99,7 +99,8 @@ public class PodTool extends PanBase {
Matcher matcher1 =
Pattern.compile("\"downloadUrl\":\"(?https?://[^\s\"]+)").matcher(body);
if (matcher1.find()) {
- complete(matcher1.group("url"));
+ // 响应体是 JSON 文本,URL 中的 '&' 被转义为 \u0026,需要反转义
+ complete(unescapeJsonUnicode(matcher1.group("url")));
} else {
fail();
}
@@ -134,6 +135,34 @@ public class PodTool extends PanBase {
throw new RuntimeException("URL匹配失败");
}
+ /**
+ * 反转义 JSON 响应文本中残留的 Unicode 转义序列(主要是 \u0026 -> &)。
+ * 主分支通过正则直接从 JSON 原文抠 URL,未经过 JSON 解析器,需要手动还原。
+ */
+ private String unescapeJsonUnicode(String s) {
+ if (s == null || s.indexOf("\\u") < 0) {
+ return s;
+ }
+ StringBuilder sb = new StringBuilder(s.length());
+ int i = 0;
+ while (i < s.length()) {
+ char c = s.charAt(i);
+ if (c == '\\' && i + 5 < s.length() && s.charAt(i + 1) == 'u') {
+ try {
+ int cp = Integer.parseInt(s.substring(i + 2, i + 6), 16);
+ sb.append((char) cp);
+ i += 6;
+ continue;
+ } catch (NumberFormatException ignored) {
+ // 非法转义按原样保留
+ }
+ }
+ sb.append(c);
+ i++;
+ }
+ return sb.toString();
+ }
+
private String matcherToken(String html) {
// 正则表达式来匹配 inputElem.value 中的 Token
@@ -228,4 +257,4 @@ public class PodTool extends PanBase {
return promise.future();
}
-}
+}
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 6b51100..221b307 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,13 +26,13 @@
${project.basedir}/web-service/target/package
- 4.5.14
+ 4.5.24
0.10.2
1.18.38
2.0.16
3.18.0
2.0.0
- 2.18.2
+ 2.18.6
1.5.18
4.13.2