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