From caad2795085ddc3f989fec4c6c1358b8d35a1496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BA=8E=E4=BF=8A?= <215613905@qq.com> Date: Tue, 18 Oct 2022 15:18:20 +0800 Subject: [PATCH] =?UTF-8?q?1=E5=85=BC=E5=AE=B9=E9=81=93=E9=95=BF=E6=9C=AC?= =?UTF-8?q?=E5=9C=B0js(drpy);js=E5=BC=95=E6=93=8E-req=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E8=AF=86=E5=88=ABContent-Type(=E5=AE=8C=E5=96=84);?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../github/tvbox/osc/util/js/JSEngine.java | 7 +- .../github/tvbox/osc/util/js/SpiderJS.java | 289 +++++++++--------- .../tvbox/osc/util/js/UTF8BOMFighter.java | 33 ++ 3 files changed, 185 insertions(+), 144 deletions(-) create mode 100644 app/src/main/java/com/github/tvbox/osc/util/js/UTF8BOMFighter.java diff --git a/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java b/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java index 3b42799d..a89a7378 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java +++ b/app/src/main/java/com/github/tvbox/osc/util/js/JSEngine.java @@ -258,9 +258,12 @@ public class JSEngine { } else if (returnBuffer == 2) { jsObject.setProperty("content", Base64.encodeToString(response.body().bytes(), Base64.DEFAULT)); } else { - String res=response.body().string(); + String res; if(headers.get("Content-Type")!=null && headers.get("Content-Type").contains("=")){ - res=new String(res.getBytes(),headers.get("Content-Type").split("=")[1].trim()); + byte[] responseBytes = UTF8BOMFighter.removeUTF8BOM(response.body().bytes()); + res=new String(responseBytes,headers.get("Content-Type").split("=")[1].trim()); + }else { + res=response.body().string(); } jsObject.setProperty("content", res); } diff --git a/app/src/main/java/com/github/tvbox/osc/util/js/SpiderJS.java b/app/src/main/java/com/github/tvbox/osc/util/js/SpiderJS.java index 69498c66..4524dcff 100644 --- a/app/src/main/java/com/github/tvbox/osc/util/js/SpiderJS.java +++ b/app/src/main/java/com/github/tvbox/osc/util/js/SpiderJS.java @@ -1,142 +1,147 @@ -package com.github.tvbox.osc.util.js; - -import android.content.Context; - -import com.github.catvod.crawler.Spider; -import com.github.tvbox.quickjs.JSArray; -import com.github.tvbox.quickjs.JSModule; -import com.github.tvbox.quickjs.JSObject; - -import java.util.HashMap; -import java.util.List; -import java.util.UUID; - -public class SpiderJS extends Spider { - - private String key; - private String js; - private String ext; - private JSObject jsObject = null; - private JSEngine.JSThread jsThread = null; - - public SpiderJS(String key, String js, String ext) { - this.key = key; - this.js = js; - this.ext = ext; - } - - void checkLoaderJS() { - if (jsThread == null) { - jsThread = JSEngine.getInstance().getJSThread(); - } - if (jsObject == null && jsThread != null) { - try { - jsThread.postVoid((ctx, globalThis) -> { - String moduleKey = "__" + UUID.randomUUID().toString().replace("-", "") + "__"; - String jsContent = JSEngine.getInstance().loadModule(js); - try { - if (js.contains(".js?")) { - int spIdx = js.indexOf(".js?"); - String[] query = js.substring(spIdx + 4).split("&|="); - js = js.substring(0, spIdx); - for (int i = 0; i < query.length; i += 2) { - String key = query[i]; - String val = query[i + 1]; - String sub = JSModule.convertModuleName(js, val); - String content = JSEngine.getInstance().loadModule(sub); - jsContent = jsContent.replace("__" + key.toUpperCase() + "__", content); - } - } - } catch (Exception e) { - e.printStackTrace(); - } - jsContent = jsContent.replace("export default {", "__JS_SPIDER__ ={"); - jsContent = jsContent.replace("__JS_SPIDER__", "globalThis." + moduleKey); - ctx.evaluateModule(jsContent, js); - jsObject = (JSObject) ctx.getProperty(globalThis, moduleKey); - jsObject.getJSFunction("init").call(ext); - return null; - }); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - } - - String postFunc(String func, Object... args) { - checkLoaderJS(); - if (jsObject != null) { - try { - return jsThread.post((ctx, globalThis) -> (String) jsObject.getJSFunction(func).call(args)); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - } - return ""; - } - - @Override - public void init(Context context, String extend) { - super.init(context, extend); - checkLoaderJS(); - } - - @Override - public String homeContent(boolean filter) { - return postFunc("home", filter); - } - - @Override - public String homeVideoContent() { - return postFunc("homeVod"); - } - - @Override - public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { - try { - JSObject obj = jsThread.post((ctx, globalThis) -> { - JSObject o = ctx.createNewJSObject(); - if (extend != null) { - for (String s : extend.keySet()) { - o.setProperty(s, extend.get(s)); - } - } - return o; - }); - return postFunc("category", tid, pg, filter, obj); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - return ""; - - } - - @Override - public String detailContent(List ids) { - return postFunc("detail", ids.get(0)); - } - - @Override - public String playerContent(String flag, String id, List vipFlags) { - try { - JSArray array = jsThread.post((ctx, globalThis) -> { - JSArray arr = ctx.createNewJSArray(); - if (vipFlags != null) { - for (int i = 0; i < vipFlags.size(); i++) { - arr.set(vipFlags.get(i), i); - } - } - return arr; - }); - return postFunc("play", flag, id, array); - } catch (Throwable throwable) { - throwable.printStackTrace(); - } - return ""; - } - - @Override - public String searchContent(String key, boolean quick) { - return postFunc("search", key, quick); - } -} +package com.github.tvbox.osc.util.js; + +import android.content.Context; + +import com.github.catvod.crawler.Spider; +import com.github.tvbox.quickjs.JSArray; +import com.github.tvbox.quickjs.JSModule; +import com.github.tvbox.quickjs.JSObject; + +import java.util.HashMap; +import java.util.List; +import java.util.UUID; + +public class SpiderJS extends Spider { + + private String key; + private String js; + private String ext; + private JSObject jsObject = null; + private JSEngine.JSThread jsThread = null; + + public SpiderJS(String key, String js, String ext) { + this.key = key; + this.js = js; + this.ext = ext; + } + + void checkLoaderJS() { + if (jsThread == null) { + jsThread = JSEngine.getInstance().getJSThread(); + } + if (jsObject == null && jsThread != null) { + try { + jsThread.postVoid((ctx, globalThis) -> { + String moduleKey = "__" + UUID.randomUUID().toString().replace("-", "") + "__"; + String jsContent = JSEngine.getInstance().loadModule(js); + try { + if (js.contains(".js?")) { + int spIdx = js.indexOf(".js?"); + String[] query = js.substring(spIdx + 4).split("&|="); + js = js.substring(0, spIdx); + for (int i = 0; i < query.length; i += 2) { + String key = query[i]; + String val = query[i + 1]; + String sub = JSModule.convertModuleName(js, val); + String content = JSEngine.getInstance().loadModule(sub); + jsContent = jsContent.replace("__" + key.toUpperCase() + "__", content); + } + } + } catch (Exception e) { + e.printStackTrace(); + } + if(jsContent.contains("export default{")){ + jsContent = jsContent.replace("export default{", "globalThis." + moduleKey+" ={"); + }else if(jsContent.contains("export default {")){ + jsContent = jsContent.replace("export default {", "globalThis." + moduleKey+" ={"); + }else { + jsContent = jsContent.replace("__JS_SPIDER__", "globalThis." + moduleKey); + } + ctx.evaluateModule(jsContent, js); + jsObject = (JSObject) ctx.getProperty(globalThis, moduleKey); + jsObject.getJSFunction("init").call(ext); + return null; + }); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + } + + String postFunc(String func, Object... args) { + checkLoaderJS(); + if (jsObject != null) { + try { + return jsThread.post((ctx, globalThis) -> (String) jsObject.getJSFunction(func).call(args)); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + } + return ""; + } + + @Override + public void init(Context context, String extend) { + super.init(context, extend); + checkLoaderJS(); + } + + @Override + public String homeContent(boolean filter) { + return postFunc("home", filter); + } + + @Override + public String homeVideoContent() { + return postFunc("homeVod"); + } + + @Override + public String categoryContent(String tid, String pg, boolean filter, HashMap extend) { + try { + JSObject obj = jsThread.post((ctx, globalThis) -> { + JSObject o = ctx.createNewJSObject(); + if (extend != null) { + for (String s : extend.keySet()) { + o.setProperty(s, extend.get(s)); + } + } + return o; + }); + return postFunc("category", tid, pg, filter, obj); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + return ""; + + } + + @Override + public String detailContent(List ids) { + return postFunc("detail", ids.get(0)); + } + + @Override + public String playerContent(String flag, String id, List vipFlags) { + try { + JSArray array = jsThread.post((ctx, globalThis) -> { + JSArray arr = ctx.createNewJSArray(); + if (vipFlags != null) { + for (int i = 0; i < vipFlags.size(); i++) { + arr.set(vipFlags.get(i), i); + } + } + return arr; + }); + return postFunc("play", flag, id, array); + } catch (Throwable throwable) { + throwable.printStackTrace(); + } + return ""; + } + + @Override + public String searchContent(String key, boolean quick) { + return postFunc("search", key, quick); + } +} diff --git a/app/src/main/java/com/github/tvbox/osc/util/js/UTF8BOMFighter.java b/app/src/main/java/com/github/tvbox/osc/util/js/UTF8BOMFighter.java new file mode 100644 index 00000000..0f9df407 --- /dev/null +++ b/app/src/main/java/com/github/tvbox/osc/util/js/UTF8BOMFighter.java @@ -0,0 +1,33 @@ +package com.github.tvbox.osc.util.js; + +public class UTF8BOMFighter { + private static final byte[] UTF8_BOM_BYTES = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}; + + private UTF8BOMFighter() { + } + + static public String removeUTF8BOM(String xmlText) { + byte[] bytes = xmlText.getBytes(); + boolean containsBOM = bytes.length > 3 + && bytes[0] == UTF8_BOM_BYTES[0] + && bytes[1] == UTF8_BOM_BYTES[1] + && bytes[2] == UTF8_BOM_BYTES[2]; + if (containsBOM) { + xmlText = new String(bytes, 3, bytes.length - 3); + } + return xmlText; + } + + static byte[] removeUTF8BOM(byte[] bytes) { + boolean containsBOM = bytes.length > 3 + && bytes[0] == UTF8_BOM_BYTES[0] + && bytes[1] == UTF8_BOM_BYTES[1] + && bytes[2] == UTF8_BOM_BYTES[2]; + if (containsBOM) { + byte[] copy = new byte[bytes.length - 3]; + System.arraycopy(bytes, 3, copy, 0, bytes.length - 3); + return copy; + } + return bytes; + } +}