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
+ }
+ }
+}