From cb9dbfcc6993b886b4f347465241197116443fc8 Mon Sep 17 00:00:00 2001 From: q Date: Sun, 1 Feb 2026 10:33:25 +0800 Subject: [PATCH] =?UTF-8?q?=E8=93=9D=E5=A5=8F=E4=BA=91=E8=A7=84=E5=88=99?= =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/qaiu/parser/PanDomainTemplate.java | 2 +- .../main/java/cn/qaiu/parser/impl/LzTool.java | 140 ++++++++++++------ 2 files changed, 94 insertions(+), 48 deletions(-) diff --git a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java index 13d3575..69ce2be 100644 --- a/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java +++ b/parser/src/main/java/cn/qaiu/parser/PanDomainTemplate.java @@ -104,7 +104,7 @@ public enum PanDomainTemplate { "lanzoug|" + "lanzoum" + ")\\.com/(.+/)?(?.+)"), - "https://lanzoux.com/{shareKey}", + "https://w1.lanzn.com/{shareKey}", LzTool.class), // https://www.feijix.com/s/ diff --git a/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java b/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java index fb9a229..ffbb204 100644 --- a/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java +++ b/parser/src/main/java/cn/qaiu/parser/impl/LzTool.java @@ -11,14 +11,12 @@ import io.vertx.core.Promise; import io.vertx.core.json.JsonObject; import io.vertx.ext.web.client.WebClient; import io.vertx.ext.web.client.WebClientSession; -import org.apache.commons.lang3.RegExUtils; import org.openjdk.nashorn.api.scripting.ScriptObjectMirror; import javax.script.ScriptException; import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.TreeMap; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -29,13 +27,14 @@ import java.util.regex.Pattern; */ public class LzTool extends PanBase { - public static final String SHARE_URL_PREFIX = "https://wwwwp.lanzoup.com"; + WebClientSession webClientSession = WebClientSession.create(clientNoRedirects); + + public static final String SHARE_URL_PREFIX = "https://w1.lanzn.com/"; MultiMap headers0 = HeaderUtils.parseHeaders(""" Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cache-Control: max-age=0 - Cookie: codelen=1; pc_ad1=1 DNT: 1 Priority: u=0, i Sec-CH-UA: "Chromium";v="140", "Not=A?Brand";v="24", "Microsoft Edge";v="140" @@ -63,53 +62,100 @@ public class LzTool extends PanBase { .putHeaders(headers0) .send().onSuccess(res -> { String html = asText(res); - try { - setFileInfo(html, shareLinkInfo); - } catch (Exception e) { - e.printStackTrace(); - } - // 匹配iframe - Pattern compile = Pattern.compile("src=\"(/fn\\?[a-zA-Z\\d_+/=]{16,})\""); - Matcher matcher = compile.matcher(html); - // 没有Iframe说明是加密分享, 匹配sign通过密码请求下载页面 - if (!matcher.find()) { - try { - String jsText = getJsByPwd(pwd, html, "document.getElementById('rpt')"); - ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, "down_p"); - getDownURL(sUrl, client, scriptObjectMirror); - } catch (Exception e) { - fail(e, "js引擎执行失败"); - } - } else { - // 没有密码 - String iframePath = matcher.group(1); - client.getAbs(SHARE_URL_PREFIX + iframePath).send().onSuccess(res2 -> { - String html2 = res2.bodyAsString(); + if (html.contains("var arg1='")) { + webClientSession = WebClientSession.create(clientNoRedirects); + setCookie(html); + webClientSession.getAbs(sUrl) + .putHeaders(headers0) + .send().onSuccess(res2 -> { + String html2 = asText(res2); + doParser(html2, pwd, sUrl); + }); - // 去TMD正则 - // Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'(\\w+)'").matcher(html2); - String jsText = getJsText(html2); - if (jsText == null) { - fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": js脚本匹配失败, 可能分享已失效"); - return; - } - try { - ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, null); - getDownURL(sUrl, client, scriptObjectMirror); - } catch (ScriptException | NoSuchMethodException e) { - fail(e, "js引擎执行失败"); - } - }).onFailure(handleFail(SHARE_URL_PREFIX)); + } else { + doParser(html, pwd, sUrl); } + }).onFailure(handleFail(sUrl)); return promise.future(); } + private void doParser(String html, String pwd, String sUrl) { + try { + setFileInfo(html, shareLinkInfo); + } catch (Exception e) { + e.printStackTrace(); + } + // 匹配iframe + Pattern compile = Pattern.compile("src=\"(/fn\\?[a-zA-Z\\d_+/=]{16,})\""); + Matcher matcher = compile.matcher(html); + // 没有Iframe说明是加密分享, 匹配sign通过密码请求下载页面 + if (!matcher.find()) { + try { + String jsText = getJsByPwd(pwd, html, "document.getElementById('rpt')"); + ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, "down_p"); + getDownURL(sUrl, scriptObjectMirror); + } catch (Exception e) { + fail(e, "js引擎执行失败"); + } + } + else { + // 没有密码 + String iframePath = matcher.group(1); + String absoluteURI = SHARE_URL_PREFIX + iframePath; + webClientSession.getAbs(absoluteURI).putHeaders(headers0).send().onSuccess(res2 -> { + String html2= asText(res2); + // Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'(\\w+)'").matcher(html2); + String jsText = getJsText(html2); + if (jsText == null) { + headers0.add("Referer", absoluteURI); + setCookie(html2); + webClientSession.getAbs(absoluteURI).send().onSuccess(res3 -> { + String html3= asText(res3); + String jsText3 = getJsText(html3); + if (jsText3 != null) { + try { + ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText3, null); + getDownURL(sUrl, scriptObjectMirror); + } catch (ScriptException | NoSuchMethodException e) { + fail(e, "引擎执行失败"); + } + } else { + + fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": 获取失败0, 可能分享已失效"); + return; + } + }); + } else { + try { + ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, null); + getDownURL(sUrl, scriptObjectMirror); + } catch (ScriptException | NoSuchMethodException e) { + fail(e, "js引擎执行失败"); + } + } + }).onFailure(handleFail(SHARE_URL_PREFIX)); + } + } + + private void setCookie(String html2) { + int beginIndex = html2.indexOf("arg1='") + 6; + String arg1 = html2.substring(beginIndex, html2.indexOf("';", beginIndex)); + String acw_sc__v2 = AcwScV2Generator.acwScV2Simple(arg1); + // 创建一个 Cookie 并放入 CookieStore + DefaultCookie nettyCookie = new DefaultCookie("acw_sc__v2", acw_sc__v2); + nettyCookie.setDomain(".lanzn.com"); // 设置域名 + nettyCookie.setPath("/"); // 设置路径 + nettyCookie.setSecure(false); + nettyCookie.setHttpOnly(false); + webClientSession.cookieStore().put(nettyCookie); + } + private String getJsByPwd(String pwd, String html, String subText) { String jsText = getJsText(html); if (jsText == null) { - throw new RuntimeException("js脚本匹配失败, 可能分享已失效"); + throw new RuntimeException("获取失败1, 可能分享已失效"); } jsText = jsText.replace("document.getElementById('pwd').value", "\"" + pwd + "\""); int i = jsText.indexOf(subText); @@ -131,7 +177,7 @@ public class LzTool extends PanBase { return html.substring(startPos, endPos).replaceAll("", ""); } - private void getDownURL(String key, WebClient client, Map obj) { + private void getDownURL(String key, Map obj) { if (obj == null) { fail("需要访问密码"); return; @@ -163,7 +209,7 @@ public class LzTool extends PanBase { headers.set("referer", key); // action=downprocess&signs=%3Fctdf&websignkey=I5gl&sign=BWMGOF1sBTRWXwI9BjZdYVA7BDhfNAIyUG9UawJtUGMIPlAhACkCa1UyUTAAYFxvUj5XY1E7UGFXaFVq&websign=&kd=1&ves=1 String url = SHARE_URL_PREFIX + url0; - client.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> { + webClientSession.postAbs(url).putHeaders(headers).sendForm(map).onSuccess(res2 -> { try { JsonObject urlJson = asJson(res2); String name = urlJson.getString("inf"); @@ -178,7 +224,6 @@ public class LzTool extends PanBase { String downUrl = urlJson.getString("dom") + "/file/" + urlJson.getString("url"); headers.remove("Referer"); - WebClientSession webClientSession = WebClientSession.create(client); webClientSession.getAbs(downUrl).putHeaders(headers).send() .onSuccess(res3 -> { String location = res3.headers().get("Location"); @@ -195,12 +240,13 @@ public class LzTool extends PanBase { nettyCookie.setPath("/"); // 设置路径 nettyCookie.setSecure(false); nettyCookie.setHttpOnly(false); - webClientSession.cookieStore().put(nettyCookie); - webClientSession.getAbs(downUrl).putHeaders(headers).send() + WebClientSession webClientSession2 = WebClientSession.create(clientNoRedirects); + webClientSession2.cookieStore().put(nettyCookie); + webClientSession2.getAbs(downUrl).putHeaders(headers).send() .onSuccess(res4 -> { String location0 = res4.headers().get("Location"); if (location0 == null) { - fail(downUrl + " -> 直链获取失败, 可能分享已失效"); + fail(downUrl + " -> 直链获取失败2, 可能分享已失效"); } else { setDateAndComplate(location0); }