From 71066ded98cf682b5ff02ba5d70b77b354e1e0ed Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Thu, 10 Aug 2023 14:54:45 +0800 Subject: [PATCH 1/7] =?UTF-8?q?core=E6=A1=86=E6=9E=B6=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/cn/qaiu/db/ddl/CreateTable.java | 4 +-- .../java/cn/qaiu/db/pool/JDBCPoolInit.java | 2 +- core/pom.xml | 3 +- .../src/main/java/cn/qaiu/vx/core/Deploy.java | 19 ++++++------ .../vx/core/annotaions/InterceptorConfig.java | 23 ++++++++++++++ .../handlerfactory/RouterHandlerFactory.java | 12 ++++---- .../cn/qaiu/vx/core/util/ConfigConstant.java | 4 ++- .../cn/qaiu/vx/core/util/ReflectionUtil.java | 30 +++++++++++++++---- .../cn/qaiu/vx/core/util/SharedDataUtil.java | 2 +- .../qaiu/vx/core/verticle/RouterVerticle.java | 1 - .../vx/core/verticle/ServiceVerticle.java | 4 +-- .../interceptorImpl/DefaultInterceptor.java | 7 +++-- .../cn/qaiu/lz/common/model/BaseModel.java | 23 ++++++++++++++ .../cn/qaiu/lz/common/model/FileInfo.java | 16 ++++++++++ .../cn/qaiu/lz/common/model/ParserInfo.java | 5 ++++ .../cn/qaiu/lz/common/util/JsExecUtils.java | 3 +- .../lz/common}/util/SnowflakeIdWorker.java | 28 +++-------------- web-service/src/main/resources/app-dev.yml | 10 +++---- .../vx/core/util/SnowflakeIdWorkerTest.java | 30 +++++++++++++++++++ 19 files changed, 161 insertions(+), 65 deletions(-) create mode 100644 core/src/main/java/cn/qaiu/vx/core/annotaions/InterceptorConfig.java create mode 100644 web-service/src/main/java/cn/qaiu/lz/common/model/BaseModel.java create mode 100644 web-service/src/main/java/cn/qaiu/lz/common/model/FileInfo.java create mode 100644 web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java rename {core/src/main/java/cn/qaiu/vx/core => web-service/src/main/java/cn/qaiu/lz/common}/util/SnowflakeIdWorker.java (89%) create mode 100644 web-service/src/test/java/cn/qaiu/vx/core/util/SnowflakeIdWorkerTest.java diff --git a/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java b/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java index 063ad69..a039ae7 100644 --- a/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java +++ b/core-database/src/main/java/cn/qaiu/db/ddl/CreateTable.java @@ -157,8 +157,8 @@ public class CreateTable { return sql.substring(0, sql.length() - 1) + ");\r\n"; } - public static void createTable(JDBCPool pool, String tableClassPath) { - Set> tableClassList = ReflectionUtil.getReflections(tableClassPath).getTypesAnnotatedWith(Table.class); + public static void createTable(JDBCPool pool) { + Set> tableClassList = ReflectionUtil.getReflections().getTypesAnnotatedWith(Table.class); if (tableClassList.isEmpty()) LOGGER.info("Table model class not fount"); tableClassList.forEach(clazz -> { String createTableSQL = getCreateTableSQL(clazz); diff --git a/core-database/src/main/java/cn/qaiu/db/pool/JDBCPoolInit.java b/core-database/src/main/java/cn/qaiu/db/pool/JDBCPoolInit.java index 3931192..23cca8c 100644 --- a/core-database/src/main/java/cn/qaiu/db/pool/JDBCPoolInit.java +++ b/core-database/src/main/java/cn/qaiu/db/pool/JDBCPoolInit.java @@ -92,7 +92,7 @@ public class JDBCPoolInit { private void poolInitExecute(Promise promise) { // 初始化连接池 pool = JDBCPool.pool(vertx, dbConfig); - CreateTable.createTable(pool, dbConfig.getString("tableClassPath")); + CreateTable.createTable(pool); promise.complete("init jdbc pool success"); } diff --git a/core/pom.xml b/core/pom.xml index cede9d9..9ff9aa4 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -20,6 +20,7 @@ 2.0.5 3.12.0 2.14.2 + 1.4.6 @@ -39,7 +40,7 @@ ch.qos.logback logback-classic - 1.4.6 + ${logback.version} org.slf4j diff --git a/core/src/main/java/cn/qaiu/vx/core/Deploy.java b/core/src/main/java/cn/qaiu/vx/core/Deploy.java index aea3e0e..7cac9c8 100644 --- a/core/src/main/java/cn/qaiu/vx/core/Deploy.java +++ b/core/src/main/java/cn/qaiu/vx/core/Deploy.java @@ -1,6 +1,5 @@ package cn.qaiu.vx.core; -import cn.qaiu.vx.core.util.ConfigConstant; import cn.qaiu.vx.core.util.ConfigUtil; import cn.qaiu.vx.core.util.VertxHolder; import cn.qaiu.vx.core.verticle.ReverseProxyVerticle; @@ -18,6 +17,8 @@ import java.util.Calendar; import java.util.Date; import java.util.concurrent.locks.LockSupport; +import static cn.qaiu.vx.core.util.ConfigConstant.*; + /** * vertx启动类 需要在主启动类完成回调 *
Create date 2021-05-07 10:26:54 @@ -108,10 +109,10 @@ public final class Deploy { private void deployVerticle() { tempVertx.close(); LOGGER.info("配置读取成功"); - customConfig = globalConfig.getJsonObject(ConfigConstant.CUSTOM); + customConfig = globalConfig.getJsonObject(CUSTOM); - JsonObject vertxConfig = globalConfig.getJsonObject(ConfigConstant.VERTX); - Integer vertxConfigELPS = vertxConfig.getInteger(ConfigConstant.EVENT_LOOP_POOL_SIZE); + JsonObject vertxConfig = globalConfig.getJsonObject(VERTX); + Integer vertxConfigELPS = vertxConfig.getInteger(EVENT_LOOP_POOL_SIZE); var vertxOptions = vertxConfigELPS == 0 ? new VertxOptions() : new VertxOptions(vertxConfig); @@ -122,10 +123,10 @@ public final class Deploy { VertxHolder.init(vertx); //配置保存在共享数据中 var sharedData = vertx.sharedData(); - LocalMap localMap = sharedData.getLocalMap(ConfigConstant.LOCAL); - localMap.put(ConfigConstant.GLOBAL_CONFIG, globalConfig); - localMap.put(ConfigConstant.CUSTOM_CONFIG, customConfig); - localMap.put(ConfigConstant.SERVER, globalConfig.getJsonObject(ConfigConstant.SERVER)); + LocalMap localMap = sharedData.getLocalMap(LOCAL); + localMap.put(GLOBAL_CONFIG, globalConfig); + localMap.put(CUSTOM_CONFIG, customConfig); + localMap.put(SERVER, globalConfig.getJsonObject(SERVER)); var future0 = vertx.createSharedWorkerExecutor("other-handle").executeBlocking(bch -> { handle.handle(globalConfig); bch.complete("other handle complete"); @@ -169,7 +170,7 @@ public final class Deploy { * @return Deployment Options */ private DeploymentOptions getWorkDeploymentOptions(String name) { - return getWorkDeploymentOptions(name, customConfig.getInteger(ConfigConstant.ASYNC_SERVICE_INSTANCES)); + return getWorkDeploymentOptions(name, customConfig.getInteger(ASYNC_SERVICE_INSTANCES)); } private DeploymentOptions getWorkDeploymentOptions(String name, int ins) { diff --git a/core/src/main/java/cn/qaiu/vx/core/annotaions/InterceptorConfig.java b/core/src/main/java/cn/qaiu/vx/core/annotaions/InterceptorConfig.java new file mode 100644 index 0000000..d158d46 --- /dev/null +++ b/core/src/main/java/cn/qaiu/vx/core/annotaions/InterceptorConfig.java @@ -0,0 +1,23 @@ +package cn.qaiu.vx.core.annotaions; + +import java.lang.annotation.*; + +/** + * 拦截器配置注解 + * 正则匹配拦截途径 + * + * @author QAIU + */ +@Documented +@Inherited +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +public @interface InterceptorConfig { + + String pattern() default ""; + + /** + * 注册顺序,数字越大越先注册 + */ + int order() default 0; +} diff --git a/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java b/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java index 3f3196e..49ded5a 100644 --- a/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java +++ b/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java @@ -6,6 +6,7 @@ import cn.qaiu.vx.core.annotaions.RouteMapping; import cn.qaiu.vx.core.annotaions.SockRouteMapper; import cn.qaiu.vx.core.base.BaseHttpApi; import cn.qaiu.vx.core.enums.MIMEType; +import cn.qaiu.vx.core.interceptor.Interceptor; import cn.qaiu.vx.core.model.JsonResult; import cn.qaiu.vx.core.util.*; import io.vertx.core.Future; @@ -62,10 +63,9 @@ public class RouterHandlerFactory implements BaseHttpApi { private final String gatewayPrefix; - public RouterHandlerFactory(String routerScanAddress, String gatewayPrefix) { - Objects.requireNonNull(routerScanAddress, "The router package address scan is empty."); + public RouterHandlerFactory(String gatewayPrefix) { Objects.requireNonNull(gatewayPrefix, "The gateway prefix is empty."); - reflections = ReflectionUtil.getReflections(routerScanAddress); + reflections = ReflectionUtil.getReflections(); this.gatewayPrefix = gatewayPrefix; } @@ -234,10 +234,8 @@ public class RouterHandlerFactory implements BaseHttpApi { private Handler getInterceptor() throws Throwable { // 配置拦截 Class interceptorClass = Class.forName(SharedDataUtil.getValueForCustomConfig("interceptorClassPath")); - Object handleInstance = ReflectionUtil.newWithNoParam(interceptorClass); - Method doHandle = interceptorClass.getMethod("doHandle"); - // 反射调用 - return CastUtil.cast(ReflectionUtil.invoke(doHandle, handleInstance)); + Interceptor handleInstance = (Interceptor)ReflectionUtil.newWithNoParam(interceptorClass); + return handleInstance.doHandle(); } /** diff --git a/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java b/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java index 7d84af5..656f7bd 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java @@ -3,11 +3,13 @@ package cn.qaiu.vx.core.util; public interface ConfigConstant { String CUSTOM = "custom"; String VERTX = "vertx"; - String EVENT_LOOP_POOL_SIZE = "eventLoopPoolSize"; String LOCAL = "local"; String SERVER = "server"; String GLOBAL_CONFIG = "globalConfig"; String CUSTOM_CONFIG = "customConfig"; String ASYNC_SERVICE_INSTANCES = "asyncServiceInstances"; + String IGNORES_REG="ignoresReg"; + + String BASE_LOCATIONS="baseLocations"; } diff --git a/core/src/main/java/cn/qaiu/vx/core/util/ReflectionUtil.java b/core/src/main/java/cn/qaiu/vx/core/util/ReflectionUtil.java index ff6a872..3178c54 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/ReflectionUtil.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/ReflectionUtil.java @@ -24,6 +24,8 @@ import java.net.URL; import java.text.ParseException; import java.util.*; +import static cn.qaiu.vx.core.util.ConfigConstant.BASE_LOCATIONS; + /** * 基于org.reflection和javassist的反射工具包 * 通过包扫描实现路由地址的注解映射 @@ -33,6 +35,16 @@ import java.util.*; */ public final class ReflectionUtil { + + /** + * 以默认配置的基础包路径获取反射器 + * + * @return Reflections object + */ + public static Reflections getReflections() { + return getReflections(SharedDataUtil.getStringForCustomConfig(BASE_LOCATIONS)); + } + /** * 获取反射器 * @@ -48,6 +60,7 @@ public final class ReflectionUtil { } else { packageAddressList = Collections.singletonList(packageAddress); } + return getReflections(packageAddressList); } @@ -70,10 +83,11 @@ public final class ReflectionUtil { // 发现注解api层 没有继承父类时 这里反射一直有问题(Scanner SubTypesScanner was not configured) // 因此这里需要手动配置各种Scanner扫描器 -- https://blog.csdn.net/qq_29499107/article/details/106889781 configurationBuilder.setScanners( - Scanners.SubTypes.filterResultsBy(s -> true), //允许getAllTypes获取所有Object的子类, 不设置为false则 getAllTypes 会报错.默认为true. + Scanners.SubTypes.filterResultsBy(s -> true), //允许getAllTypes获取所有Object的子类, 不设置为false则 getAllTypes + // 会报错.默认为true. new MethodParameterNamesScanner(), //设置方法参数名称 扫描器,否则调用getConstructorParamNames 会报错 Scanners.MethodsAnnotated, //设置方法注解 扫描器, 否则getConstructorsAnnotatedWith,getMethodsAnnotatedWith 会报错 - new MemberUsageScanner(), //设置 member 扫描器,否则 getMethodUsage 会报错, 不推荐使用,有可能会报错 Caused by: java.lang.ClassCastException: javassist.bytecode.InterfaceMethodrefInfo cannot be cast to javassist.bytecode.MethodrefInfo + new MemberUsageScanner(), //设置 member 扫描器,否则 getMethodUsage 会报错 Scanners.TypesAnnotated //设置类注解 扫描器 ,否则 getTypesAnnotatedWith 会报错 ); @@ -98,7 +112,8 @@ public final class ReflectionUtil { MethodInfo methodInfo = cm.getMethodInfo(); CtClass[] parameterTypes = cm.getParameterTypes(); CodeAttribute codeAttribute = methodInfo.getCodeAttribute(); - LocalVariableAttribute attr = (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); + LocalVariableAttribute attr = + (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag); boolean flag = true; boolean flag2 = cm.getModifiers() - 1 != AccessFlag.STATIC; @@ -110,7 +125,8 @@ public final class ReflectionUtil { continue; } flag = false; - paramMap.put(attr.variableName(j + (flag2 ? 1 : 0)), Pair.of(parameterAnnotations[j - k], parameterTypes[j - k])); + paramMap.put(attr.variableName(j + (flag2 ? 1 : 0)), Pair.of(parameterAnnotations[j - k], + parameterTypes[j - k])); } } catch (NotFoundException e) { e.printStackTrace(); @@ -214,7 +230,8 @@ public final class ReflectionUtil { if (ctClass.isPrimitive() || "java.util.Date".equals(ctClass.getName())) { return true; } - return ctClass.getName().matches("^java\\.lang\\.((Boolean)|(Character)|(Byte)|(Short)|(Integer)|(Long)|(Float)|(Double)|(String))$"); + return ctClass.getName().matches("^java\\.lang\\.((Boolean)|(Character)|(Byte)|(Short)|(Integer)|(Long)|" + + "(Float)|(Double)|(String))$"); } /** @@ -238,7 +255,8 @@ public final class ReflectionUtil { * @throws InstantiationException InstantiationException * @throws IllegalAccessException IllegalAccessException */ - public static T newWithNoParam(Class handler) throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + public static T newWithNoParam(Class handler) throws NoSuchMethodException, InvocationTargetException, + InstantiationException, IllegalAccessException { return handler.getConstructor().newInstance(); } diff --git a/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java b/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java index 4d59956..17690a1 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java @@ -36,7 +36,7 @@ public class SharedDataUtil { return getJsonConfig("customConfig").getJsonObject(key); } - public static String getJsonStringForCustomConfig(String key) { + public static String getStringForCustomConfig(String key) { return getJsonConfig("customConfig").getString(key); } diff --git a/core/src/main/java/cn/qaiu/vx/core/verticle/RouterVerticle.java b/core/src/main/java/cn/qaiu/vx/core/verticle/RouterVerticle.java index 607c7cc..5278ec1 100644 --- a/core/src/main/java/cn/qaiu/vx/core/verticle/RouterVerticle.java +++ b/core/src/main/java/cn/qaiu/vx/core/verticle/RouterVerticle.java @@ -23,7 +23,6 @@ public class RouterVerticle extends AbstractVerticle { private static final int port = SharedDataUtil.getValueForServerConfig("port"); private static final Router router = new RouterHandlerFactory( - SharedDataUtil.getJsonStringForCustomConfig("routerLocations"), SharedDataUtil.getJsonStringForServerConfig("contextPath")).createRouter(); private static final JsonObject globalConfig = SharedDataUtil.getJsonConfig("globalConfig"); diff --git a/core/src/main/java/cn/qaiu/vx/core/verticle/ServiceVerticle.java b/core/src/main/java/cn/qaiu/vx/core/verticle/ServiceVerticle.java index 148f0a3..8b2df50 100644 --- a/core/src/main/java/cn/qaiu/vx/core/verticle/ServiceVerticle.java +++ b/core/src/main/java/cn/qaiu/vx/core/verticle/ServiceVerticle.java @@ -3,7 +3,6 @@ package cn.qaiu.vx.core.verticle; import cn.qaiu.vx.core.annotaions.Service; import cn.qaiu.vx.core.base.BaseAsyncService; import cn.qaiu.vx.core.util.ReflectionUtil; -import cn.qaiu.vx.core.util.SharedDataUtil; import io.vertx.core.AbstractVerticle; import io.vertx.core.Promise; import io.vertx.serviceproxy.ServiceBinder; @@ -27,8 +26,7 @@ public class ServiceVerticle extends AbstractVerticle { private static final Set> handlers; static { - String handlerLocations = SharedDataUtil.getJsonStringForCustomConfig("handlerLocations"); - Reflections reflections = ReflectionUtil.getReflections(handlerLocations); + Reflections reflections = ReflectionUtil.getReflections(); handlers = reflections.getTypesAnnotatedWith(Service.class); } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java index 545f92e..cdc0a21 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/interceptorImpl/DefaultInterceptor.java @@ -7,6 +7,8 @@ import io.vertx.core.json.JsonArray; import io.vertx.ext.web.RoutingContext; import lombok.extern.slf4j.Slf4j; +import static cn.qaiu.vx.core.util.ConfigConstant.IGNORES_REG; + /** * 默认拦截器实现 * 校验用户是否合法
@@ -15,7 +17,8 @@ import lombok.extern.slf4j.Slf4j; @Slf4j public class DefaultInterceptor implements Interceptor, BaseHttpApi { - private final JsonArray ignores = SharedDataUtil.getJsonArrayForCustomConfig("ignoresReg"); + + protected final JsonArray ignores = SharedDataUtil.getJsonArrayForCustomConfig(IGNORES_REG); @Override public void beforeHandle(RoutingContext ctx) { @@ -23,7 +26,7 @@ public class DefaultInterceptor implements Interceptor, BaseHttpApi { } @Override - public void afterHandle(RoutingContext context) { + public void afterHandle(RoutingContext ctx) { } } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/model/BaseModel.java b/web-service/src/main/java/cn/qaiu/lz/common/model/BaseModel.java new file mode 100644 index 0000000..2047ff3 --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/common/model/BaseModel.java @@ -0,0 +1,23 @@ +package cn.qaiu.lz.common.model; + +import cn.qaiu.lz.common.util.SnowflakeIdWorker; +import lombok.Data; + +import java.util.Date; + +@Data +abstract public class BaseModel { + public static final long serialVersionUID = 1L; + + + private String id = String.valueOf(SnowflakeIdWorker.idWorker().nextId()); + + private String createBy; + + private Date createTime; + + private String updateBy; + + private Date updateTime; + +} diff --git a/web-service/src/main/java/cn/qaiu/lz/common/model/FileInfo.java b/web-service/src/main/java/cn/qaiu/lz/common/model/FileInfo.java new file mode 100644 index 0000000..0783cd9 --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/common/model/FileInfo.java @@ -0,0 +1,16 @@ +package cn.qaiu.lz.common.model; + +import io.vertx.core.MultiMap; + +public class FileInfo extends BaseModel { + + private String fileName; + + private String fileType; + + private Long fileSize; + + private String download; + + private MultiMap header; +} diff --git a/web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java b/web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java new file mode 100644 index 0000000..3aab398 --- /dev/null +++ b/web-service/src/main/java/cn/qaiu/lz/common/model/ParserInfo.java @@ -0,0 +1,5 @@ +package cn.qaiu.lz.common.model; + +public class ParserInfo { + +} 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 501598e..9825488 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 @@ -6,7 +6,6 @@ import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptException; -import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.net.URL; @@ -18,7 +17,7 @@ import java.net.URL; */ public class JsExecUtils { private static final String JS_PATH = "/js/ye123.js"; - private static Invocable inv; + private static final Invocable inv; // 初始化脚本引擎 static { diff --git a/core/src/main/java/cn/qaiu/vx/core/util/SnowflakeIdWorker.java b/web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java similarity index 89% rename from core/src/main/java/cn/qaiu/vx/core/util/SnowflakeIdWorker.java rename to web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java index 577e657..6f4b84a 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/SnowflakeIdWorker.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/util/SnowflakeIdWorker.java @@ -1,4 +1,4 @@ -package cn.qaiu.vx.core.util; +package cn.qaiu.lz.common.util; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; @@ -30,6 +30,8 @@ public class SnowflakeIdWorker { // ==============================Fields=========================================== + //开始时间截 (2021-01-01) + private static final long EPOCH = 1609459200000L; /** * 机器id所占的位数 */ @@ -133,9 +135,7 @@ public class SnowflakeIdWorker { //时间截向左移22位(5+5+12) long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; - //开始时间截 (2021-01-01) - long twepoch = 1609459200000L; - return ((timestamp - twepoch) << timestampLeftShift) // + return ((timestamp - EPOCH) << timestampLeftShift) // | (datacenterId << datacenterIdShift) // | (workerId << sequenceBits) // | sequence; @@ -220,24 +220,4 @@ public class SnowflakeIdWorker { } return snowflakeIdWorkerCluster; } - //==============================Test============================================= - - /** - * 测试 - */ - public static void main(String[] args) { - final SnowflakeIdWorker snowflakeIdWorkerCluster = idWorkerCluster(0, 1); - final SnowflakeIdWorker idWorker = idWorker(); - for (int i = 0; i < 100; i++) { - long id = idWorker.nextId(); - System.out.println(Long.toBinaryString(id)); - System.out.println(id); - System.out.println("------------"); - id = snowflakeIdWorkerCluster.nextId(); - System.out.println(Long.toBinaryString(id)); - System.out.println(id); - System.out.println("------------\n"); - } - - } } diff --git a/web-service/src/main/resources/app-dev.yml b/web-service/src/main/resources/app-dev.yml index 14959f7..724c077 100644 --- a/web-service/src/main/resources/app-dev.yml +++ b/web-service/src/main/resources/app-dev.yml @@ -19,19 +19,19 @@ custom: # 异步服务线程数 asyncServiceInstances: 4 # server路由(controller层)所在包路径 - routerLocations: cn.qaiu.lz.web.http + baseLocations: cn.qaiu.lz # 拦截器包路径 interceptorClassPath: cn.qaiu.lz.common.interceptorImpl.DefaultInterceptor - # server层包路径 - handlerLocations: cn.qaiu.lz.web.service - # 匹配规则 + # 拦截器匹配规则 ignoresReg: - .*/login$ - .*/test.*$ - # 实体类包路径匹配正则 + + # 参数注入的实体类包路径匹配正则 (防止同名类引发歧义) entityPackagesReg: - ^cn\.qaiu\.lz\.web\.model\..* + # 数据源配置 dataSource: provider_class: io.vertx.ext.jdbc.spi.impl.HikariCPDataSourceProvider diff --git a/web-service/src/test/java/cn/qaiu/vx/core/util/SnowflakeIdWorkerTest.java b/web-service/src/test/java/cn/qaiu/vx/core/util/SnowflakeIdWorkerTest.java new file mode 100644 index 0000000..347462c --- /dev/null +++ b/web-service/src/test/java/cn/qaiu/vx/core/util/SnowflakeIdWorkerTest.java @@ -0,0 +1,30 @@ +package cn.qaiu.vx.core.util; + +import cn.qaiu.lz.common.util.SnowflakeIdWorker; +import org.junit.Test; + +public class SnowflakeIdWorkerTest { + + @Test + public void idWorker() { + final SnowflakeIdWorker idWorker = SnowflakeIdWorker.idWorker(); + for (int i = 0; i < 100; i++) { + long id = idWorker.nextId(); + System.out.println(Long.toBinaryString(id)); + System.out.println(id); + System.out.println("------------"); + } + } + + @Test + public void idWorkerCluster() { + final SnowflakeIdWorker snowflakeIdWorkerCluster = SnowflakeIdWorker.idWorkerCluster(0, 1); + for (int i = 0; i < 100; i++) { + long id = snowflakeIdWorkerCluster.nextId(); + System.out.println(Long.toBinaryString(id)); + System.out.println(id); + System.out.println("------------\n"); + } + + } +} From 30cd2f5850b0321a647f7388e8fa02e8f0777016 Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Fri, 11 Aug 2023 15:28:37 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=A5=B6=E7=89=9B=E5=BF=AB=E4=BC=A0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8B=E8=BD=BDzip=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E5=88=86=E4=BA=AB#11,=20core=E6=A1=86=E6=9E=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/handlerfactory/RouterHandlerFactory.java | 4 ++++ .../java/cn/qaiu/vx/core/util/ConfigConstant.java | 3 ++- .../java/cn/qaiu/vx/core/util/SharedDataUtil.java | 4 ++-- .../java/cn/qaiu/lz/common/parser/IPanTool.java | 4 ++-- .../cn/qaiu/lz/common/parser/impl/CowTool.java | 14 ++++++++++++-- .../java/cn/qaiu/lz/common/parser/impl/LzTool.java | 2 ++ .../java/cn/qaiu/lz/common/util/CommonUtils.java | 10 +++++++--- .../main/java/cn/qaiu/lz/web/http/ServerApi.java | 2 +- .../qaiu/lz/web/service/impl/UserServiceImpl.java | 7 +++++++ web-service/src/main/resources/app-dev.yml | 2 ++ .../src/main/resources/http-tools/pan-cow.http | 13 ++++++------- .../src/main/resources/http-tools/test.http | 6 +++++- 12 files changed, 52 insertions(+), 19 deletions(-) diff --git a/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java b/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java index 49ded5a..27e1cbc 100644 --- a/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java +++ b/core/src/main/java/cn/qaiu/vx/core/handlerfactory/RouterHandlerFactory.java @@ -23,6 +23,7 @@ import io.vertx.ext.web.RoutingContext; import io.vertx.ext.web.handler.BodyHandler; import io.vertx.ext.web.handler.CorsHandler; import io.vertx.ext.web.handler.StaticHandler; +import io.vertx.ext.web.handler.TimeoutHandler; import io.vertx.ext.web.handler.sockjs.SockJSHandler; import io.vertx.ext.web.handler.sockjs.SockJSHandlerOptions; import javassist.CtClass; @@ -39,6 +40,7 @@ import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; +import static cn.qaiu.vx.core.util.ConfigConstant.ROUTE_TIME_OUT; import static io.vertx.core.http.HttpHeaders.*; /** @@ -173,6 +175,8 @@ public class RouterHandlerFactory implements BaseHttpApi { route.consumes(mineType); } + // 设置默认超时 + route.handler(TimeoutHandler.create(SharedDataUtil.getCustomConfig().getInteger(ROUTE_TIME_OUT))); // 先执行拦截方法, 再进入业务请求 route.handler(interceptor); route.handler(ctx -> handlerMethod(instance, method, ctx)).failureHandler(ctx -> { diff --git a/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java b/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java index 656f7bd..32465b6 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/ConfigConstant.java @@ -10,6 +10,7 @@ public interface ConfigConstant { String CUSTOM_CONFIG = "customConfig"; String ASYNC_SERVICE_INSTANCES = "asyncServiceInstances"; String IGNORES_REG="ignoresReg"; - String BASE_LOCATIONS="baseLocations"; + + String ROUTE_TIME_OUT="routeTimeOut"; } diff --git a/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java b/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java index 17690a1..5181e42 100644 --- a/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java +++ b/core/src/main/java/cn/qaiu/vx/core/util/SharedDataUtil.java @@ -32,8 +32,8 @@ public class SharedDataUtil { return (JsonObject) localMap.get(key); } - public static JsonObject getJsonObjectForCustomConfig(String key) { - return getJsonConfig("customConfig").getJsonObject(key); + public static JsonObject getCustomConfig() { + return getJsonConfig("customConfig"); } public static String getStringForCustomConfig(String key) { diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java b/web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java index aed5452..3361b05 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/parser/IPanTool.java @@ -23,7 +23,7 @@ public interface IPanTool { static IPanTool shareURLPrefixMatching(String url, String pwd) { - if (url.startsWith(CowTool.SHARE_URL_PREFIX)) { + if (url.contains(CowTool.LINK_KEY)) { return new CowTool(url, pwd); } else if (url.startsWith(EcTool.SHARE_URL_PREFIX)) { return new EcTool(url, pwd); @@ -35,7 +35,7 @@ public interface IPanTool { return new YeTool(url, pwd); } else if (url.startsWith(FjTool.SHARE_URL_PREFIX)) { return new FjTool(url, pwd); - } else if (url.contains("lanzou")) { + } else if (url.contains(LzTool.LINK_KEY)) { return new LzTool(url, pwd); } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java b/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java index 313b795..0e25640 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/parser/impl/CowTool.java @@ -18,6 +18,8 @@ public class CowTool extends PanBase implements IPanTool { private static final String API_REQUEST_URL = "https://cowtransfer.com/core/api/transfer/share"; public static final String SHARE_URL_PREFIX = "https://cowtransfer.com/s/"; + public static final String LINK_KEY = "cowtransfer.com/s/"; + public CowTool(String key, String pwd) { super(key, pwd); } @@ -30,8 +32,16 @@ public class CowTool extends PanBase implements IPanTool { if ("success".equals(resJson.getString("message")) && resJson.containsKey("data")) { JsonObject dataJson = resJson.getJsonObject("data"); String guid = dataJson.getString("guid"); - String fileId = dataJson.getJsonObject("firstFile").getString("id"); - String url2 = API_REQUEST_URL + "/download?transferGuid=" + guid + "&fileId=" + fileId; + StringBuilder url2Build = new StringBuilder(API_REQUEST_URL + "/download?transferGuid=" + guid); + if (dataJson.getBoolean("zipDownload")) { + // &title=xxx + JsonObject firstFolder = dataJson.getJsonObject("firstFolder"); + url2Build.append("&title=").append(firstFolder.getString("title")); + } else { + String fileId = dataJson.getJsonObject("firstFile").getString("id"); + url2Build.append("&fileId=").append(fileId); + } + String url2 = url2Build.toString(); client.getAbs(url2).send().onSuccess(res2 -> { JsonObject res2Json = res2.bodyAsJsonObject(); if ("success".equals(res2Json.getString("message")) && res2Json.containsKey("data")) { 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 e5b999f..11242cb 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 @@ -23,6 +23,8 @@ public class LzTool extends PanBase implements IPanTool { public static final String SHARE_URL_PREFIX = "https://wwwa.lanzoui.com"; + public static final String LINK_KEY = "lanzou"; + public LzTool(String key, String pwd) { super(key, pwd); } diff --git a/web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java b/web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java index 4757a9c..b0f5038 100644 --- a/web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java +++ b/web-service/src/main/java/cn/qaiu/lz/common/util/CommonUtils.java @@ -8,12 +8,16 @@ import java.util.Map; public class CommonUtils { public static String adaptShortPaths(String urlPrefix, String url) { - if (!url.startsWith(urlPrefix)) { - url = urlPrefix + url; - } if (url.endsWith(".html")) { url = url.substring(0, url.length() - 5); } + String prefix = "https://"; + if (!url.startsWith(urlPrefix) && url.startsWith(prefix)) { + urlPrefix = urlPrefix.substring(prefix.length()); + return url.substring(url.indexOf(urlPrefix) + urlPrefix.length()); + } else if (!url.startsWith(urlPrefix)) { + url = urlPrefix + url; + } return url.substring(urlPrefix.length()); } diff --git a/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java b/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java index 774610e..d65f503 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/http/ServerApi.java @@ -1,7 +1,7 @@ package cn.qaiu.lz.web.http; import cn.qaiu.lz.common.parser.IPanTool; -import cn.qaiu.lz.common.parser.impl.*; +import cn.qaiu.lz.common.parser.impl.EcTool; import cn.qaiu.lz.web.model.SysUser; import cn.qaiu.lz.web.service.UserService; import cn.qaiu.vx.core.annotaions.RouteHandler; diff --git a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java index 5de4ff3..1841eed 100644 --- a/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java +++ b/web-service/src/main/java/cn/qaiu/lz/web/service/impl/UserServiceImpl.java @@ -5,6 +5,8 @@ import cn.qaiu.lz.web.service.UserService; import cn.qaiu.vx.core.annotaions.Service; import io.vertx.core.Future; +import java.util.concurrent.TimeUnit; + /** * lz-web *
Create date 2021/8/27 14:09 @@ -17,6 +19,11 @@ public class UserServiceImpl implements UserService { @Override public Future login(SysUser user) { + try { + TimeUnit.SECONDS.sleep(6); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } return Future.succeededFuture("111"); } } diff --git a/web-service/src/main/resources/app-dev.yml b/web-service/src/main/resources/app-dev.yml index 724c077..a232568 100644 --- a/web-service/src/main/resources/app-dev.yml +++ b/web-service/src/main/resources/app-dev.yml @@ -20,6 +20,8 @@ custom: asyncServiceInstances: 4 # server路由(controller层)所在包路径 baseLocations: cn.qaiu.lz + # 路由处理默认超时时间(毫秒) + routeTimeOut: 15000 # 拦截器包路径 interceptorClassPath: cn.qaiu.lz.common.interceptorImpl.DefaultInterceptor # 拦截器匹配规则 diff --git a/web-service/src/main/resources/http-tools/pan-cow.http b/web-service/src/main/resources/http-tools/pan-cow.http index eefca4f..412dd6f 100644 --- a/web-service/src/main/resources/http-tools/pan-cow.http +++ b/web-service/src/main/resources/http-tools/pan-cow.http @@ -46,15 +46,14 @@ Content-Disposition: form-data; name="email" --WebAppBoundary Content-Disposition: form-data; name="joinProToken" - --WebAppBoundary-- +### +https://cowtransfer.com/core/api/transfer/share/download?transferGuid=eb9df924-7b29-496b-8147-96762fc81d28&title=spring-play ### -git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch web-service/src/main/resources/http-tools/test.http' --prune-empty --tag-name-filter cat -- --all -git push origin master --force -rmdir .git/refs/original/ -git reflog expire --expire=now --all -git gc --prune=now -git gc --aggressive --prune=now +https://cowtransfer.com/core/api/transfer/share/download?transferGuid= + +### +https://cowtransfer.com/core/api/transfer/share/download?transferGuid=eb9df924-7b29-496b-8147-96762fc81d28 diff --git a/web-service/src/main/resources/http-tools/test.http b/web-service/src/main/resources/http-tools/test.http index e0e8532..c2ddd74 100644 --- a/web-service/src/main/resources/http-tools/test.http +++ b/web-service/src/main/resources/http-tools/test.http @@ -28,6 +28,10 @@ GET http://127.0.0.1:6400/cow/e4f41b51b5da4f # @no-redirect GET http://127.0.0.1:6400/parser?url=https://cowtransfer.com/s/9a644fe3e3a748 +### 奶牛 +# @no-redirect +GET http://127.0.0.1:6400/parser?url=https://goldrepo.cowtransfer.com/s/026a638795634b + ### 移动云空间 https://www.ecpan.cn/web/#/yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1 # @no-redirect GET http://127.0.0.1:6400/parser?url=https://www.ecpan.cn/web//yunpanProxy?path=%2F%23%2Fdrive%2Foutside&data=81027a5c99af5b11ca004966c945cce6W9Bf2&isShare=1 @@ -94,6 +98,6 @@ GET http://127.0.0.1:6400/ye/iaKtVv-qOECd GET http://127.0.0.1:6400/parser?url=https://www.123pan.com/s/iaKtVv-6OECd.html&pwd=DcGe ### -POST http://127.0.0.1:6400/login1 +POST http://127.0.0.1:6400/login From cde641c8db2b8477556b30ef5b66f930694b7972 Mon Sep 17 00:00:00 2001 From: qaiu <736226400@qq.com> Date: Sun, 13 Aug 2023 00:54:21 +0800 Subject: [PATCH 3/7] Update README.md --- README.md | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 8409ace..d4739ea 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# netdisk-fast-download +# netdisk-fast-download云盘解析服务(nfd云解析) 预览地址 https://lz.qaiu.top [![Java CI with Maven](https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml/badge.svg)](https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml) @@ -6,6 +6,15 @@ [![vert.x](https://img.shields.io/badge/vert.x-4.4.1-blue)](https://vertx-china.github.io/) [![GitHub release (latest by date)](https://img.shields.io/github/v/release/qaiu/netdisk-fast-download)](https://github.com/qaiu/netdisk-fast-download/releases/tag/0.1.6-releases) +## 项目介绍 +网盘直链解析工具能把网盘分享下载链接转化为直链,支持天翼189云盘和360网盘,支持私密分享。 + +## 应用场景: +1. 游戏:使用本站工具可自动生成高速直流下载器,用于游戏客户端自动化高速下载安装、更新等。(需本站下载器配合试用) +2. 下载:可根据网盘分享的地址解析为直链,方便放到自己网站上供用户下载,节约服务器带宽和磁盘。 +3. 音视频:可解析为音视频直链,可直接在网页上播放,高清,高速,节约服务器带宽和磁盘。 +4. 图床:可支持图床。 + ## 网盘支持情况: > 20230722 UC网盘解析失效,需要登录 From 3ee113e81f24b8e8a7edb3baa1179e02bd0862df Mon Sep 17 00:00:00 2001 From: qaiu <736226400@qq.com> Date: Sun, 13 Aug 2023 00:55:20 +0800 Subject: [PATCH 4/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index d4739ea..c05de9a 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ 网盘直链解析工具能把网盘分享下载链接转化为直链,支持天翼189云盘和360网盘,支持私密分享。 ## 应用场景: -1. 游戏:使用本站工具可自动生成高速直流下载器,用于游戏客户端自动化高速下载安装、更新等。(需本站下载器配合试用) +1. 游戏:使用本站工具可自动生成高速直流下载器,用于游戏客户端自动化高速下载安装、更新等。 2. 下载:可根据网盘分享的地址解析为直链,方便放到自己网站上供用户下载,节约服务器带宽和磁盘。 3. 音视频:可解析为音视频直链,可直接在网页上播放,高清,高速,节约服务器带宽和磁盘。 4. 图床:可支持图床。 From 8397c24715e51dcc353bd86ddde1909cc64f965d Mon Sep 17 00:00:00 2001 From: qaiu <736226400@qq.com> Date: Sun, 13 Aug 2023 00:58:12 +0800 Subject: [PATCH 5/7] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index c05de9a..715e5ef 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -# netdisk-fast-download云盘解析服务(nfd云解析) +# netdisk-fast-download +云盘解析服务 (nfd云解析) 预览地址 https://lz.qaiu.top [![Java CI with Maven](https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml/badge.svg)](https://github.com/qaiu/netdisk-fast-download/actions/workflows/maven.yml) @@ -7,7 +8,7 @@ [![GitHub release (latest by date)](https://img.shields.io/github/v/release/qaiu/netdisk-fast-download)](https://github.com/qaiu/netdisk-fast-download/releases/tag/0.1.6-releases) ## 项目介绍 -网盘直链解析工具能把网盘分享下载链接转化为直链,支持天翼189云盘和360网盘,支持私密分享。 +网盘直链解析工具能把网盘分享下载链接转化为直链,已支持蓝奏云/奶牛快传/移动云云空间/小飞机盘/亿方云/123云盘等,支持私密分享。 ## 应用场景: 1. 游戏:使用本站工具可自动生成高速直流下载器,用于游戏客户端自动化高速下载安装、更新等。 From 00b30331eb5b719c288358429bd71340abee53e1 Mon Sep 17 00:00:00 2001 From: QAIU <736226400@qq.com> Date: Sat, 19 Aug 2023 17:28:30 +0800 Subject: [PATCH 6/7] =?UTF-8?q?=E5=A5=B6=E7=89=9B=E5=BF=AB=E4=BC=A0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8B=E8=BD=BDzip=E7=9B=AE=E5=BD=95?= =?UTF-8?q?=E5=88=86=E4=BA=AB#11,=20core=E6=A1=86=E6=9E=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/qaiu/lz/common/parser/impl/LzTool.java | 93 ++++++++++++++++--- .../cn/qaiu/lz/common/util/JsExecUtils.java | 52 +++++++++-- .../src/main/resources/http-tools/pan-lz.http | 9 ++ web-service/src/main/resources/js/lz.js | 40 ++++++++ 4 files changed, 174 insertions(+), 20 deletions(-) create mode 100644 web-service/src/main/resources/js/lz.js 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 + } + } +} From 3c56a7183e92fb0de34041379ca45bad025fde92 Mon Sep 17 00:00:00 2001 From: qaiu <736226400@qq.com> Date: Sun, 20 Aug 2023 10:29:00 +0800 Subject: [PATCH 7/7] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=93=9D=E5=A5=8F?= =?UTF-8?q?=E4=BA=91pan=E8=A7=A3=E6=9E=90=E9=94=99=E8=AF=AF=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98#12?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cn/qaiu/lz/common/parser/impl/LzTool.java | 28 +++++---- web-service/src/main/resources/js/lz.js | 58 ++++++++++--------- 2 files changed, 49 insertions(+), 37 deletions(-) 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 8b382ea..02aea52 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 @@ -65,7 +65,8 @@ public class LzTool extends PanBase implements IPanTool { */ /** - * 解析器 + * 蓝奏云解析器 + * * @return url String */ @SuppressWarnings("unchecked") @@ -79,20 +80,25 @@ public class LzTool extends PanBase implements IPanTool { // 匹配iframe Pattern compile = Pattern.compile("src=\"(/fn\\?[a-zA-Z\\d_+/=]{16,})\""); Matcher matcher = compile.matcher(html); + // 没有Iframe说明是加密分享, 匹配sign通过密码请求下载页面 if (!matcher.find()) { - // 没有Iframe说明是加密分享, 匹配sign通过密码请求下载页面 - // 去TMD正则 + // 处理一下JS String jsText = getJsText(html); - try { - ScriptObjectMirror scriptMirror = JsExecUtils.executeDynamicJs(jsText, "down_p"); - System.out.println(scriptMirror); + if (jsText == null) { + fail(SHARE_URL_PREFIX + " -> " + sUrl + ": js脚本匹配失败, 可能分享已失效"); + return; + } + + jsText = jsText.replace("document.getElementById('pwd').value", "\"" + pwd + "\""); + jsText = jsText.substring(0, jsText.indexOf("document.getElementById('rpt')")); + try { + ScriptObjectMirror scriptObjectMirror = JsExecUtils.executeDynamicJs(jsText, "down_p"); + getDownURL(promise, sUrl, client, (Map) scriptObjectMirror.get("data")); } catch (ScriptException | NoSuchMethodException e) { fail(e, "js引擎执行失败"); return; } - -// getDownURL(promise, sUrl, client, sign); return; } String iframePath = matcher.group(1); @@ -103,7 +109,7 @@ public class LzTool extends PanBase implements IPanTool { // Matcher matcher2 = Pattern.compile("'sign'\s*:\s*'(\\w+)'").matcher(html2); String jsText = getJsText(html2); if (jsText == null) { - fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": sign正则匹配失败, 可能分享已失效"); + fail(SHARE_URL_PREFIX + iframePath + " -> " + sUrl + ": js脚本匹配失败, 可能分享已失效"); return; } try { @@ -131,8 +137,8 @@ public class LzTool extends PanBase implements IPanTool { private void getDownURL(Promise promise, String key, WebClient client, Map signMap) { MultiMap map = MultiMap.caseInsensitiveMultiMap(); - signMap.forEach((k,v)->{ - map.set(k,v.toString()); + 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, " + diff --git a/web-service/src/main/resources/js/lz.js b/web-service/src/main/resources/js/lz.js index af599ce..7df1e7b 100644 --- a/web-service/src/main/resources/js/lz.js +++ b/web-service/src/main/resources/js/lz.js @@ -5,36 +5,42 @@ var signObj; -/* - var $,jQuery; +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 - } +$ = jQuery = function () { + return new jQuery.fn.init(); } + +jQuery.fn = jQuery.prototype = { + init: function () { + return { + focus: function (a) { + + }, + keyup: function(a) { + + }, + ajax: function (obj) { + signObj = obj + } + + } + }, + +} + +jQuery.fn.init.prototype = jQuery.fn; + + +// 伪装jquery.ajax函数获取关键数据 +$.ajax = function (obj) { + signObj = obj +} + var document = { getElementById: function (v) { return { - value : v + value: 'v' } - } + }, }