diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java b/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java index 11242cb..8b382ea 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/LzTool.java @@ -2,6 +2,7 @@ package cn.qaiu.lz.common.parser.impl; import cn.qaiu.lz.common.parser.IPanTool; import cn.qaiu.lz.common.parser.PanBase; +import cn.qaiu.lz.common.util.JsExecUtils; import cn.qaiu.vx.core.util.VertxHolder; import io.vertx.core.Future; import io.vertx.core.MultiMap; @@ -9,7 +10,10 @@ import io.vertx.core.Promise; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.WebClient; import io.vertx.ext.web.client.WebClientOptions; +import org.openjdk.nashorn.api.scripting.ScriptObjectMirror; +import javax.script.ScriptException; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -29,6 +33,42 @@ public class LzTool extends PanBase implements IPanTool { super(key, pwd); } + /* + var wsk_sign = 'c20230818'; + var aihidcms = 'Fn5L'; + var iucjdsd = ''; + var ws_sign = 'c20230818'; + var sasign = 'B2EBPw8_bBDVRWFdoAzMGOlI5ATwEbVFgV2NVZwVhATYILld0WjoAZQhoVDsEYlZjBm4BNgVoVGcHMQ_c_c'; + var ajaxdata = '?ctdf'; + $.ajax({ + type : 'post', + url : '/ajaxm.php', + //b data : { 'action':'downprocess','signs':ajaxdata,'sign':'w}, + data : { 'action':'downprocess','signs':ajaxdata,'sign':sasign,'websign':iucjdsd,'websignkey':aihidcms,'ves':1 }, + //b data : { 'action':'downprocess','signs':ajaxdata,'sign':'','websign':ws_sign,'websignkey':wsk_sign,'ves':1 }, + dataType : 'json', + success:function(msg){ + var date = msg; + if(date.zt == '1'){ + $("#tourl").html("电信下载联通下载普通下载"); + setTimeout('$("#outime").css("display","block");',1800000); + }else{ + $("#tourl").html("网页超时,请刷新"); + }; + + }, + error:function(){ + $("#tourl").html("获取失败,请刷新"); + } + + }); + */ + + /** + * 解析器 + * @return url String + */ + @SuppressWarnings("unchecked") public Future parse() { String sUrl = key.startsWith("https://") ? key : SHARE_URL_PREFIX + "/" + key; @@ -41,33 +81,59 @@ public class LzTool extends PanBase implements IPanTool { Matcher matcher = compile.matcher(html); if (!matcher.find()) { // 没有Iframe说明是加密分享, 匹配sign通过密码请求下载页面 - Pattern compile2 = Pattern.compile("sign=(\\w{16,})"); - Matcher matcher2 = compile2.matcher(html); - if (!matcher2.find()) { - fail(sUrl + ": sign正则匹配失败, 可能分享已失效"); + // 去TMD正则 + String jsText = getJsText(html); + try { + ScriptObjectMirror scriptMirror = JsExecUtils.executeDynamicJs(jsText, "down_p"); + System.out.println(scriptMirror); + + } catch (ScriptException | NoSuchMethodException e) { + fail(e, "js引擎执行失败"); return; } - String sign = matcher2.group(1); - getDownURL(promise, sUrl, client, sign); + +// getDownURL(promise, sUrl, client, sign); return; } String iframePath = matcher.group(1); client.getAbs(SHARE_URL_PREFIX + iframePath).send().onSuccess(res2 -> { String html2 = res2.bodyAsString(); - System.out.println(html); - Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'(\\w+)'").matcher(html2); - if (!matcher2.find()) { + + // 去TMD正则 + // Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'(\\w+)'").matcher(html2); + String jsText = getJsText(html2); + if (jsText == null) { fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": sign正则匹配失败, 可能分享已失效"); return; } - String sign = matcher2.group(1); - getDownURL(promise, sUrl, client, sign); + try { + ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, null); + getDownURL(promise, sUrl, client, (Map) scriptObjectMirror.get("data")); + } catch (ScriptException | NoSuchMethodException e) { + fail(e, "js引擎执行失败"); + } }).onFailure(handleFail(SHARE_URL_PREFIX)); }).onFailure(handleFail(sUrl)); return promise.future(); } - private void getDownURL(Promise promise, String key, WebClient client, String sign) { + private String getJsText(String html) { + String jsTagStart = ""; + int index = html.indexOf(jsTagStart); + if (index == -1) { + return null; + } + int startPos = index + jsTagStart.length(); + int endPos = html.indexOf(jsTagEnd, startPos); + return html.substring(startPos, endPos); + } + + private void getDownURL(Promise promise, String key, WebClient client, Map signMap) { + MultiMap map = MultiMap.caseInsensitiveMultiMap(); + signMap.forEach((k,v)->{ + map.set(k,v.toString()); + }); MultiMap headers = MultiMap.caseInsensitiveMultiMap(); var userAgent2 = "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, " + "like " + @@ -81,8 +147,7 @@ public class LzTool extends PanBase implements IPanTool { String url = SHARE_URL_PREFIX + "/ajaxm.php"; client.postAbs(url).putHeaders(headers).sendForm(MultiMap .caseInsensitiveMultiMap() - .set("action", "downprocess") - .set("sign", sign).set("p", pwd)).onSuccess(res2 -> { + .setAll(map)).onSuccess(res2 -> { JsonObject urlJson = res2.bodyAsJsonObject(); if (urlJson.getInteger("zt") != 1) { fail(urlJson.getString("inf")); diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java b/web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java index 9825488..51158e3 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/util/JsExecUtils.java @@ -1,5 +1,6 @@ package cn.qaiu.lz.common.util; +import org.apache.commons.lang3.StringUtils; import org.openjdk.nashorn.api.scripting.ScriptObjectMirror; import javax.script.Invocable; @@ -9,14 +10,21 @@ import javax.script.ScriptException; import java.io.FileReader; import java.io.IOException; import java.net.URL; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; /** * 执行Js脚本 + * * @author QAIU * @date 2023/7/29 17:35 */ public class JsExecUtils { - private static final String JS_PATH = "/js/ye123.js"; + private static final String JS_PATH = "js/ye123.js"; + private static final String LZ_JS_PATH = "js/lz.js"; + + private static final String RES_PATH; private static final Invocable inv; // 初始化脚本引擎 @@ -28,9 +36,9 @@ public class JsExecUtils { if (resource == null) { throw new RuntimeException("js resource path is null"); } - String path = resource.getPath(); - String reader = path + JS_PATH; - try (FileReader fReader = new FileReader(reader)){ + RES_PATH = resource.getPath(); + String reader = RES_PATH + JS_PATH; + try (FileReader fReader = new FileReader(reader)) { engine.eval(fReader); fReader.close(); inv = (Invocable) engine; @@ -42,8 +50,40 @@ public class JsExecUtils { /** * 调用js文件 */ - public static ScriptObjectMirror executeJs(String functionName, Object... args) throws ScriptException, NoSuchMethodException { - //调用js中的方法 + public static ScriptObjectMirror executeJs(String functionName, Object... args) throws ScriptException, + NoSuchMethodException { + //调用js中的函数 return (ScriptObjectMirror) inv.invokeFunction(functionName, args); } + + /** + * 调用执行蓝奏云js文件 + */ + public static ScriptObjectMirror executeDynamicJs(String jsText, String funName) throws ScriptException, + NoSuchMethodException { + ScriptEngineManager engineManager = new ScriptEngineManager(); + ScriptEngine engine = engineManager.getEngineByName("JavaScript"); // 得到脚本引擎 + try { + //获取文件所在的相对路径 + Path path; + try { + path = Paths.get(RES_PATH + LZ_JS_PATH); + } catch (RuntimeException ioe) { + path = Paths.get(RES_PATH.substring(1) + LZ_JS_PATH); + } + String jsContent = Files.readString(path) + "\n" + jsText; + engine.eval(jsContent); + Invocable inv = (Invocable) engine; + //调用js中的函数 + if (StringUtils.isNotEmpty(funName)) { + inv.invokeFunction(funName); + } + } catch (IOException e) { + throw new RuntimeException(e); + } + + return (ScriptObjectMirror) engine.get("signObj"); + } + + } diff --git a/web-service/src/main/resources/http-tools/pan-lz.http b/web-service/src/main/resources/http-tools/pan-lz.http index b02958d..b38905f 100644 --- a/web-service/src/main/resources/http-tools/pan-lz.http +++ b/web-service/src/main/resources/http-tools/pan-lz.http @@ -24,4 +24,13 @@ https://developer.lanzoug.com/file/?VDJbZVxtADFSWwY+U2YHa1FuU2tTYgBnBnUGZFNmWylS ### https://developer.lanzoug.com/file/?VTNVa1tqAjMFDAM7BDEAbAE+U2tfbgZhBnVbOQUwVCYEb1IoAToCNwQhVnRXLlcyVWAEdl9uVzkEbFYxVm5VeVVlVSxbNwJ4BWADeAQyAGgBNVN4X3oGbQZxW3sFP1Q8BGhSYAEDAj8ENlY9VzJXZ1U3BDFfMldlBDFWaVY9VXJVM1VxWzsCZwVlA2QEYAAwAWtTYF8wBiIGcVstBWRUZwQ0UjcBbwJ5BGJWNVcsV2RVOgQuX2NXZgQ2VjJWMlVhVWdVNlswAm8FagMxBGAANgE6UzdfYwZgBjFbbAU6VGwEZVIyAWQCZQRkVjZXMFdmVTcENV8uVy8EalYgVixVIVUmVWdbdAI/BTcDaARhADEBblNvXzQGPQY5W3sFLVQ8BGlSYAE6AmsEY1Y2VztXY1U/BDFfM1dnBDRWZFYkVXpVc1VkW2oCIQVuA2QEZgA5AW5TZl8wBjYGMFtkBWFUcwRxUnUBKwJrBGNWNlc7V2NVPwQxXzJXZQQzVmdWLFUhVTxVcls7AmcFYgNnBH4AMwFoU2RfLgY1BjVbawV3VGIEPA== +### 20230819新规则 +POST /ajaxm.php +# var wsk_sign = 'c20230818'; +# var aihidcms = 'J5Nh'; +# var iucjdsd = ''; +# var ws_sign = 'c20230818'; +# var sasign = 'AGZQbgk4UGEDCgo1ATEGOlY_aBTlSNVRiV2gEMlA1WmkBJ1R3AWFUMVY2VDsDZQE0Vj4CMgNsADdXZw_c_c'; +# var ajaxdata = '?ctdf'; +data : { 'action':'downprocess','signs':ajaxdata,'sign':sasign,'websign':iucjdsd,'websignkey':aihidcms,'ves':1 } diff --git a/web-service/src/main/resources/js/lz.js b/web-service/src/main/resources/js/lz.js new file mode 100644 index 0000000..af599ce --- /dev/null +++ b/web-service/src/main/resources/js/lz.js @@ -0,0 +1,40 @@ +/** + * 蓝奏云解析器js签名获取工具 + */ + +var signObj; + + +/* + var $,jQuery; + + $ = jQuery = function(){ + return new jQuery.fn.init(); + } + + jQuery.fn = jQuery.prototype = { + init:function(){ + return { + focus: function(a) { + + } + } + } + } + + jQuery.fn.init.prototype = jQuery.fn; + */ + +// 伪装ajax函数获取关键数据 +var $ = { + ajax: function(obj) { + signObj = obj + } +} +var document = { + getElementById: function (v) { + return { + value : v + } + } +}