From e0f3772275aa23811357c55e82e7fcb9f791aed2 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Thu, 9 Jul 2026 15:53:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20parse(content,pageKey)=E6=9B=BF?= =?UTF-8?q?=E4=BB=A3URL=E8=B7=AF=E7=94=B1=EF=BC=8C=E6=96=B0=E5=A2=9Eresolv?= =?UTF-8?q?ePageKey?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/api/controller/AdapterController.java | 33 +++++++++++++++++-- .../api/controller/SitePagesController.java | 2 +- .../par/core/adapter/GroovyScriptEngine.java | 12 ++++++- .../resources/scripts/default-nexusphp.groovy | 29 +++++++++------- 4 files changed, 61 insertions(+), 15 deletions(-) diff --git a/par-api/src/main/java/com/par/api/controller/AdapterController.java b/par-api/src/main/java/com/par/api/controller/AdapterController.java index ec43ebf..5f8ae70 100644 --- a/par-api/src/main/java/com/par/api/controller/AdapterController.java +++ b/par-api/src/main/java/com/par/api/controller/AdapterController.java @@ -27,6 +27,7 @@ public class AdapterController { private final AccessResultMapper accessResultMapper; private final CachedStorageService storageService; private final com.par.core.mapper.SiteMapper siteMapper; + private final com.par.core.service.SitePagesService sitePagesService; /** * 用指定适配配置解析指定访问结果 @@ -61,7 +62,8 @@ public class AdapterController { catch (Exception e) { return ApiResponse.error(500, "读取内容失败: " + e.getMessage()); } if (content == null) return ApiResponse.error(404, "内容为空"); - return ApiResponse.success(groovyEngine.execute(script, content, accessResult.getUrl())); + String pageKey = resolvePageKey(siteConfig.getSiteId(), accessResult.getUrl()); + return ApiResponse.success(groovyEngine.execute(script, content, accessResult.getUrl(), pageKey)); } /** @@ -135,7 +137,9 @@ public class AdapterController { if (content == null) { item.put("parsed", Map.of("matched", false, "message", "内容为空")); } else { - item.put("parsed", groovyEngine.execute(script, content, url)); + String pageKey = resolvePageKey(siteConfig.getSiteId(), url); + item.put("pageKey", pageKey); + item.put("parsed", groovyEngine.execute(script, content, url, pageKey)); } } } catch (Exception e) { @@ -156,4 +160,29 @@ public class AdapterController { } return null; } + + /** 根据页面配置的 URL 模板反查出 pageKey(如 sync/signIn/search) */ + @SuppressWarnings("unchecked") + private String resolvePageKey(String siteId, String url) { + if (url == null || url.isBlank()) return null; + try { + Map pages = sitePagesService.getPages(siteId); + Object entries = pages != null ? pages.get("entries") : null; + if (entries instanceof List) { + String path = url.replaceAll("^https?://[^/]+", "").replaceAll("\\?.*", ""); + for (Object e : (List) entries) { + if (e instanceof Map) { + Map entry = (Map) e; + String entryUrl = (String) entry.get("url"); + if (entryUrl == null) continue; + String entryPath = entryUrl.replaceAll("\\?.*", "").replaceAll("\\{.*?\\}", ""); + if (path.trim().equals(entryPath.trim()) || path.contains(entryPath)) { + return (String) entry.get("pageKey"); + } + } + } + } + } catch (Exception ignored) {} + return null; + } } diff --git a/par-api/src/main/java/com/par/api/controller/SitePagesController.java b/par-api/src/main/java/com/par/api/controller/SitePagesController.java index ddf2650..dd4f793 100644 --- a/par-api/src/main/java/com/par/api/controller/SitePagesController.java +++ b/par-api/src/main/java/com/par/api/controller/SitePagesController.java @@ -156,7 +156,7 @@ public class SitePagesController { // 3. 用 Groovy 脚本解析内容 try { - Map parsed = groovyEngine.execute(script, content, url); + Map parsed = groovyEngine.execute(script, content, url, pageKey); boolean matched = Boolean.TRUE.equals(parsed.get("matched")); result.put("parsed", parsed); result.put("matched", matched); diff --git a/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java b/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java index 7fb69d5..db915c8 100644 --- a/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java +++ b/par-core/src/main/java/com/par/core/adapter/GroovyScriptEngine.java @@ -127,19 +127,29 @@ public class GroovyScriptEngine { @SuppressWarnings("unchecked") public Map execute(String groovyScript, String content, String url) { + return execute(groovyScript, content, url, null); + } + + @SuppressWarnings("unchecked") + public Map execute(String groovyScript, String content, String url, String pageKey) { Map result = new LinkedHashMap<>(); result.put("engine", "groovy"); try { Binding binding = new Binding(); binding.setVariable("content", content); binding.setVariable("url", url); + binding.setVariable("pageKey", pageKey != null ? pageKey : ""); binding.setVariable("jsoup", new JsoupHelper()); binding.setVariable("json", objectMapper); binding.setVariable("utils", new ScriptUtils()); binding.setVariable("http", HttpUtils.INSTANCE); GroovyShell shell = new GroovyShell(classLoader, binding); - String fullScript = SCRIPT_PREFIX + groovyScript + "\n// PAR 调用入口\nreturn parse(content, url)"; + // 优先用 pageKey 路由,无则回退 url 路由 + String call = pageKey != null && !pageKey.isEmpty() + ? "return parse(content, pageKey)" + : "return parse(content, url)"; + String fullScript = SCRIPT_PREFIX + groovyScript + "\n// PAR 调用入口\n" + call; Object scriptResult = shell.evaluate(fullScript); return buildResult(result, scriptResult); diff --git a/par-core/src/main/resources/scripts/default-nexusphp.groovy b/par-core/src/main/resources/scripts/default-nexusphp.groovy index 9290aed..d1c26d2 100644 --- a/par-core/src/main/resources/scripts/default-nexusphp.groovy +++ b/par-core/src/main/resources/scripts/default-nexusphp.groovy @@ -1,18 +1,25 @@ // NexusPHP 站点默认脚本 // 适用: PThome / HDSky / HDFans / OurBits 等 -Map parse(String content, String url) { +Map parse(String content, String pageKey) { def doc = Jsoup.parse(content) - - if (url.contains('/torrents.php')) return parseSearch(doc) - if (url.contains('/details.php')) return parseDetail(doc) - if (url.contains('/attendance.php')) return parseSign(doc) - if (url.contains('/download.php')) return parseDownload(content) - if (url.contains('/index.php') && !url.contains('?')) return parseUserInfo(doc) - if (url.contains('/usercp.php')) return parseUserPanel(doc) - if (url.contains('/torrentrss.php') || url.contains('/rss')) return parseRss(content) - - return [pageName: '未知页面', message: "未配置: ${url}"] + switch (pageKey) { + case 'search': return parseSearch(doc) + case 'detail': return parseDetail(doc) + case 'signIn': return parseSign(doc) + case 'download': return parseDownload(content) + case 'sync': return parseUserInfo(doc) + case 'rss': return parseRss(content) + default: + // fallback: pageKey 未知时用 URL 兜底 + String u = url ?: '' + if (u.contains('/attendance.php')) return parseSign(doc) + if (u.contains('/download.php')) return parseDownload(content) + if (u.contains('/index.php') && !u.contains('?')) return parseUserInfo(doc) + if (u.contains('/usercp.php')) return parseUserPanel(doc) + if (u.contains('/torrentrss.php') || u.contains('/rss')) return parseRss(content) + return [pageName: '未知页面', message: "未配置: pageKey=${pageKey}"] + } } private Map parseDownload(String content) {