From ad9cfad5d96c41e1a862b06fba0de1adf2a40e36 Mon Sep 17 00:00:00 2001 From: mediabot-pt <295750538+mediabot-pt@users.noreply.github.com> Date: Wed, 1 Jul 2026 23:13:37 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20HttpUtils=E5=85=B1=E4=BA=AB=E7=B1=BB?= =?UTF-8?q?=EF=BC=8C=E6=B3=A8=E5=85=A5=E4=B8=BAhttp=E5=8F=98=E9=87=8F?= =?UTF-8?q?=EF=BC=8CPAR=E5=92=8Cmediabo=E4=B8=A4=E8=BE=B9=E7=BB=9F?= =?UTF-8?q?=E4=B8=80API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../par/core/adapter/GroovyScriptEngine.java | 1 + .../java/com/par/core/adapter/HttpUtils.java | 55 +++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 par-core/src/main/java/com/par/core/adapter/HttpUtils.java 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 30168c0..b1ae123 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 @@ -71,6 +71,7 @@ public class GroovyScriptEngine { binding.setVariable("jsoup", new JsoupHelper()); binding.setVariable("json", objectMapper); binding.setVariable("utils", new ScriptUtils()); + binding.setVariable("http", new HttpUtils()); GroovyShell shell = new GroovyShell(classLoader, binding); String fullScript = SCRIPT_PREFIX + groovyScript + "\n// PAR 调用入口\nreturn parse(content, url)"; diff --git a/par-core/src/main/java/com/par/core/adapter/HttpUtils.java b/par-core/src/main/java/com/par/core/adapter/HttpUtils.java new file mode 100644 index 0000000..75f30e7 --- /dev/null +++ b/par-core/src/main/java/com/par/core/adapter/HttpUtils.java @@ -0,0 +1,55 @@ +package com.par.core.adapter; + +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.time.Duration; + +/** + * HTTP 工具类,注入到 Groovy 脚本中(变量名 http)。 + * 提供 get/post 两个方法,PAR 和 mediabot 各注入自己的实现。 + * 脚本中使用:http.get(url, cookie) / http.post(url, body, auth) + */ +public class HttpUtils { + + private static final HttpClient client = HttpClient.newBuilder() + .connectTimeout(Duration.ofSeconds(10)) + .followRedirects(HttpClient.Redirect.NORMAL) + .build(); + + /** GET 请求 */ + public String get(String url, String cookie) { + try { + var builder = HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(15)) + .header("User-Agent", "PAR/1.0") + .GET(); + if (cookie != null && !cookie.isBlank()) builder.header("Cookie", cookie); + return client.send(builder.build(), HttpResponse.BodyHandlers.ofString()).body(); + } catch (Exception e) { + throw new RuntimeException("HTTP GET failed: " + url, e); + } + } + + /** POST JSON 请求 */ + public String post(String url, String body, String auth) { + try { + var builder = HttpRequest.newBuilder() + .uri(URI.create(url)) + .timeout(Duration.ofSeconds(15)) + .header("User-Agent", "PAR/1.0") + .header("Content-Type", "application/json"); + if (auth != null && !auth.isBlank()) { + if (auth.startsWith("Bearer") || auth.toLowerCase().startsWith("x-api-key")) + builder.header("Authorization", auth); + else builder.header("Cookie", auth); + } + builder.POST(HttpRequest.BodyPublishers.ofString(body != null ? body : "")); + return client.send(builder.build(), HttpResponse.BodyHandlers.ofString()).body(); + } catch (Exception e) { + throw new RuntimeException("HTTP POST failed: " + url, e); + } + } +}