diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-client/pom.xml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-client/pom.xml
new file mode 100644
index 0000000000..5c57808384
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-client/pom.xml
@@ -0,0 +1,16 @@
+
+
+
+ epmet-openapi-adv
+ com.epmet
+ 2.0.0
+ ../pom.xml
+
+ 4.0.0
+
+ epmet-openapi-adv-client
+
+
+
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/Dockerfile b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/Dockerfile
new file mode 100644
index 0000000000..d15b865820
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/Dockerfile
@@ -0,0 +1,11 @@
+FROM java:8
+
+RUN export LANG="zh_CN.UTF-8"
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+RUN echo 'Asia/Shanghai' > /etc/timezone
+
+COPY ./target/*.jar ./epmet-openapi-adv.jar
+
+EXPOSE 8115
+
+ENTRYPOINT ["sh", "-c", "exec $RUN_INSTRUCT"]
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-dev.yml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-dev.yml
new file mode 100644
index 0000000000..55c505363d
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-dev.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ epmet-openapi-adv-server:
+ container_name: epmet-openapi-adv-server-dev
+ image: 192.168.1.130:10080/epmet-cloud-dev/epmet-openapi-adv-server:version_placeholder
+ ports:
+ - "8015:8015"
+ network_mode: host # 不会创建新的网络
+ volumes:
+ - "/opt/epmet-cloud-logs/dev:/logs"
+ environment:
+ RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./epmet-openapi-adv.jar"
+ restart: "unless-stopped"
+ deploy:
+ resources:
+ limits:
+ cpus: '0.1'
+ memory: 300M
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-prod.yml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-prod.yml
new file mode 100644
index 0000000000..b5a13e04e3
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-prod.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ epmet-openapi-adv-server:
+ container_name: epmet-openapi-adv-server-prod
+ image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/epmet-openapi-adv-server:0.3.3
+ ports:
+ - "8015:8015"
+ network_mode: host # 不会创建新的网络
+ volumes:
+ - "/opt/epmet-cloud-logs/prod:/logs"
+ environment:
+ RUN_INSTRUCT: "java -Xms256m -Xmx512m -jar ./epmet-openapi-adv.jar"
+ restart: "unless-stopped"
+ deploy:
+ resources:
+ limits:
+ cpus: '0.1'
+ memory: 600M
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-test.yml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-test.yml
new file mode 100644
index 0000000000..45d536cb2f
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/deploy/docker-compose-test.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ epmet-openapi-adv-server:
+ container_name: epmet-openapi-adv-server-test
+ image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-openapi-adv-server:version_placeholder
+ ports:
+ - "8015:8015"
+ network_mode: host # 不会创建新的网络
+ volumes:
+ - "/opt/epmet-cloud-logs/test:/logs"
+ environment:
+ RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./epmet-openapi-adv.jar"
+ restart: "unless-stopped"
+ deploy:
+ resources:
+ limits:
+ cpus: '0.1'
+ memory: 300M
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/pom.xml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/pom.xml
new file mode 100644
index 0000000000..8dd1602e70
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/pom.xml
@@ -0,0 +1,227 @@
+
+
+
+ 0.3.3
+
+ epmet-openapi-adv
+ com.epmet
+ 2.0.0
+ ../pom.xml
+
+ 4.0.0
+
+ epmet-openapi-adv-server
+
+
+
+ com.epmet
+ epmet-commons-mybatis
+ 2.0.0
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework
+ spring-context-support
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+ io.github.openfeign
+ feign-httpclient
+ 10.3.0
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+
+
+
+
+ ${project.basedir}/src/main/java
+
+
+ true
+ ${basedir}/src/main/resources
+
+
+
+
+
+
+ dev
+
+ 8115
+ dev
+
+
+
+
+
+ epmet_adv_user
+ EpmEt-db-UsEr
+
+ 0
+ 192.168.1.130
+ 6379
+ 123456
+
+ true
+ 192.168.1.130:8848
+ 6ceab336-d004-4acf-89c6-e121d06f4988
+
+
+ false
+
+
+ false
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=90782b119f82a5b6bb8e0f819b6a77bbc2102b53aa2d7d2e24fa10b66d580b1c
+
+ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+
+
+ local
+
+ true
+
+
+ 8115
+ local
+
+
+
+
+
+ epmet_adv_user
+ EpmEt-db-UsEr
+
+ 0
+ 118.190.150.119
+ 47379
+ 123456
+
+ false
+ 192.168.1.130:8848
+ 6ceab336-d004-4acf-89c6-e121d06f4988
+
+
+ false
+
+
+ false
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=90782b119f82a5b6bb8e0f819b6a77bbc2102b53aa2d7d2e24fa10b66d580b1c
+
+ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+ https://epmet-dev.elinkservice.cn/api/epmetscan/api
+
+
+
+ test
+
+
+ 8115
+ test
+
+
+
+
+
+ epmet
+ elink@833066
+
+ 0
+ r-m5eoz5b6tkx09y6bpz.redis.rds.aliyuncs.com
+ 6379
+ EpmEtrEdIs!q@w
+
+ true
+ 192.168.10.150:8848
+ 67e3c350-533e-4d7c-9f8f-faf1b4aa82ae
+
+
+ false
+
+
+ true
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=90782b119f82a5b6bb8e0f819b6a77bbc2102b53aa2d7d2e24fa10b66d580b1c
+
+ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+
+
+ prod
+
+ 8115
+ prod
+
+
+
+
+
+ epmet_adv_user
+ EpmEt-db-UsEr
+
+ 0
+ r-m5ez3n1j0qc3ykq2ut.redis.rds.aliyuncs.com
+ 6379
+ EpmEtclOUdrEdIs!Q2w
+
+ true
+ 192.168.11.180:8848
+ bd205d23-e696-47be-b995-916313f86e99
+
+
+ false
+
+
+ true
+
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=a5f66c3374b1642fe2142dbf56d5997e280172d4e8f2b546c9423a68c82ece6c
+
+ SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1
+
+
+
+
+
+
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/AdvApplication.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/AdvApplication.java
new file mode 100644
index 0000000000..61c5d3b4b8
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/AdvApplication.java
@@ -0,0 +1,15 @@
+package com.epmet;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+
+@SpringBootApplication
+@EnableDiscoveryClient
+@EnableFeignClients
+public class AdvApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(AdvApplication.class, args);
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/aspect/RequestLogAspect.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/aspect/RequestLogAspect.java
new file mode 100644
index 0000000000..e06fdc2c95
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/aspect/RequestLogAspect.java
@@ -0,0 +1,40 @@
+package com.epmet.adv.aspect;
+
+import com.epmet.commons.tools.aspect.BaseRequestLogAspect;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 日志/异常处理切面实现,调用父类方法完成日志记录和异常处理。
+ */
+@Aspect
+@Component
+@Order(0)
+public class RequestLogAspect extends BaseRequestLogAspect {
+
+ @Override
+ @Around(value = "execution(* com.epmet.adv.controller.*Controller*.*(..)) ")
+ public Object proceed(ProceedingJoinPoint point) throws Throwable {
+ return super.proceed(point, getRequest());
+ }
+
+ /**
+ * 获取Request对象
+ *
+ * @return
+ */
+ private HttpServletRequest getRequest() {
+ RequestAttributes ra = RequestContextHolder.getRequestAttributes();
+ ServletRequestAttributes sra = (ServletRequestAttributes) ra;
+ return sra.getRequest();
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/config/ModuleConfigImpl.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/config/ModuleConfigImpl.java
new file mode 100644
index 0000000000..8d88549b66
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/config/ModuleConfigImpl.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.adv.config;
+
+import com.epmet.commons.tools.config.ModuleConfig;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模块配置信息
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class ModuleConfigImpl implements ModuleConfig {
+ @Override
+ public String getName() {
+ return "adv";
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/controller/AdvVideoController.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/controller/AdvVideoController.java
new file mode 100644
index 0000000000..5c032ad562
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/controller/AdvVideoController.java
@@ -0,0 +1,28 @@
+package com.epmet.adv.controller;
+
+import com.epmet.adv.entity.AdvVedioEntity;
+import com.epmet.adv.service.AdvVedioService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.io.IOException;
+
+@Controller
+@RequestMapping("video")
+public class AdvVideoController {
+
+ @Autowired
+ private AdvVedioService advVedioService;
+
+ @GetMapping("company-adv")
+ public String toVedio() throws IOException {
+ AdvVedioEntity enableAdvVedioEntity = advVedioService.getEnableAdvVedioEntity();
+ String redirectUrl = enableAdvVedioEntity != null ? enableAdvVedioEntity.getPath() : "404";
+ return String.format("redirect:%s", redirectUrl);
+ //response.sendRedirect("www.baidu.com");
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/dao/AdvVedioDao.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/dao/AdvVedioDao.java
new file mode 100644
index 0000000000..c14da09d52
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/dao/AdvVedioDao.java
@@ -0,0 +1,33 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.adv.dao;
+
+import com.epmet.adv.entity.AdvVedioEntity;
+import com.epmet.commons.mybatis.dao.BaseDao;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 宣传视频
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2020-12-30
+ */
+@Mapper
+public interface AdvVedioDao extends BaseDao {
+ AdvVedioEntity getEnableAdvVedioEntity();
+}
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/entity/AdvVedioEntity.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/entity/AdvVedioEntity.java
new file mode 100644
index 0000000000..a25c6ea77e
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/entity/AdvVedioEntity.java
@@ -0,0 +1,56 @@
+/**
+ * Copyright 2018 人人开源 https://www.renren.io
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package com.epmet.adv.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import com.epmet.commons.mybatis.entity.BaseEpmetEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 宣传视频
+ *
+ * @author generator generator@elink-cn.com
+ * @since v1.0.0 2020-12-30
+ */
+@Data
+@EqualsAndHashCode(callSuper=false)
+@TableName("adv_vedio")
+public class AdvVedioEntity extends BaseEpmetEntity {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 存储路径
+ */
+ private String path;
+
+ /**
+ * 存储类型。aliyun_oss,local
+ */
+ private String storeType;
+
+ /**
+ * 是否启用
+ */
+ private Integer enable;
+
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/service/AdvVedioService.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/service/AdvVedioService.java
new file mode 100644
index 0000000000..38091ee496
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/service/AdvVedioService.java
@@ -0,0 +1,7 @@
+package com.epmet.adv.service;
+
+import com.epmet.adv.entity.AdvVedioEntity;
+
+public interface AdvVedioService {
+ AdvVedioEntity getEnableAdvVedioEntity();
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/service/impl/AdvVedioServiceImpl.java b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/service/impl/AdvVedioServiceImpl.java
new file mode 100644
index 0000000000..cecc710c39
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/java/com/epmet/adv/service/impl/AdvVedioServiceImpl.java
@@ -0,0 +1,18 @@
+package com.epmet.adv.service.impl;
+
+import com.epmet.adv.dao.AdvVedioDao;
+import com.epmet.adv.entity.AdvVedioEntity;
+import com.epmet.adv.service.AdvVedioService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class AdvVedioServiceImpl implements AdvVedioService {
+ @Autowired
+ private AdvVedioDao advVedioDao;
+
+ public AdvVedioEntity getEnableAdvVedioEntity() {
+ return advVedioDao.getEnableAdvVedioEntity();
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/bootstrap.yml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000000..0bd40dcca7
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/bootstrap.yml
@@ -0,0 +1,140 @@
+server:
+ port: @server.port@
+ version: @version@
+ servlet:
+ context-path: /adv
+
+spring:
+ main:
+ allow-bean-definition-overriding: true
+ application:
+ name: epmet-openapi-adv-server
+ #环境 dev|test|prod
+ profiles:
+ active: @spring.profiles.active@
+ messages:
+ encoding: UTF-8
+ basename: i18n/messages_common
+ jackson:
+ time-zone: GMT+8
+ date-format: yyyy-MM-dd HH:mm:ss
+ redis:
+ database: @spring.redis.index@
+ host: @spring.redis.host@
+ port: @spring.redis.port@
+ password: @spring.redis.password@
+ timeout: 30s
+ datasource:
+ druid:
+ #MySQL
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ url: @spring.datasource.druid.url@
+ username: @spring.datasource.druid.username@
+ password: @spring.datasource.druid.password@
+ initial-size: 10
+ max-active: 100
+ min-idle: 10
+ max-wait: 60000
+ pool-prepared-statements: true
+ max-pool-prepared-statement-per-connection-size: 20
+ time-between-eviction-runs-millis: 60000
+ min-evictable-idle-time-millis: 300000
+ #Oracle需要打开注释
+ #validation-query: SELECT 1 FROM DUAL
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ filter:
+ stat:
+ log-slow-sql: true
+ slow-sql-millis: 1000
+ merge-sql: false
+ wall:
+ config:
+ multi-statement-allow: true
+ # 数据迁移工具flyway
+ flyway:
+ enabled: @spring.flyway.enabled@
+ locations: classpath:db/migration
+ url: @spring.datasource.druid.url@
+ user: @spring.datasource.druid.username@
+ password: @spring.datasource.druid.password@
+ baseline-on-migrate: true
+ baseline-version: 0
+ cloud:
+ nacos:
+ discovery:
+ server-addr: @nacos.server-addr@
+ #nacos的命名空间ID,默认是public
+ namespace: @nacos.discovery.namespace@
+ #不把自己注册到注册中心的地址
+ register-enabled: @nacos.register-enabled@
+ ip: @nacos.ip@
+ config:
+ enabled: @nacos.config-enabled@
+ server-addr: @nacos.server-addr@
+ namespace: @nacos.config.namespace@
+ group: @nacos.config.group@
+ file-extension: yaml
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ endpoint:
+ health:
+ show-details: ALWAYS
+
+mybatis-plus:
+ mapper-locations: classpath:/mapper/**/*.xml
+ #实体扫描,多个package用逗号或者分号分隔
+ typeAliasesPackage: com.epmet.entity
+ global-config:
+ #数据库相关配置
+ db-config:
+ #主键类型 AUTO:"数据库ID自增", INPUT:"用户输入ID", ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
+ id-type: ID_WORKER
+ #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
+ field-strategy: NOT_NULL
+ #驼峰下划线转换
+ column-underline: true
+ banner: false
+ #原生配置
+ configuration:
+ map-underscore-to-camel-case: true
+ cache-enabled: false
+ call-setters-on-nulls: true
+ jdbc-type-for-null: 'null'
+
+feign:
+ hystrix:
+ enabled: true
+ client:
+ config:
+ default:
+ loggerLevel: BASIC
+ okhttp:
+ enabled: true
+
+
+hystrix:
+ command:
+ default:
+ execution:
+ isolation:
+ thread:
+ timeoutInMilliseconds: 60000 #缺省为1000
+
+ribbon:
+ ReadTimeout: 300000
+ ConnectTimeout: 300000
+
+#pageHelper分页插件
+pagehelper:
+ helper-dialect: mysql
+ reasonable: false #分页合理化配置,例如输入页码为-1,则自动转化为最小页码1
+
+dingTalk:
+ robot:
+ webHook: @dingTalk.robot.webHook@
+ secret: @dingTalk.robot.secret@
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/db/migration/V0.0.1__createAdvVedio.sql b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/db/migration/V0.0.1__createAdvVedio.sql
new file mode 100644
index 0000000000..007c12b55f
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/db/migration/V0.0.1__createAdvVedio.sql
@@ -0,0 +1,18 @@
+-- create database epmet_adv default character set utf8mb4;
+
+-- CREATE USER epmet_adv_user@'%' IDENTIFIED BY 'EpmEt-db-UsEr';
+-- GRANT ALL ON `epmet_adv%`.* TO 'epmet_adv_user'@'%';
+-- flush privileges;
+
+CREATE TABLE `adv_vedio` (
+ `ID` varchar(64) NOT NULL COMMENT 'id' primary key ,
+ `PATH` varchar(255) NOT NULL COMMENT '存储路径',
+ `STORE_TYPE` varchar(30) NOT NULL COMMENT '存储类型。aliyun_oss,local',
+ `ENABLE` tinyint(1) NOT NULL COMMENT '是否启用',
+ `REVISION` int(11) DEFAULT NULL COMMENT '乐观锁',
+ `DEL_FLAG` int(11) unsigned DEFAULT NULL COMMENT '删除标识 0:未删除 1:删除',
+ `CREATED_BY` varchar(32) DEFAULT NULL COMMENT '创建者',
+ `CREATED_TIME` datetime DEFAULT NULL COMMENT '创建时间',
+ `UPDATED_BY` varchar(32) DEFAULT NULL COMMENT '更新者',
+ `UPDATED_TIME` datetime DEFAULT NULL COMMENT '更新时间'
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宣传视频'
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/logback-spring.xml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000000..06a21d317c
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/logback-spring.xml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+ ${appname}
+
+
+
+
+
+
+
+
+ debug
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+ UTF-8
+
+
+
+
+
+
+
+ ${log.path}/debug.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+
+ ${log.path}/debug-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ debug
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/info.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+
+ ${log.path}/info-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ info
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/warn.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+ ${log.path}/warn-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ warn
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/error.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+ ${log.path}/error-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ ERROR
+ ACCEPT
+ DENY
+ ${webHook}
+ ${secret}
+ ${appname}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/mapper/AdvVedioDao.xml b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/mapper/AdvVedioDao.xml
new file mode 100644
index 0000000000..92a4993b9f
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/epmet-openapi-adv-server/src/main/resources/mapper/AdvVedioDao.xml
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ select id,
+ path,
+ store_type,
+ enable,
+ revision,
+ del_flag,
+ created_by,
+ created_time,
+ updated_by,
+ updated_time
+ from adv_vedio
+ where ENABLE = 1
+ limit 1;
+
+
+
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-adv/pom.xml b/epmet-openapi/epmet-openapi-adv/pom.xml
new file mode 100644
index 0000000000..13490687d1
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-adv/pom.xml
@@ -0,0 +1,21 @@
+
+
+
+ epmet-openapi
+ com.epmet
+ 2.0.0
+
+ pom
+ 4.0.0
+
+ epmet-openapi-adv
+
+
+ epmet-openapi-adv-client
+ epmet-openapi-adv-server
+
+
+
+
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/Dockerfile b/epmet-openapi/epmet-openapi-scan/Dockerfile
new file mode 100644
index 0000000000..868fc70ac1
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/Dockerfile
@@ -0,0 +1,11 @@
+FROM java:8
+
+RUN export LANG="zh_CN.UTF-8"
+RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
+RUN echo 'Asia/Shanghai' > /etc/timezone
+
+COPY ./target/*.jar ./epmet-openapi-scan.jar
+
+EXPOSE 8107
+
+ENTRYPOINT ["sh", "-c", "exec $RUN_INSTRUCT"]
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml
new file mode 100644
index 0000000000..4e86ab5e89
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-dev.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ epmet-openapi-scan:
+ container_name: epmet-openapi-scan-dev
+ image: 192.168.1.130:10080/epmet-cloud-dev/epmet-openapi-scan:version_placeholder
+ ports:
+ - "8107:8107"
+ network_mode: host # 不会创建新的网络
+ volumes:
+ - "/opt/epmet-cloud-logs/dev:/logs"
+ environment:
+ RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./epmet-openapi-scan.jar"
+ restart: "unless-stopped"
+ deploy:
+ resources:
+ limits:
+ cpus: '0.1'
+ memory: 300M
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-prod.yml b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-prod.yml
new file mode 100644
index 0000000000..69873777e7
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-prod.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ epmet-openapi-scan:
+ container_name: epmet-openapi-scan-prod
+ image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-master/epmet-openapi-scan:0.3.24
+ ports:
+ - "8107:8107"
+ network_mode: host # 不会创建新的网络
+ volumes:
+ - "/opt/epmet-cloud-logs/prod:/logs"
+ environment:
+ RUN_INSTRUCT: "java -Xms256m -Xmx512m -jar ./epmet-openapi-scan.jar"
+ restart: "unless-stopped"
+ deploy:
+ resources:
+ limits:
+ cpus: '0.1'
+ memory: 600M
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml
new file mode 100644
index 0000000000..49ce30a8c1
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/deploy/docker-compose-test.yml
@@ -0,0 +1,18 @@
+version: "3.7"
+services:
+ epmet-openapi-scan:
+ container_name: epmet-openapi-scan-test
+ image: registry-vpc.cn-qingdao.aliyuncs.com/epmet-cloud-release/epmet-openapi-scan:version_placeholder
+ ports:
+ - "8107:8107"
+ network_mode: host # 不会创建新的网络
+ volumes:
+ - "/opt/epmet-cloud-logs/test:/logs"
+ environment:
+ RUN_INSTRUCT: "java -Xms32m -Xmx200m -jar ./epmet-openapi-scan.jar"
+ restart: "unless-stopped"
+ deploy:
+ resources:
+ limits:
+ cpus: '0.1'
+ memory: 300M
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/pom.xml b/epmet-openapi/epmet-openapi-scan/pom.xml
new file mode 100644
index 0000000000..b80b8a843e
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/pom.xml
@@ -0,0 +1,208 @@
+
+
+
+ 4.0.0
+ 0.3.24
+ epmet-openapi-scan
+ jar
+
+
+ epmet-openapi
+ com.epmet
+ 2.0.0
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ org.springframework
+ spring-context-support
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+ com.epmet
+ epmet-commons-tools
+ 2.0.0
+
+
+
+ com.aliyun
+ aliyun-java-sdk-core
+ 4.1.1
+
+
+ com.aliyun
+ aliyun-java-sdk-green
+ 3.5.1
+
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.2
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ true
+
+
+
+
+ ${project.basedir}/src/main/java
+
+
+ true
+ ${basedir}/src/main/resources
+
+
+
+
+
+
+ dev
+
+ 8107
+ dev
+
+
+
+ 0
+ 192.168.1.130
+ 6379
+ 123456
+
+ true
+ 192.168.1.130:8848
+ 6ceab336-d004-4acf-89c6-e121d06f4988
+
+
+ false
+
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=90782b119f82a5b6bb8e0f819b6a77bbc2102b53aa2d7d2e24fa10b66d580b1c
+
+ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+
+
+ local
+
+ true
+
+
+ 8107
+ dev
+
+
+
+ 0
+ 192.168.1.130
+ 6379
+ 123456
+
+ false
+ 192.168.1.130:8848
+ 6ceab336-d004-4acf-89c6-e121d06f4988
+
+
+ false
+
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=90782b119f82a5b6bb8e0f819b6a77bbc2102b53aa2d7d2e24fa10b66d580b1c
+
+ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+
+
+ test
+
+ 8107
+ test
+
+
+ 0
+ r-m5eoz5b6tkx09y6bpz.redis.rds.aliyuncs.com
+ 6379
+ EpmEtrEdIs!q@w
+
+ true
+ 192.168.10.150:8848
+ 67e3c350-533e-4d7c-9f8f-faf1b4aa82ae
+
+
+ false
+
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=90782b119f82a5b6bb8e0f819b6a77bbc2102b53aa2d7d2e24fa10b66d580b1c
+
+ SEC080aac67ff78e79fdaba132aa51e3fb3f6060dec99492feaac82cabf9f8b6a19
+
+
+
+
+
+ prod
+
+
+ 8107
+ prod
+
+
+ 0
+ r-m5ez3n1j0qc3ykq2ut.redis.rds.aliyuncs.com
+ 6379
+ EpmEtclOUdrEdIs!Q2w
+
+ true
+ 192.168.11.180:8848
+ bd205d23-e696-47be-b995-916313f86e99
+
+
+ false
+
+
+
+
+
+ https://oapi.dingtalk.com/robot/send?access_token=a5f66c3374b1642fe2142dbf56d5997e280172d4e8f2b546c9423a68c82ece6c
+
+ SEC95f4f40b533ad379ea6a6d1af6dd37029383cfe1b7cd96dfac2678be2c1c3ed1
+
+
+
+
+
+
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/ScanApplication.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/ScanApplication.java
new file mode 100644
index 0000000000..38f55211d2
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/ScanApplication.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.openapi.scan;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+
+/**
+ * 管理后台
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+
+@SpringBootApplication
+@ComponentScan(basePackages = "com.epmet")
+public class ScanApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ScanApplication.class, args);
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/aspect/RequestLogAspect.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/aspect/RequestLogAspect.java
new file mode 100644
index 0000000000..ae6960a52d
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/aspect/RequestLogAspect.java
@@ -0,0 +1,40 @@
+package com.epmet.openapi.scan.aspect;
+
+import com.epmet.commons.tools.aspect.BaseRequestLogAspect;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestAttributes;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 日志/异常处理切面实现,调用父类方法完成日志记录和异常处理。
+ */
+@Aspect
+@Component
+@Order(0)
+public class RequestLogAspect extends BaseRequestLogAspect {
+
+ @Override
+ @Around(value = "execution(* com.epmet.openapi.scan.controller.*Controller*.*(..)) ")
+ public Object proceed(ProceedingJoinPoint point) throws Throwable {
+ return super.proceed(point, getRequest());
+ }
+
+ /**
+ * 获取Request对象
+ *
+ * @return
+ */
+ private HttpServletRequest getRequest() {
+ RequestAttributes ra = RequestContextHolder.getRequestAttributes();
+ ServletRequestAttributes sra = (ServletRequestAttributes) ra;
+ return sra.getRequest();
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/constant/SysConstant.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/constant/SysConstant.java
new file mode 100644
index 0000000000..387294c23b
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/constant/SysConstant.java
@@ -0,0 +1,30 @@
+package com.epmet.openapi.scan.common.constant;
+
+/**
+ * 系统常量
+ *
+ * @author jianjun liu
+ * @date 2020-06-05 10:42
+ **/
+public class SysConstant {
+
+ public static final String UTF8 = "utf-8";
+ /**
+ * 文本审核最大任务数
+ */
+ public static final Integer MAX_TASK_SIZE = 100;
+
+ /**
+ * 图片审核最大任务数
+ */
+ public static final Integer MAX_SCAN_IMG_TASK_SIZE = 10;
+
+ public static final String CODE = "code";
+ public static final String DATA = "data";
+
+
+ /**
+ * 任务正在执行中,建议您等待一段时间(例如5s)后再查询结果。
+ */
+ public static final int PROCESSING=280;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/CommonErrorCodeEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/CommonErrorCodeEnum.java
new file mode 100644
index 0000000000..8ebed5781f
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/CommonErrorCodeEnum.java
@@ -0,0 +1,68 @@
+package com.epmet.openapi.scan.common.enu;
+
+import com.epmet.commons.tools.constant.StrConstant;
+
+/**
+ * 公共错误码
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2021/1/10 19:43
+ */
+public enum CommonErrorCodeEnum {
+ OK(200, "请求成功。"),
+ PROCESSING(280, "任务正在执行中,建议您等待一段时间(例如5s)后再查询结果。"),
+ BAD_REQUEST(400, "请求有误,通常由于请求参数不正确导致,请仔细检查请求参数。"),
+ NOT_ALLOWED(401, "请求失败,通常是由于使用了不安全的图片、视频、语音链接地址。"),
+ FORBIDDEN(403, "请求访问失败,通常由于您的图片、视频、语音链接无法访问导致,请确认公网是否可访问,并且无防盗链策略。"),
+ NOT_FOUND(404, "待检测内容未找到,通常是由于您的图片、视频、语音内容无法下载导致,请确认内容可通过公网访问到。"),
+ DOWNLOAD_FAILED(480, "下载失败,请确认待检测内容的大小、分辨率(如果有)在API的限制范围内。"),
+ GENERAL_ERROR(500, "一般是服务端临时出错。建议重试,若持续返回该错误码,请通过工单联系我们。"),
+ DB_FAILED(580, "数据库操作失败。建议重试,若持续返回该错误码,请通过工单联系我们。"),
+ TIMEOUT(581, "超时。建议重试,若持续返回该错误码,请通过工单联系我们。"),
+ CACHE_FAILED(585, "缓存出错。建议重试,若持续返回该错误码,请通过工单联系我们。"),
+ ALGO_FAILED(586, "算法出错。请通过工单联系我们。"),
+ MQ_FAILED(587, "中间件出错。请通过工单联系我们。"),
+ EXCEED_QUOTA(588, "请求频率超出配额。默认配额:图片检测50张/秒,视频检测20路/秒,语音检测20路/秒,文本检测100条/秒。如果需要调整配额,请通过工单联系我们。"),
+ TOO_LARGE(589, "待检测内容过大,请确保检测的内容在API的限制范围内。建议重试,若持续返回该错误码,请通过工单联系我们。"),
+ BAD_FORMAT(590, "待检测内容格式错误,请确保检测的内容在API的限制范围内。"),
+ CONNECTION_POOL_FULL(591, "连接池满。请通过工单联系我们。"),
+ DOWNLOAD_TIMEOUT(592, "下载超时,下载时间限制为3s,请确保检测的内容大小在API的限制范围内。"),
+ EXPIRED(594, "任务过期,如taskId过期。"),
+ CATCH_FRAME_FAILED(595, "截帧失败,请通过工单联系我们。"),
+ PERMISSION_DENY(596, "账号未授权、账号欠费、账号未开通、账号被禁等原因,具体可以参考返回的msg。");
+
+
+ private Integer code;
+ private String desc;
+
+ CommonErrorCodeEnum(Integer code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+
+ public static String getErrorMsg(Integer value) {
+ CommonErrorCodeEnum[] codeEnums = values();
+ for (CommonErrorCodeEnum commonErrorCodeEnum : codeEnums) {
+ if (commonErrorCodeEnum.getCode().equals(value)) {
+ return commonErrorCodeEnum.getDesc();
+ }
+ }
+ return StrConstant.EPMETY_STR;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/ImgSceneEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/ImgSceneEnum.java
new file mode 100644
index 0000000000..cfb8d77ac2
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/ImgSceneEnum.java
@@ -0,0 +1,47 @@
+package com.epmet.openapi.scan.common.enu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * desc:图片检测场景
+ * @author jianjun liu
+ * @date 2020-06-04 21:39
+ **/
+public enum ImgSceneEnum {
+ PORN("porn", "图片智能鉴黄"),
+ TERRORISM("terrorism", "图片暴恐涉政识别");
+
+ private String code;
+ private String desc;
+
+ ImgSceneEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static List getImgSceneList() {
+ List result = new ArrayList<>();
+ ImgSceneEnum[] values = ImgSceneEnum.values();
+ for (ImgSceneEnum v : values) {
+ result.add(v.getCode());
+ }
+ return result;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/LabelEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/LabelEnum.java
new file mode 100644
index 0000000000..7ad96f3171
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/LabelEnum.java
@@ -0,0 +1,66 @@
+package com.epmet.openapi.scan.common.enu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 阿里检测结果的分类字典
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/18 14:04
+ */
+public enum LabelEnum {
+ NORMAL("normal", "正常文本"),
+ SPAM("spam", "含垃圾信息"),
+ AD("ad", "广告"),
+ POLITICS("politics","涉政"),
+ TERRORISM("terrorism","暴恐"),
+ ABUSE("abuse","辱骂"),
+ PORN("porn","色情"),
+ FLOOD("flood","灌水"),
+ CONTRABAND("contraband","违禁"),
+ MEANINGLESS("meaningless","无意义"),
+ CUSTOMIZED("customized","自定义");
+
+ private String code;
+ private String desc;
+
+ LabelEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static List getLabelEnumList() {
+ List result = new ArrayList<>();
+ LabelEnum[] values = LabelEnum.values();
+ for (LabelEnum v : values) {
+ result.add(v.getCode());
+ }
+ return result;
+ }
+
+ public static String getDesc(String code) {
+ LabelEnum[] businessModeEnums = values();
+ for (LabelEnum labelEnum : businessModeEnums) {
+ if (labelEnum.getCode().equals(code)) {
+ return labelEnum.getDesc();
+ }
+ }
+ return "";
+ }
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/RegionIdEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/RegionIdEnum.java
new file mode 100644
index 0000000000..e1dbd5897b
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/RegionIdEnum.java
@@ -0,0 +1,49 @@
+package com.epmet.openapi.scan.common.enu;
+
+/**
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-04 21:39
+ **/
+public enum RegionIdEnum {
+ SHANG_HAI("cn-shanghai","green.cn-shanghai.aliyuncs.com"),
+ BEI_JING("cn-beijing","green.cn-beijing.aliyuncs.com"),
+ AP_SOUTHEAST_1("ap-southeast-1","green.ap-southeast-1.aliyuncs.com"),
+ US_WEST_1("us-west-1","green.us-west-1.aliyuncs.com");
+
+ private String regionId;
+ private String domain;
+ RegionIdEnum(String regionId, String domain){
+ this.regionId = regionId;
+ this.domain = domain;
+ }
+
+ public static String getDoMain(String regionId){
+ if (regionId == null) {
+ return SHANG_HAI.getDomain();
+ }
+ RegionIdEnum[] values = RegionIdEnum.values();
+ for (RegionIdEnum v : values) {
+ if (regionId.equals(v.getDomain())) {
+ return v.getDomain();
+ }
+ }
+ return SHANG_HAI.getDomain();
+ }
+
+ public String getRegionId() {
+ return regionId;
+ }
+
+ public void setRegionId(String regionId) {
+ this.regionId = regionId;
+ }
+
+ public String getDomain() {
+ return domain;
+ }
+
+ public void setDomain(String domain) {
+ this.domain = domain;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/SuggestionEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/SuggestionEnum.java
new file mode 100644
index 0000000000..3881508341
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/SuggestionEnum.java
@@ -0,0 +1,48 @@
+package com.epmet.openapi.scan.common.enu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * desc:检测建议
+ * @author jianjun liu
+ * @date 2020-06-04 21:39
+ **/
+public enum SuggestionEnum {
+ PASS("pass", "正常"),
+ REVIEW("review", "需要人工审核"),
+ BLOCK("block", "内容违规");
+
+ private String code;
+ private String desc;
+
+ SuggestionEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static List getImgSceneList() {
+ List result = new ArrayList<>();
+ SuggestionEnum[] values = SuggestionEnum.values();
+ for (SuggestionEnum v : values) {
+ result.add(v.getCode());
+ }
+ return result;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/SysResponseEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/SysResponseEnum.java
new file mode 100644
index 0000000000..f906186333
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/SysResponseEnum.java
@@ -0,0 +1,46 @@
+package com.epmet.openapi.scan.common.enu;
+
+/**
+ * @author jianjun liu
+ * @date 2020-06-04 21:39
+ **/
+public enum SysResponseEnum {
+ /**
+ *
+ * 业务代码枚举类
+ *
+ * 编码样式:【CCCBBOOXX】
+ * 编码示例说明:
+ * CCC 中心编码&业务系统 (110-内容扫描服务中心服务)
+ * BB 业务类型(00-默认 )
+ * OO 操作类型(00-默认)
+ * XX 具体编码(00-成功,01-失败,02-参数错误,10-异常 99-系统错误)
+ *
+ */
+ /*通用枚举 */
+ EXCEPTION(10001,"系统异常"),
+ THIRD_PLATFORM_SERVER_ERROR(10002,"第三方检测服务异常,请稍候重试"),
+ THIRD_PLATFORM_RESP_STATUS_ERROR(10003,"第三方检测服务响应异常,请稍候重试"),
+ THIRD_PLATFORM_RESP_CODE_ERROR(10004,"第三方检测服务检测异常,请稍候重试"),
+
+
+ /*审核内容 业务 01*/
+ SCAN_TASK_LIST_PARAM_ERROR(110010001,"任务列表长度超过限制"),
+ SCAN_PARAM_ERROR(110010002,"参数格式不正确"),
+ ;
+
+ private Integer code;
+ private String msg;
+ SysResponseEnum(Integer code, String msg){
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/TextSceneEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/TextSceneEnum.java
new file mode 100644
index 0000000000..263d6e25ed
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/TextSceneEnum.java
@@ -0,0 +1,46 @@
+package com.epmet.openapi.scan.common.enu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * desc:文本检测场景
+ * @author jianjun liu
+ * @date 2020-06-04 21:39
+ **/
+public enum TextSceneEnum {
+ ANTISPAM("antispam", "文本垃圾内容检测");
+
+ private String code;
+ private String desc;
+
+ TextSceneEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static List getTextSceneList() {
+ List result = new ArrayList<>();
+ TextSceneEnum[] values = TextSceneEnum.values();
+ for (TextSceneEnum v : values) {
+ result.add(v.getCode());
+ }
+ return result;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/VideoSceneEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/VideoSceneEnum.java
new file mode 100644
index 0000000000..864d137dd2
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/VideoSceneEnum.java
@@ -0,0 +1,50 @@
+package com.epmet.openapi.scan.common.enu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * desc:视频检测场景
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/29 13:47
+ **/
+public enum VideoSceneEnum {
+ PORN("porn", "视频智能鉴黄"),
+ TERRORISM("terrorism", "视频暴恐涉政"),
+ LIVE("live","视频不良场景"),
+ LOGO("logo","视频logo"),
+ AD("ad","视频图文违规");
+
+ private String code;
+ private String desc;
+
+ VideoSceneEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static List getVideoSceneList() {
+ List result = new ArrayList<>();
+ VideoSceneEnum[] values = VideoSceneEnum.values();
+ for (VideoSceneEnum v : values) {
+ result.add(v.getCode());
+ }
+ return result;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/VoiceSceneEnum.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/VoiceSceneEnum.java
new file mode 100644
index 0000000000..777b92f0d7
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/enu/VoiceSceneEnum.java
@@ -0,0 +1,47 @@
+package com.epmet.openapi.scan.common.enu;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 语音异步检测场景
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 10:12
+ */
+public enum VoiceSceneEnum {
+ ANTISPAM("antispam", "检测场景,取值:antispam");
+
+ private String code;
+ private String desc;
+
+ VoiceSceneEnum(String code, String desc) {
+ this.code = code;
+ this.desc = desc;
+ }
+
+ public static List getVoiceSceneList() {
+ List result = new ArrayList<>();
+ VoiceSceneEnum[] values = VoiceSceneEnum.values();
+ for (VoiceSceneEnum v : values) {
+ result.add(v.getCode());
+ }
+ return result;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/exception/ExecuteHttpException.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/exception/ExecuteHttpException.java
new file mode 100644
index 0000000000..a5694da79c
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/exception/ExecuteHttpException.java
@@ -0,0 +1,29 @@
+package com.epmet.openapi.scan.common.exception;
+
+import com.epmet.openapi.scan.common.enu.SysResponseEnum;
+
+/**
+ * @author jianjun liu
+ * @date 2020-06-05 10:31
+ **/
+public class ExecuteHttpException extends RuntimeException {
+ private int code;
+ private String msg;
+
+ public ExecuteHttpException(String msg) {
+ this(SysResponseEnum.EXCEPTION.getCode(), msg);
+ }
+
+ public ExecuteHttpException(int code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/redis/RedisKeys.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/redis/RedisKeys.java
new file mode 100644
index 0000000000..2939bd62eb
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/redis/RedisKeys.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.openapi.scan.common.redis;
+
+/**
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+public class RedisKeys {
+
+ /**
+ * 党群e事通redis前缀
+ */
+ private static String rootPrefix = "epmet:";
+
+ /**
+ * desc:白名单Key
+ * @return
+ */
+ public static String getWhiteList () {
+ return rootPrefix.concat("openapi:scan:whitelist");
+ }
+
+ /**
+ * desc: 语音检测任务,异步回调,需要根据taskId获取存储seed的Key
+ * @param taskId 提交检测任务API接口返回的taskId eg:1001
+ * @return epmet:openapi:scan:voice:seed:1001
+ */
+ public static String getVoiceScanSeedKey(String taskId){
+ return rootPrefix.concat("openapi:scan:voice:seed:").concat(taskId);
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/HttpClientManager.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/HttpClientManager.java
new file mode 100644
index 0000000000..7ca0302331
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/HttpClientManager.java
@@ -0,0 +1,171 @@
+package com.epmet.openapi.scan.common.util;
+
+import com.alibaba.fastjson.JSON;
+import com.epmet.commons.tools.utils.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.http.HttpStatus;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpRequestBase;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * desc: http 工具类
+ * date: 2020/6/4 22:27
+ *
+ * @author: jianjun liu
+ */
+@Slf4j
+public class HttpClientManager {
+ private static int connectionTimeout = 3000;// 连接超时时间,毫秒
+ private static int soTimeout = 10000;// 读取数据超时时间,毫秒
+ /**
+ * HttpClient对象
+ */
+ private static CloseableHttpClient httpclient = HttpClients.custom().disableAutomaticRetries().build();
+
+ /*** 超时设置 ****/
+ private static RequestConfig requestConfig = RequestConfig.custom()
+ .setSocketTimeout(soTimeout)
+ .setConnectTimeout(connectionTimeout)
+ .build();//设置请求和传输超时时间
+
+ public static HttpClientManager getInstance() {
+ return SingleClass.instance;
+ }
+
+ private static class SingleClass {
+ private final static HttpClientManager instance = new HttpClientManager();
+ }
+
+ /**
+ * desc: 发送json post 请求
+ * param: url,jsonStrParam
+ * return: Result
+ * date: 2019/2/21 9:12
+ *
+ * @author: jianjun liu
+ */
+ public Result sendPost(String url, Map paramsMap) {
+
+ try {
+ HttpPost httppost = new HttpPost(url);
+ httppost.setConfig(requestConfig);
+ httppost.addHeader("Content-Type", "application/x-www-form-urlencoded charset=utf-8");
+
+ List list = new ArrayList();
+ for (String key : paramsMap.keySet()) {
+ list.add(new BasicNameValuePair(key, String.valueOf(paramsMap.get(key))));
+ }
+ UrlEncodedFormEntity urlEncodedFormEntity = new UrlEncodedFormEntity(list, "utf-8");
+ httppost.setEntity(urlEncodedFormEntity);
+
+ return execute(httppost);
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("send exception", e);
+ return new Result().error(8000, e.getMessage());
+ }
+
+ }
+
+ /**
+ * desc: 发送json post 请求
+ * param: url,jsonStrParam
+ * return: Result
+ * date: 2019/2/21 9:12
+ *
+ * @author: jianjun liu
+ */
+ public Result sendPostByJSON(String url, String jsonStrParam) {
+
+ try {
+ HttpPost httppost = new HttpPost(url);
+ httppost.setConfig(requestConfig);
+ httppost.addHeader("Content-Type", "application/json; charset=utf-8");
+ if (StringUtils.isNotEmpty(jsonStrParam)) {
+ StringEntity se = new StringEntity(jsonStrParam, "utf-8");
+ httppost.setEntity(se);
+ }
+ return execute(httppost);
+ } catch (Exception e) {
+ e.printStackTrace();
+ log.error("send exception", e);
+ return new Result().error(8000, e.getMessage());
+ }
+
+ }
+
+ /**
+ * desc: 发送get请求
+ * param:url, params
+ * return: Result
+ * date: 2019/2/21 9:16
+ *
+ * @author: jianjun liu
+ */
+ public Result sendGet(String url, Map params) {
+
+ try {
+ URIBuilder builder = new URIBuilder(url);
+ if (!CollectionUtils.isEmpty(params)) {
+ Set set = params.keySet();
+ for (String key : set) {
+ builder.setParameter(key, params.get(key) == null ? "" : String.valueOf(params.get(key)));
+ }
+ }
+ HttpGet httpGet = new HttpGet(builder.build());
+ httpGet.setConfig(requestConfig);
+ return execute(httpGet);
+ } catch (Exception e) {
+ log.error("sendGet exception", e);
+ return new Result().error(8000, e.getMessage());
+ }
+ }
+
+ private Result execute(HttpRequestBase httpMethod) {
+ CloseableHttpResponse response = null;
+ try {
+ response = httpclient.execute(httpMethod);
+ log.debug("http send response:{}", JSON.toJSONString(response));
+ if (response != null && response.getStatusLine() != null) {
+ if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
+ String result = EntityUtils.toString(response.getEntity());
+ return new Result().ok(result);
+ } else {
+ log.warn("execute http method fail,httpStatus:{0}", response.getStatusLine().getStatusCode());
+ }
+ }
+ } catch (Exception e) {
+ log.error("execute exception", e);
+ } finally {
+ httpMethod.releaseConnection();
+ try {
+ if (response != null) {
+ response.close();
+ }
+ } catch (IOException e) {
+ }
+ }
+ return new Result().error(8000, "系统异常");
+ }
+}
+
+
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/IAcsClientUtil.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/IAcsClientUtil.java
new file mode 100644
index 0000000000..c0c8362727
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/IAcsClientUtil.java
@@ -0,0 +1,67 @@
+package com.epmet.openapi.scan.common.util;
+
+/**
+ * @author jianjun liu
+ * @date 2020-06-05 10:03
+ **/
+
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.epmet.openapi.scan.common.enu.RegionIdEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Slf4j
+@Component
+public class IAcsClientUtil {
+ private static String accessKeyId;
+ private static String secret;
+ private static String product = "Green";
+
+ private static String regionId;
+ private static String endpointName = "";
+
+ private static IClientProfile profile;
+
+
+ @PostConstruct
+ private void initProFile() {
+ profile = DefaultProfile.getProfile(regionId, accessKeyId, secret);
+ try {
+ DefaultProfile.addEndpoint(endpointName, regionId, product, RegionIdEnum.getDoMain(regionId));
+ } catch (ClientException e) {
+ log.error("initProFile exception", e.getMessage());
+ }
+ }
+
+
+ public static IAcsClient getIAcsClient() {
+ return new DefaultAcsClient(profile);
+ }
+
+ @Value("${aliyun.green.accessKeyId}")
+ public void setAccessKeyId(String accessKeyId) {
+ IAcsClientUtil.accessKeyId = accessKeyId;
+ }
+
+ @Value("${aliyun.green.accessKeySecret}")
+ public void setSecret(String secret) {
+ IAcsClientUtil.secret = secret;
+ }
+
+ @Value("${aliyun.green.regionId}")
+ public void setRegionId(String regionId) {
+ IAcsClientUtil.regionId = regionId;
+ }
+
+ @Value("${aliyun.green.regionId}")
+ public void setEndpointName(String endpointName) {
+ IAcsClientUtil.endpointName = endpointName;
+ }
+}
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/MapUtil.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/MapUtil.java
new file mode 100644
index 0000000000..e98dbfd7a2
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/common/util/MapUtil.java
@@ -0,0 +1,55 @@
+package com.epmet.openapi.scan.common.util;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author jianjun liu
+ * @date 2020-06-05 16:44
+ **/
+public class MapUtil {
+ /**
+ * 将url参数转换成map
+ *
+ * @param param aa=11&bb=22&cc=33
+ * @return
+ */
+ public static Map getUrlParams(String param) {
+ Map map = new HashMap<>(0);
+ if (StringUtils.isBlank(param)) {
+ return map;
+ }
+ String[] params = param.split("&");
+ for (int i = 0; i < params.length; i++) {
+ String[] p = params[i].split("=");
+ if (p.length == 2) {
+ map.put(p[0], p[1]);
+ }
+ }
+ return map;
+ }
+
+ /**
+ * 将map转换成url
+ *
+ * @param map
+ * @return
+ */
+ public static String getUrlParamsByMap(Map map) {
+ if (map == null) {
+ return "";
+ }
+ StringBuffer sb = new StringBuffer();
+ for (Map.Entry entry : map.entrySet()) {
+ sb.append(entry.getKey() + "=" + entry.getValue());
+ sb.append("&");
+ }
+ String s = sb.toString();
+ if (s.endsWith("&")) {
+ s = StringUtils.substringBeforeLast(s, "&");
+ }
+ return s;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/config/ModuleConfigImpl.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/config/ModuleConfigImpl.java
new file mode 100644
index 0000000000..68532b7819
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/config/ModuleConfigImpl.java
@@ -0,0 +1,26 @@
+/**
+ * Copyright (c) 2018 人人开源 All rights reserved.
+ *
+ * https://www.renren.io
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.epmet.openapi.scan.config;
+
+import com.epmet.commons.tools.config.ModuleConfig;
+import org.springframework.stereotype.Service;
+
+/**
+ * 模块配置信息
+ *
+ * @author Mark sunlightcs@gmail.com
+ * @since 1.0.0
+ */
+@Service
+public class ModuleConfigImpl implements ModuleConfig {
+ @Override
+ public String getName() {
+ return "epmetscan";
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/config/WebAppConfig.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/config/WebAppConfig.java
new file mode 100644
index 0000000000..c955a7f555
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/config/WebAppConfig.java
@@ -0,0 +1,31 @@
+package com.epmet.openapi.scan.config;
+
+import com.epmet.openapi.scan.interceptor.ScanApiAuthInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+/**
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-08 14:30
+ **/
+
+ @Configuration
+ public class WebAppConfig implements WebMvcConfigurer{
+ @Autowired
+ private ScanApiAuthInterceptor scanApiAuthInterceptor;
+
+ // 多个拦截器组成一个拦截器链
+ // addPathPatterns 用于添加拦截规则
+ // excludePathPatterns 用户排除拦截
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(scanApiAuthInterceptor)//添加拦截器
+ .addPathPatterns("/**") //拦截所有请求
+ .excludePathPatterns("/opback/**");//对应的不拦截的请求
+ }
+ }
+
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/controller/BackDoorController.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/controller/BackDoorController.java
new file mode 100644
index 0000000000..433ff1b06d
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/controller/BackDoorController.java
@@ -0,0 +1,32 @@
+package com.epmet.openapi.scan.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.epmet.openapi.scan.common.redis.RedisKeys;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.SetOperations;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Set;
+
+/**
+ * @author jianjun liu
+ * @date 2020-06-04 20:39
+ **/
+@RestController
+@RequestMapping("opback")
+public class BackDoorController {
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @RequestMapping("addWhite")
+ public String addWhite(@RequestParam String ip) {
+ SetOperations setOperations = redisTemplate.opsForSet();
+ String whiteList = RedisKeys.getWhiteList();
+ Long add = setOperations.add(whiteList, ip);
+ Set members = setOperations.members(whiteList);
+ return "ip:" + ip + "添加" + (add > 0 ? "成功" : "失败") + ",当前所有列表:" + JSON.toJSONString(members);
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/controller/ScanController.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/controller/ScanController.java
new file mode 100644
index 0000000000..cee27d28b8
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/controller/ScanController.java
@@ -0,0 +1,116 @@
+package com.epmet.openapi.scan.controller;
+
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.commons.tools.validator.ValidatorUtils;
+import com.epmet.openapi.scan.common.constant.SysConstant;
+import com.epmet.openapi.scan.common.enu.SysResponseEnum;
+import com.epmet.openapi.scan.service.impl.ScanService;
+import com.epmet.openapi.scan.support.param.ImgScanParam;
+import com.epmet.openapi.scan.support.param.TextScanParam;
+import com.epmet.openapi.scan.support.param.VoiceAsyncScanParam;
+import com.epmet.openapi.scan.support.param.video.VideoAsyncScanParam;
+import com.epmet.openapi.scan.support.result.ImgAsyncScanResult;
+import com.epmet.openapi.scan.support.result.SyncScanResult;
+import com.epmet.openapi.scan.support.result.VoiceAsyncScanResult;
+import com.epmet.openapi.scan.support.result.VoiceAsyncScanTaskResult;
+import com.epmet.openapi.scan.support.result.video.VideoAsyncScanTaskResultDTO;
+import com.epmet.openapi.scan.support.result.video.VideoResultDTO;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-05 10:39
+ **/
+@RestController
+@RequestMapping("api")
+public class ScanController {
+
+ @Autowired
+ private ScanService scanService;
+
+ /**
+ * desc:图片同步检测接口
+ *
+ * @param param
+ * @return
+ */
+ @RequestMapping("imgSyncScan")
+ public Result ImgSyncScan(@RequestBody ImgScanParam param) {
+ ValidatorUtils.validateEntity(param);
+ return scanService.sendSyncImgScan(param);
+ }
+
+ /**
+ * desc:文本同步检测接口
+ *
+ * @param param
+ * @return
+ */
+ @RequestMapping("textSyncScan")
+ public Result textSyncScan(@RequestBody TextScanParam param) {
+ ValidatorUtils.validateEntity(param);
+ return scanService.sendTextScan(param);
+ }
+
+ //@RequestMapping("imgAsyncScan")
+ public Result ImgAsyncScan(@RequestBody ImgScanParam param) {
+ return null;//scanService.sendASyncImgScan(param);
+ }
+
+
+ /**
+ * @description 语音异步检测
+ * @Date 2020/12/9 9:14
+ **/
+ @PostMapping("voiceAsyncScan")
+ public Result voiceAsyncScan(@RequestBody VoiceAsyncScanParam param){
+ ValidatorUtils.validateEntity(param);
+ return scanService.sendVoiceAsyncScan(param);
+ }
+
+ /**
+ * @param taskIds 要查询的异步检测任务的taskId列表。数组中的元素个数不超过100个
+ * @author yinzuomei
+ * @description 语音异步检测结果查询
+ * @Date 2020/12/9 11:16
+ **/
+ @PostMapping("voiceResults")
+ public Result> voiceResults(@RequestBody List taskIds){
+ return scanService.voiceResults(taskIds);
+ }
+
+ /**
+ * @author yinzuomei
+ * @description 视频检测-异步检测
+ **/
+ @PostMapping("videoAsyncScan")
+ public Result videoAsyncScan(@RequestBody VideoAsyncScanParam param) {
+ ValidatorUtils.validateEntity(param);
+ return scanService.videoAsyncScan(param);
+ }
+
+ /**
+ * @author yinzuomei
+ * @description 视频异步检测结果查询接口
+ **/
+ @PostMapping("videoResults")
+ public Result videoResults(@RequestBody List taskIds) {
+ if (CollectionUtils.isEmpty(taskIds)) {
+ return new Result<>();
+ }
+ //检测对象不能为空,且最多支持100个元素
+ if (org.springframework.util.CollectionUtils.isEmpty(taskIds) || taskIds.size() > SysConstant.MAX_TASK_SIZE) {
+ return new Result().error(SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getCode(),
+ SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getMsg().concat(SysConstant.MAX_TASK_SIZE.toString()));
+ }
+ return scanService.videoResults(taskIds);
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/interceptor/ScanApiAuthInterceptor.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/interceptor/ScanApiAuthInterceptor.java
new file mode 100644
index 0000000000..6ce851a45e
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/interceptor/ScanApiAuthInterceptor.java
@@ -0,0 +1,60 @@
+package com.epmet.openapi.scan.interceptor;
+
+import com.alibaba.fastjson.JSON;
+import com.epmet.commons.tools.exception.EpmetErrorCode;
+import com.epmet.commons.tools.utils.IpUtils;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.openapi.scan.common.redis.RedisKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.SetOperations;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * @author jianjun liu
+ * @date 2020-06-05 16:36
+ **/
+@Component
+public class ScanApiAuthInterceptor implements HandlerInterceptor {
+ private static final Logger log = LoggerFactory.getLogger(ScanApiAuthInterceptor.class);
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ String ip = IpUtils.getIpAddr(request);
+ SetOperations setOperations = redisTemplate.opsForSet();
+ if (!setOperations.isMember(RedisKeys.getWhiteList(), ip)) {
+ log.warn("preHandle ip:{} is not in whitelist", ip);
+ String result = JSON.toJSONString(new Result<>().error(EpmetErrorCode.ERR401.getCode(), EpmetErrorCode.ERR401.getMsg()));
+ responseJson(response, result);
+ return false;
+ }
+ return true;
+ }
+
+ private void responseJson(HttpServletResponse response, String json) throws Exception {
+ PrintWriter writer = null;
+ response.setCharacterEncoding("UTF-8");
+ response.setContentType("text/json; charset=utf-8");
+ try {
+ writer = response.getWriter();
+ writer.print(json);
+ } catch (IOException e) {
+ log.error(e.toString());
+ } finally {
+ if (writer != null) {
+ writer.close();
+ }
+ }
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/service/impl/ScanService.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/service/impl/ScanService.java
new file mode 100644
index 0000000000..4a3e734893
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/service/impl/ScanService.java
@@ -0,0 +1,69 @@
+package com.epmet.openapi.scan.service.impl;
+
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.openapi.scan.support.param.ImgScanParam;
+import com.epmet.openapi.scan.support.param.TextScanParam;
+import com.epmet.openapi.scan.support.param.VoiceAsyncScanParam;
+import com.epmet.openapi.scan.support.param.video.VideoAsyncScanParam;
+import com.epmet.openapi.scan.support.result.SyncScanResult;
+import com.epmet.openapi.scan.support.result.VoiceAsyncScanResult;
+import com.epmet.openapi.scan.support.result.VoiceAsyncScanTaskResult;
+import com.epmet.openapi.scan.support.result.video.VideoAsyncScanTaskResultDTO;
+import com.epmet.openapi.scan.support.result.video.VideoResultDTO;
+
+import java.util.List;
+
+/**
+ * desc:内容扫描接口
+ *
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-05 13:12
+ **/
+public interface ScanService {
+ /**
+ * desc:扫描文本内容 同步
+ * @param textScanParam
+ * @return ImgAsyncScanResult
+ */
+ public Result sendTextScan(TextScanParam textScanParam);
+
+
+ /**
+ * desc:扫描图片内容 同步
+ * @param imgScanParam
+ * @return
+ */
+ public Result sendSyncImgScan(ImgScanParam imgScanParam);
+
+ /**
+ * 语音异步检测
+ *
+ * @param param
+ * @return com.epmet.openapi.scan.support.result.VoiceAsyncScanTaskResult
+ */
+ Result sendVoiceAsyncScan(VoiceAsyncScanParam param);
+
+ /**
+ * 语音异步检测结果查询
+ *
+ * @param taskIds 要查询的异步检测任务的taskId列表。数组中的元素个数不超过100个
+ * @return com.epmet.openapi.scan.support.result.VoiceAsyncScanResult
+ */
+ Result> voiceResults(List taskIds);
+
+ /**
+ * desc:视频检测-异步检测
+ * @param videoAsyncScanParam
+ * @return 异步检测)返回数据:taskId<=>dataId
+ */
+ Result videoAsyncScan(VideoAsyncScanParam videoAsyncScanParam);
+
+ /**
+ * @param taskIds
+ * @author yinzuomei
+ * @description 视频异步检测结果查询接口
+ * @Date 2020/12/29 16:10
+ **/
+ Result videoResults(List taskIds);
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/service/impl/ScanServiceImpl.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/service/impl/ScanServiceImpl.java
new file mode 100644
index 0000000000..44dd0da3de
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/service/impl/ScanServiceImpl.java
@@ -0,0 +1,734 @@
+package com.epmet.openapi.scan.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.AcsRequest;
+import com.aliyuncs.green.model.v20180509.*;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.epmet.commons.tools.constant.NumConstant;
+import com.epmet.commons.tools.utils.ConvertUtils;
+import com.aliyuncs.http.MethodType;
+import com.epmet.commons.tools.utils.Result;
+import com.epmet.openapi.scan.common.constant.SysConstant;
+import com.epmet.openapi.scan.common.enu.*;
+import com.epmet.openapi.scan.common.exception.ExecuteHttpException;
+import com.epmet.openapi.scan.common.redis.RedisKeys;
+import com.epmet.openapi.scan.common.util.IAcsClientUtil;
+import com.epmet.openapi.scan.support.param.*;
+import com.epmet.openapi.scan.support.param.video.VideoAsyncScanParam;
+import com.epmet.openapi.scan.support.param.video.VideoAsyncScanTask;
+import com.epmet.openapi.scan.support.result.*;
+import com.epmet.openapi.scan.support.result.video.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.ListUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpStatus;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+/**
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-05 13:16
+ **/
+@Slf4j
+@Service
+public class ScanServiceImpl implements ScanService {
+ @Value("${aliyun.green.regionId}")
+ private String regionId;
+ @Value("${aliyun.green.bizType}")
+ private String bizType;
+ @Autowired
+ private RedisTemplate redisTemplate;
+ @Override
+ public Result sendTextScan(TextScanParam textScanParam) {
+ //默认参数
+ // 鉴黄 暴恐涉政
+ textScanParam.setScenes(TextSceneEnum.getTextSceneList());
+ textScanParam.setBizType(bizType);
+
+ List textTasks = textScanParam.getTasks();
+ if (CollectionUtils.isEmpty(textTasks) || textTasks.size() > SysConstant.MAX_TASK_SIZE) {
+ return new Result().error(SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getMsg().concat(SysConstant.MAX_TASK_SIZE.toString()));
+ }
+
+ TextScanRequest textScanRequest = getTextScanRequest();
+
+ try {
+ textScanRequest.setHttpContent(JSON.toJSONString(textScanParam).getBytes(SysConstant.UTF8), SysConstant.UTF8, FormatType.JSON);
+ } catch (UnsupportedEncodingException e) {
+ log.error("sendTextScan parse param exception", e);
+ return new Result().error(SysResponseEnum.SCAN_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_PARAM_ERROR.getMsg());
+ }
+
+ try {
+ SyncScanResult textScanResult = executeSyncText(textScanRequest);
+ return new Result().ok(textScanResult);
+ } catch (ExecuteHttpException e) {
+ log.error("sendTextScan execute Exception", e);
+ return new Result().error(e.getCode(), e.getMsg());
+ }
+ }
+
+ private TextScanRequest getTextScanRequest() {
+ TextScanRequest textScanRequest = new TextScanRequest();
+ textScanRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式
+ textScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法
+ textScanRequest.setEncoding(SysConstant.UTF8);
+ textScanRequest.setRegionId(regionId);
+ textScanRequest.setConnectTimeout(3000);
+ textScanRequest.setReadTimeout(6000);
+ return textScanRequest;
+ }
+
+ @Override
+ public Result sendSyncImgScan(ImgScanParam imgScanParam) {
+ //默认参数
+ // 鉴黄 暴恐涉政
+ imgScanParam.setScenes(ImgSceneEnum.getImgSceneList());
+ imgScanParam.setBizType(bizType);
+
+ List imgTasks = imgScanParam.getTasks();
+ if (CollectionUtils.isEmpty(imgTasks) || imgTasks.size() > SysConstant.MAX_TASK_SIZE) {
+ return new Result().error(SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getMsg().concat(SysConstant.MAX_TASK_SIZE.toString()));
+ }
+ if (imgTasks.size() <= SysConstant.MAX_SCAN_IMG_TASK_SIZE) {
+ return doScanImg(imgScanParam);
+ }
+ log.info("sendSyncImgScan tasks size:{} over 10", imgTasks.size());
+ List> partition = ListUtils.partition(imgTasks, SysConstant.MAX_SCAN_IMG_TASK_SIZE);
+ SyncScanResult finalResult = new SyncScanResult();
+ for (List tasks : partition) {
+ ImgScanParam scanParam = new ImgScanParam();
+ scanParam.setBizType(imgScanParam.getBizType());
+ scanParam.setScenes(imgScanParam.getScenes());
+ scanParam.setTasks(tasks);
+ scanParam.setCallback(imgScanParam.getCallback());
+ scanParam.setSeed(imgScanParam.getSeed());
+ Result partResult = doScanImg(scanParam);
+ try {
+ Thread.sleep(5L);
+ } catch (InterruptedException e) {
+ log.error("sendSyncImgScan InterruptedException");
+ }
+ if (partResult.success()) {
+ SyncScanResult data = partResult.getData();
+ finalResult.getSuccessDataIds().addAll(data.getSuccessDataIds());
+ finalResult.getFailDataIds().addAll(data.getFailDataIds());
+ finalResult.getDetails().addAll(data.getDetails());
+ } else {
+ return partResult;
+ }
+ }
+ return new Result().ok(finalResult);
+
+
+ }
+
+ private Result doScanImg(ImgScanParam imgScanParam) {
+ ImageSyncScanRequest imageSyncScanRequest = getImgScanRequest();
+ try {
+ imageSyncScanRequest.setHttpContent(JSON.toJSONString(imgScanParam).getBytes(SysConstant.UTF8), SysConstant.UTF8, FormatType.JSON);
+ } catch (UnsupportedEncodingException e) {
+ log.error("sendSyncImgScan parse param exception", e);
+ return new Result().error(SysResponseEnum.SCAN_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_PARAM_ERROR.getMsg());
+ }
+
+ try {
+ SyncScanResult scanResult = executeSyncImg(imageSyncScanRequest);
+ return new Result().ok(scanResult);
+ } catch (ExecuteHttpException e) {
+ log.error("sendImgScan execute exception,param:{},fail msg:{}", JSON.toJSONString(imgScanParam), e.getMsg());
+ return new Result().error(e.getCode(), e.getMsg());
+ }
+ }
+
+ private ImageSyncScanRequest getImgScanRequest() {
+ ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
+ imageSyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式
+ imageSyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法
+ imageSyncScanRequest.setEncoding(SysConstant.UTF8);
+ imageSyncScanRequest.setRegionId(regionId);
+ imageSyncScanRequest.setConnectTimeout(3000);
+ imageSyncScanRequest.setReadTimeout(6000);
+ return imageSyncScanRequest;
+ }
+
+ public SyncScanResult executeSyncText(AcsRequest> textScanRequest) {
+ SyncScanResult result = new SyncScanResult();
+ try {
+ HttpResponse httpResponse = IAcsClientUtil.getIAcsClient().doAction(textScanRequest);
+
+ if (httpResponse.isSuccess()) {
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), SysConstant.UTF8));
+ if (HttpStatus.SC_OK == scrResponse.getInteger(SysConstant.CODE)) {
+ //任务 列表
+ List scanTaskResults = scrResponse.getJSONArray(SysConstant.DATA).toJavaList(ScanTaskResult.class);
+ for (ScanTaskResult taskResult : scanTaskResults) {
+ result.getDetails().add(taskResult);
+ //又根据场景不同
+ if (HttpStatus.SC_OK != taskResult.getCode()) {
+ if (!result.getFailDataIds().contains(taskResult.getDataId())) {
+ result.getFailDataIds().add(taskResult.getDataId());
+ log.warn("executeSyncText task process fail:code:{},result:{}", taskResult.getCode(), JSON.toJSONString(taskResult));
+ }
+ continue;
+ }
+ //如果是多个场景 则为对个 BaseScanResult
+ List sceneResults = taskResult.getResults();
+ //是文本检测 目前就一种场景
+ boolean isSuccess = true;
+ for (SceneDetailResult sceneResult : sceneResults) {
+ String suggestion = sceneResult.getSuggestion();
+ if (SuggestionEnum.BLOCK.getCode().equals(suggestion)) {
+ isSuccess = false;
+ break;
+ }
+ }
+ if (isSuccess) {
+ result.getSuccessDataIds().add(taskResult.getDataId());
+ } else {
+ log.warn("executeSyncText dataId:{} block:{}", taskResult.getDataId(), JSON.toJSONString(taskResult.getResults()));
+ result.getFailDataIds().add(taskResult.getDataId());
+ }
+ }
+ return result;
+ } else {
+ log.warn("executeSyncText response not success. code:{}", scrResponse.getInteger(SysConstant.CODE));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } else {
+ log.warn("executeSyncText response status is not success. httpResponse:{}", JSON.toJSONString(httpResponse));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ log.error("executeSyncText exception IAcsClientUtil do action exception", e);
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getMsg());
+ }
+ }
+
+ private SyncScanResult executeSyncImg(AcsRequest> request) {
+ SyncScanResult result = new SyncScanResult();
+ try {
+ HttpResponse httpResponse = IAcsClientUtil.getIAcsClient().doAction(request);
+ if (httpResponse.isSuccess()) {
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), SysConstant.UTF8));
+ if (HttpStatus.SC_OK == scrResponse.getInteger(SysConstant.CODE)) {
+ JSONArray taskResults = scrResponse.getJSONArray(SysConstant.DATA);
+ List scanTaskResults = taskResults.toJavaList(ScanTaskResult.class);
+ for (ScanTaskResult taskResult : scanTaskResults) {
+ result.getDetails().add(taskResult);
+ if (HttpStatus.SC_OK != taskResult.getCode()) {
+ if (!result.getFailDataIds().contains(taskResult.getDataId())) {
+ result.getFailDataIds().add(taskResult.getDataId());
+ log.warn("executeSyncImg detect not success. code:{},result:{}", taskResult.getCode(), JSON.toJSONString(taskResult));
+ }
+ continue;
+ }
+ //如果是多个场景 则为对个 BaseScanResult
+ List sceneResults = taskResult.getResults();
+
+ boolean isSuccess = true;
+ for (SceneDetailResult sceneResult : sceneResults) {
+ String suggestion = sceneResult.getSuggestion();
+ if (SuggestionEnum.BLOCK.getCode().equals(suggestion)) {
+ isSuccess = false;
+ break;
+ }
+ }
+ if (isSuccess) {
+ result.getSuccessDataIds().add(taskResult.getDataId());
+ } else {
+ log.warn("executeSyncImg dataId:{} block:{}", taskResult.getDataId(), JSON.toJSONString(taskResult.getResults()));
+ result.getFailDataIds().add(taskResult.getDataId());
+ }
+ }
+ return result;
+ } else {
+ log.warn("executeSyncImg detect not success. code:{}", scrResponse.getInteger(SysConstant.CODE));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } else {
+ log.warn("executeSyncImg response status is not success. httpResponse:{}", JSON.toJSONString(httpResponse));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ log.error("executeSyncImg exception IAcsClientUtil do action exception", e);
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getMsg());
+ }
+ }
+
+ /**
+ * @author yinzuomei
+ * @description 语音异步检测
+ * @Date 2020/12/9 10:02
+ */
+ @Override
+ public Result sendVoiceAsyncScan(VoiceAsyncScanParam voiceAsyncScanParam) {
+ //检测对象不能为空,且最多支持100个元素
+ List voiceTasks = voiceAsyncScanParam.getTasks();
+ if (CollectionUtils.isEmpty(voiceTasks) || voiceTasks.size() > SysConstant.MAX_TASK_SIZE) {
+ return new Result().error(SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getCode(),
+ SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getMsg().concat(SysConstant.MAX_TASK_SIZE.toString()));
+ }
+
+ //默认参数
+ voiceAsyncScanParam.setScenes(VoiceSceneEnum.getVoiceSceneList());
+ voiceAsyncScanParam.setBizType(bizType);
+ // 如果是语音流检测,则修改为true。现在默认为音频文件检测false
+ voiceAsyncScanParam.setLive(false);
+ voiceAsyncScanParam.setSeed(UUID.randomUUID().toString().replace("-", ""));
+
+ VoiceAsyncScanRequest voiceAsyncScanRequest=getVoiceAsyncScanRequest();
+
+ try {
+ voiceAsyncScanRequest.setHttpContent(JSON.toJSONString(voiceAsyncScanParam).getBytes(SysConstant.UTF8), SysConstant.UTF8, FormatType.JSON);
+ } catch (UnsupportedEncodingException e) {
+ log.error("sendVoiceAsyncScan parse param exception", e);
+ return new Result().error(SysResponseEnum.SCAN_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_PARAM_ERROR.getMsg());
+ }
+ log.info("语音异步检测入参:"+JSON.toJSONString(voiceAsyncScanParam,true));
+ List taskList;
+ try {
+ taskList = executeSyncVoice(voiceAsyncScanRequest);
+ log.info("语音异步检测返参taskList:"+JSON.toJSONString(taskList,true));
+ } catch (ExecuteHttpException e) {
+ log.error("sendVoiceAsyncScan execute Exception", e);
+ return new Result().error(e.getCode(), e.getMsg());
+ }
+ //成功返回
+ VoiceAsyncScanTaskResult resultDto=new VoiceAsyncScanTaskResult();
+ resultDto.setSeed(voiceAsyncScanParam.getSeed());
+ List successList = new ArrayList<>();
+ List failedList = new ArrayList<>();
+ taskList.forEach(taskDetail -> {
+ if (HttpStatus.SC_OK == taskDetail.getCode()) {
+ successList.add(taskDetail);
+ } else {
+ failedList.add(taskDetail);
+ }
+ });
+ resultDto.setSuccessTasks(successList);
+ resultDto.setFailTasks(failedList);
+ resultDto.setAllSuccess(resultDto.isAllSuccess());
+ if (StringUtils.isNotBlank(voiceAsyncScanParam.getCallback())) {
+ // 存储seed和 任务id、dataId的关系 用于回调鉴权
+ log.info("need to save seed and taskId、dataId的关系");
+ ValueOperations valueOperations=redisTemplate.opsForValue();
+ taskList.forEach(task -> {
+ String seedKey = RedisKeys.getVoiceScanSeedKey(task.getTaskId());
+ valueOperations.set(seedKey,voiceAsyncScanParam.getSeed());
+ });
+ }
+ return new Result().ok(resultDto);
+ }
+
+ /**
+ * @param
+ * @author yinzuomei
+ * @description 构造语音异步检测请求对象
+ * @Date 2020/12/9 10:44
+ **/
+ private VoiceAsyncScanRequest getVoiceAsyncScanRequest() {
+ VoiceAsyncScanRequest voiceAsyncScanRequest = new VoiceAsyncScanRequest();
+ // 指定api返回格式
+ voiceAsyncScanRequest.setAcceptFormat(FormatType.JSON);
+ // 指定请求方法
+ voiceAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST);
+ voiceAsyncScanRequest.setEncoding(SysConstant.UTF8);
+ voiceAsyncScanRequest.setRegionId(regionId);
+ voiceAsyncScanRequest.setConnectTimeout(3000);
+ voiceAsyncScanRequest.setReadTimeout(6000);
+ return voiceAsyncScanRequest;
+ }
+
+ /**
+ * @param voiceAsyncScanRequest
+ * @author yinzuomei
+ * @description 解析返参
+ * @Date 2020/12/9 10:44
+ **/
+ private List executeSyncVoice(AcsRequest> voiceAsyncScanRequest) {
+ try {
+ HttpResponse httpResponse = IAcsClientUtil.getIAcsClient().doAction(voiceAsyncScanRequest);
+
+ if (httpResponse.isSuccess()) {
+
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ //后面注释掉此日志
+ log.info("VoiceAsyncScanRequest原生接口返参:" + JSON.toJSONString(scrResponse, true));
+
+ if (HttpStatus.SC_OK == scrResponse.getInteger(SysConstant.CODE)) {
+
+ //获取data列表
+ JSONArray dataResults = scrResponse.getJSONArray(SysConstant.DATA);
+ List resultList = dataResults.toJavaList(VoiceAsyncScanTaskDataDTO.class);
+ //成功返回
+ return resultList;
+
+ } else {
+
+ log.warn("executeSyncVoice detect not success. code:{}", scrResponse.getInteger(SysConstant.CODE));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+
+ } else {
+ log.warn("executeSyncVoice response status is not success. httpResponse:{}", JSON.toJSONString(httpResponse));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+
+ } catch (Exception e) {
+ log.error("executeSyncVoice exception IAcsClientUtil do action exception", e);
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getMsg());
+ }
+ }
+
+
+ /**
+ * @param taskIds 要查询的异步检测任务的taskId列表。数组中的元素个数不超过100个
+ * @author yinzuomei
+ * @description 语音异步检测结果查询
+ * @Date 2020/12/9 11:17
+ **/
+ @Override
+ public Result> voiceResults(List taskIds) {
+ //检测对象不能为空,且最多支持100个元素
+ if (CollectionUtils.isEmpty(taskIds) || taskIds.size() > SysConstant.MAX_TASK_SIZE) {
+ return new Result>().error(SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getCode(),
+ SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getMsg().concat(SysConstant.MAX_TASK_SIZE.toString()));
+ }
+
+ VoiceAsyncScanResultsRequest request=getVoiceAsyncScanResultsRequest();
+ try {
+ request.setHttpContent(JSON.toJSONString(taskIds).getBytes(SysConstant.UTF8), SysConstant.UTF8, FormatType.JSON);
+ } catch (UnsupportedEncodingException e) {
+ log.error("voiceResults parse param exception", e);
+ return new Result>().error(SysResponseEnum.SCAN_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_PARAM_ERROR.getMsg());
+ }
+
+ // log.info("语音异步检测结果查询入参:"+JSON.toJSONString(taskIds,true));
+
+ try {
+ HttpResponse httpResponse = IAcsClientUtil.getIAcsClient().doAction(request);
+ if (httpResponse.isSuccess()) {
+
+ JSONObject scrResponse=JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ //后面注释掉此返参
+ log.info("VoiceAsyncScanResultsRequest原生接口返参:"+JSON.toJSONString(scrResponse, true));
+ if (HttpStatus.SC_OK == scrResponse.getInteger(SysConstant.CODE)) {
+ //获取data列表
+ JSONArray dataResults = scrResponse.getJSONArray(SysConstant.DATA);
+ List resultList = dataResults.toJavaList(VoiceAsyncScanResult.class);
+ List resultData=processVoiceAsyncScanResult(resultList);
+ //成功返回
+ return new Result>().ok(resultData);
+
+ }else{
+
+ log.warn("voiceResults detect not success. code:{}", scrResponse.getInteger(SysConstant.CODE));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+
+ } else {
+ log.warn("语音异步检测结果查询预警 getVoiceAsyncScanResult response status is not success. httpResponse:{}", JSON.toJSONString(httpResponse));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ log.error("voiceResults exception IAcsClientUtil do action exception", e);
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getMsg());
+ }
+
+ }
+
+ private List processVoiceAsyncScanResult(List resultList) {
+ List list = new ArrayList<>();
+ for (VoiceAsyncScanResult voiceAsyncScanResult : resultList) {
+ if (SysConstant.PROCESSING == voiceAsyncScanResult.getCode()) {
+ //280:表示处理中,需要继续轮询
+ continue;
+ }
+ VoiceAsyncScanResult dto = ConvertUtils.sourceToTarget(voiceAsyncScanResult, VoiceAsyncScanResult.class);
+ if (HttpStatus.SC_OK == voiceAsyncScanResult.getCode()) {
+ if (!CollectionUtils.isEmpty(voiceAsyncScanResult.getResults()) && voiceAsyncScanResult.getResults().size() > NumConstant.ZERO) {
+ //目前只有一个检测场景,所以只判断返回来的第一个场景
+ VoiceAsyncScanResultDTO voiceAsyncScanResultDTO = voiceAsyncScanResult.getResults().get(NumConstant.ZERO);
+ if (null != voiceAsyncScanResultDTO) {
+ dto.setLabel(voiceAsyncScanResultDTO.getLabel());
+ dto.setLabelDesc(LabelEnum.getDesc(voiceAsyncScanResultDTO.getLabel()));
+ dto.setSuggestion(voiceAsyncScanResultDTO.getSuggestion());
+ }
+ }
+ } else if(HttpStatus.SC_NOT_FOUND == voiceAsyncScanResult.getCode()) {
+ dto.setSuggestion(SuggestionEnum.REVIEW.getCode());
+ dto.setLabel(NumConstant.EMPTY_STR);
+ dto.setLabelDesc("智能检测任务失败,结果已失效," + SuggestionEnum.REVIEW.getDesc());
+ }else{
+ //其他:表示任务失败
+ dto.setSuggestion(SuggestionEnum.REVIEW.getCode());
+ dto.setLabel(NumConstant.EMPTY_STR);
+ dto.setLabelDesc("智能检测任务失败," + SuggestionEnum.REVIEW.getDesc());
+ }
+ list.add(dto);
+ }
+ return list;
+ }
+
+ private VoiceAsyncScanResultsRequest getVoiceAsyncScanResultsRequest(){
+ VoiceAsyncScanResultsRequest getResultsRequest = new VoiceAsyncScanResultsRequest();
+ // 指定API返回格式。
+ getResultsRequest.setAcceptFormat(FormatType.JSON);
+ // 指定请求方法。
+ getResultsRequest.setMethod(com.aliyuncs.http.MethodType.POST);
+ getResultsRequest.setEncoding(SysConstant.UTF8);
+ getResultsRequest.setRegionId(regionId);
+ /**
+ * 请务必设置超时时间。
+ */
+ getResultsRequest.setConnectTimeout(3000);
+ getResultsRequest.setReadTimeout(6000);
+ return getResultsRequest;
+ }
+
+ /**
+ * desc:视频检测-异步检测
+ *
+ * @param videoAsyncScanParam
+ * @return
+ */
+ @Override
+ public Result videoAsyncScan(VideoAsyncScanParam videoAsyncScanParam) {
+ //一次至多提交100个检测对象
+ List videoTasks = videoAsyncScanParam.getTasks();
+ if (CollectionUtils.isEmpty(videoTasks) || videoTasks.size() > SysConstant.MAX_TASK_SIZE) {
+ return new Result().error(SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_TASK_LIST_PARAM_ERROR.getMsg().concat(SysConstant.MAX_TASK_SIZE.toString()));
+ }
+ //默认参数赋值
+ videoAsyncScanParam.setScenes(VideoSceneEnum.getVideoSceneList());
+ videoAsyncScanParam.setBizType(bizType);
+ videoAsyncScanParam.setAudioScenes(VoiceSceneEnum.getVoiceSceneList());
+ videoAsyncScanParam.setSeed(UUID.randomUUID().toString().replace("-", ""));
+ //API文档没写限制多少最大多少,应该与图片一致
+ if (videoTasks.size() <= SysConstant.MAX_SCAN_IMG_TASK_SIZE) {
+ return doScanVideo(videoAsyncScanParam);
+ }
+ log.info("videoAsyncScan tasks size:{} over 10", videoTasks.size());
+ //分组调用,一次提交10个
+ List> partition = ListUtils.partition(videoTasks, SysConstant.MAX_SCAN_IMG_TASK_SIZE);
+ VideoAsyncScanTaskResultDTO finalResult = new VideoAsyncScanTaskResultDTO();
+ for (List tasks : partition) {
+ VideoAsyncScanParam videParam = new VideoAsyncScanParam();
+ videParam.setBizType(videoAsyncScanParam.getBizType());
+ videParam.setScenes(videoAsyncScanParam.getScenes());
+ videParam.setTasks(tasks);
+ videParam.setCallback(videoAsyncScanParam.getCallback());
+ videParam.setSeed(videoAsyncScanParam.getSeed());
+ videParam.setAudioScenes(videoAsyncScanParam.getAudioScenes());
+ Result partResult = doScanVideo(videParam);
+ try {
+ Thread.sleep(5L);
+ } catch (InterruptedException e) {
+ log.error("videoAsyncScan InterruptedException");
+ }
+ if (partResult.success()) {
+ VideoAsyncScanTaskResultDTO data = partResult.getData();
+ finalResult.setSeed(data.getSeed());
+ finalResult.getSuccessTasks().addAll(data.getSuccessTasks());
+ finalResult.getFailTasks().addAll(data.getFailTasks());
+ } else {
+ return partResult;
+ }
+ }
+ return new Result().ok(finalResult);
+ }
+
+ private Result doScanVideo(VideoAsyncScanParam videoAsyncScanParam) {
+ VideoAsyncScanRequest videoAsyncScanRequest = getVideoAsyncScanRequest();
+ try {
+ videoAsyncScanRequest.setHttpContent(JSON.toJSONString(videoAsyncScanParam).getBytes(SysConstant.UTF8), SysConstant.UTF8, FormatType.JSON);
+ } catch (UnsupportedEncodingException e) {
+ log.error("doScanVideo parse param exception", e);
+ return new Result().error(SysResponseEnum.SCAN_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_PARAM_ERROR.getMsg());
+ }
+
+ try {
+ VideoAsyncScanTaskResultDTO scanResult = executeAsyncVideo(videoAsyncScanRequest);
+ scanResult.setSeed(videoAsyncScanParam.getSeed());
+ return new Result().ok(scanResult);
+ } catch (ExecuteHttpException e) {
+ log.error("doScanVideo execute exception,param:{},fail msg:{}", JSON.toJSONString(videoAsyncScanParam), e.getMsg());
+ return new Result().error(e.getCode(), e.getMsg());
+ }
+ }
+
+ private VideoAsyncScanRequest getVideoAsyncScanRequest() {
+ VideoAsyncScanRequest videoAsyncScanRequest = new VideoAsyncScanRequest();
+ videoAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。
+ videoAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法。
+ /**
+ * 请务必设置超时时间。
+ */
+ videoAsyncScanRequest.setConnectTimeout(3000);
+ videoAsyncScanRequest.setReadTimeout(6000);
+ return videoAsyncScanRequest;
+ }
+
+ private VideoAsyncScanTaskResultDTO executeAsyncVideo(VideoAsyncScanRequest videoAsyncScanRequest) {
+ try {
+ HttpResponse httpResponse = IAcsClientUtil.getIAcsClient().doAction(videoAsyncScanRequest);
+ if (httpResponse.isSuccess()) {
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ if (HttpStatus.SC_OK == scrResponse.getInteger(SysConstant.CODE)) {
+ //获取data列表
+ JSONArray dataResults = scrResponse.getJSONArray(SysConstant.DATA);
+ List dataList = dataResults.toJavaList(VideoAsyncScanTaskDataDTO.class);
+ VideoAsyncScanTaskResultDTO result=new VideoAsyncScanTaskResultDTO();
+ dataList.forEach(data->{
+ if (HttpStatus.SC_OK == data.getCode()) {
+ result.getSuccessTasks().add(data);
+ } else {
+ result.getFailTasks().add(data);
+ }
+ });
+ return result;
+ } else {
+ log.warn("executeAsyncVideo detect not success. code:{}", scrResponse.getInteger(SysConstant.CODE));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } else {
+ log.warn("executeAsyncVideo response status is not success. httpResponse:{}", JSON.toJSONString(httpResponse));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ log.error("executeAsyncVideo exception IAcsClientUtil do action exception", e);
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getMsg());
+ }
+ }
+
+ /**
+ * @param taskIds
+ * @author yinzuomei
+ * @description 视频异步检测结果查询接口
+ * @Date 2020/12/29 16:10
+ **/
+ @Override
+ public Result videoResults(List taskIds) {
+ VideoAsyncScanResultsRequest videoAsyncScanResultsRequest = new VideoAsyncScanResultsRequest();
+ videoAsyncScanResultsRequest.setAcceptFormat(FormatType.JSON);
+ videoAsyncScanResultsRequest.setMethod(com.aliyuncs.http.MethodType.POST);
+ videoAsyncScanResultsRequest.setConnectTimeout(3000);
+ videoAsyncScanResultsRequest.setReadTimeout(6000);
+ try {
+ videoAsyncScanResultsRequest.setHttpContent(JSON.toJSONString(taskIds).getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+ } catch (UnsupportedEncodingException e) {
+ log.error("videoResults parse param exception", e);
+ return new Result().error(SysResponseEnum.SCAN_PARAM_ERROR.getCode(), SysResponseEnum.SCAN_PARAM_ERROR.getMsg());
+ }
+ try {
+ HttpResponse httpResponse = IAcsClientUtil.getIAcsClient().doAction(videoAsyncScanResultsRequest);
+ if (httpResponse.isSuccess()) {
+ JSONObject responseObject = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ log.info("查询视频检测结果返参"+JSON.toJSONString(responseObject));
+ if (HttpStatus.SC_OK == responseObject.getInteger(SysConstant.CODE)) {
+ //获取data列表
+ JSONArray dataResults = responseObject.getJSONArray(SysConstant.DATA);
+ List resultList = dataResults.toJavaList(VideoScanOriginalResultDTO.class);
+ //解析数据
+ VideoResultDTO resultDTO = processVideoResults(resultList);
+ //成功返回
+ return new Result().ok(resultDTO);
+ } else {
+ log.warn("查询视频检测结果,接口返回code=" + responseObject.getInteger(SysConstant.CODE));
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_CODE_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } else {
+ log.warn("查询视频检测结果,API返回失败");
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getCode(),
+ SysResponseEnum.THIRD_PLATFORM_RESP_STATUS_ERROR.getMsg() + ",status:" + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ log.error("videoResults exception ", e);
+ throw new ExecuteHttpException(SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getCode(), SysResponseEnum.THIRD_PLATFORM_SERVER_ERROR.getMsg());
+ }
+ }
+
+ /**
+ * @author yinzuomei
+ * @description
+ **/
+ private VideoResultDTO processVideoResults(List resultList) {
+ VideoResultDTO videoResultDTO = new VideoResultDTO();
+ resultList.forEach(result -> {
+ result.setCodeDesc(CommonErrorCodeEnum.getErrorMsg(result.getCode()));
+ if (result.getCode().equals(CommonErrorCodeEnum.PROCESSING.getCode())) {
+ //任务正在检测中,继续轮询
+ } else if (result.getCode().equals(CommonErrorCodeEnum.OK.getCode())) {
+ //成功=>分析结果
+ boolean videoPassFlag = getVideoFlag(result.getResults());
+ boolean voicePassFlag = getVoiceFlag(result.getAudioScanResults());
+ if (videoPassFlag && voicePassFlag) {
+ videoResultDTO.getPassDataIds().add(result.getDataId());
+ videoResultDTO.getPassTaskIds().add(result.getTaskId());
+ } else {
+ videoResultDTO.getNoPassDataIds().add(result.getDataId());
+ videoResultDTO.getNoPassTaskIds().add(result.getTaskId());
+ }
+ } else {
+ //检测结果走丢了.... (*^▽^*) 默认失败
+ videoResultDTO.getNoPassDataIds().add(result.getDataId());
+ videoResultDTO.getNoPassTaskIds().add(result.getTaskId());
+ }
+ });
+ videoResultDTO.setDetails(resultList);
+ return videoResultDTO;
+ }
+
+ /**
+ * @return boolean
+ * @author yinzuomei
+ * @description 视频检测结果判断
+ **/
+ private boolean getVideoFlag(List results) {
+ for(VideoScanOriginDetail videoRes:results){
+ if (!SuggestionEnum.PASS.getCode().equals(videoRes.getSuggestion())) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * @return boolean true:内容通过; 建议为内容违规或者需要人工审核的统一视为不通过,返回false
+ * @author yinzuomei
+ * @description 返回视频语音检测结果
+ **/
+ private boolean getVoiceFlag(List audioScanResults) {
+ if (CollectionUtils.isEmpty(audioScanResults)) {
+ return true;
+ }
+ for(VoiceAsyncScanResultDTO m:audioScanResults){
+ //人工审核或者内容违规,统一视为不通过
+ if (!SuggestionEnum.PASS.getCode().equals(m.getSuggestion())) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/ImgScanParam.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/ImgScanParam.java
new file mode 100644
index 0000000000..82036797e3
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/ImgScanParam.java
@@ -0,0 +1,48 @@
+package com.epmet.openapi.scan.support.param;
+
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 审查参数
+ *
+ * @author jianjun liu
+ * @date 2020-06-04 21:57
+ **/
+@Data
+public class ImgScanParam implements Serializable {
+
+ private static final long serialVersionUID = 958801658335909745L;
+ /**
+ * 业务类型
+ */
+ private String bizType;
+ /**
+ * 场景 必填
+ *
+ * @see com.epmet.openapi.scan.common.enu.ImgSceneEnum;
+ */
+ private List scenes;
+
+ /**
+ * 要检测的内容列表,必填
+ * remark:一组任务列表中的taskId不能相同
+ */
+ @Valid
+ @NotEmpty(message = "任务列表不能为空")
+ private List tasks;
+
+ /**
+ * 异步检测结果回调地址,执行异步审查内容时 必填
+ */
+ private String callback;
+
+ /**
+ * 随机字符串,该值用于回调通知请求中的签名,使用callback时 必填
+ */
+ private String seed;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/ImgTask.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/ImgTask.java
new file mode 100644
index 0000000000..487485b7fc
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/ImgTask.java
@@ -0,0 +1,31 @@
+package com.epmet.openapi.scan.support.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 任务参数
+ *
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-04 22:13
+ **/
+@Data
+public class ImgTask implements Serializable {
+
+ private static final long serialVersionUID = -747206284930578105L;
+ /**
+ * 要检测的数据id 非必填
+ *
+ * */
+ @NotBlank(message = "dataId不能为空")
+ private String dataId;
+
+ /**
+ * 图片url 必填
+ */
+ @NotBlank(message = "图片URL不能为空")
+ private String url;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/TextScanParam.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/TextScanParam.java
new file mode 100644
index 0000000000..2b05d34e20
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/TextScanParam.java
@@ -0,0 +1,48 @@
+package com.epmet.openapi.scan.support.param;
+
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 文本审查参数
+ *
+ * @author jianjun liu
+ * @date 2020-06-05 11:17
+ **/
+@Data
+public class TextScanParam implements Serializable {
+ private static final long serialVersionUID = -3568903097975113166L;
+
+ /**
+ * 业务类型
+ */
+ private String bizType;
+ /**
+ * 场景 必填
+ *
+ * @see com.epmet.openapi.scan.common.enu.ImgSceneEnum;
+ */
+ private List scenes;
+
+ /**
+ * 要检测的内容列表,必填
+ * remark:一组任务列表中的taskId不能相同
+ */
+ @Valid
+ @NotEmpty(message = "任务列表不能为空")
+ private List tasks;
+
+ /**
+ * 异步检测结果回调地址,执行异步审查内容时 必填
+ */
+ private String callback;
+
+ /**
+ * 随机字符串,该值用于回调通知请求中的签名,使用callback时 必填
+ */
+ private String seed;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/TextTask.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/TextTask.java
new file mode 100644
index 0000000000..08215e3e5b
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/TextTask.java
@@ -0,0 +1,33 @@
+package com.epmet.openapi.scan.support.param;
+
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 任务参数
+ *
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-04 22:13
+ **/
+@Data
+public class TextTask implements Serializable {
+
+ private static final long serialVersionUID = 6957195274696018630L;
+ /**
+ * 要检测的数据id 非必填
+ *
+ * */
+ @NotBlank(message = "dataId不能为空")
+ private String dataId;
+
+ /**
+ * 文本内容 必填 最多不能超过10000
+ */
+ @NotBlank(message = "待检测文本不能为空")
+ @Length(max = 10000,message = "待检测文本最大为10000")
+ private String content;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/VoiceAsyncScanParam.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/VoiceAsyncScanParam.java
new file mode 100644
index 0000000000..baa8e51be0
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/VoiceAsyncScanParam.java
@@ -0,0 +1,68 @@
+package com.epmet.openapi.scan.support.param;
+
+import lombok.Data;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 音频审查 入参
+ * 参考文档:https://help.aliyun.com/document_detail/89630.html?spm=a2c4g.11186623.2.12.51a32dbfW6AdqV#reference-bcf-3nk-z2b
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 9:07
+ */
+@Data
+public class VoiceAsyncScanParam implements Serializable {
+ private static final long serialVersionUID = 3408043673247901184L;
+
+ /**
+ * 是否开启回调
+ */
+ private Boolean openCallBack;
+
+ /**
+ * 不必填
+ * 该字段用于标识您的业务场景。您可以通过内容安全控制台创建业务场景(具体操作,请参见自定义机审标准),或者提交工单联系我们帮助您创建业务场景。
+ */
+ private String bizType;
+
+ /**
+ * 必填
+ * 检测场景,取值:antispam。
+ */
+ private List scenes;
+
+ /**
+ * 不必填
+ * 是否为语音流(例如直播流)检测。取值:
+ * true:表示语音流检测。
+ * false(默认):表示音频文件检测。
+ */
+ private Boolean live;
+
+ /**
+ * 不必填
+ * 是否为近线检测模式。 取值:
+ * true:表示近线检测模式。近线检测模式下,您提交的任务不保证能够实时处理,但是可以排队并在24小时内开始检测。
+ * false(默认):表示实时检测模式。对于超过了并发路数限制的检测请求会直接拒绝。
+ * 说明 该参数仅适用于音频文件检测,不适用于语音流检测。
+ */
+ private Boolean offline;
+
+ /**
+ * 异步检测结果回调地址,执行异步审查内容时 必填
+ */
+ private String callback;
+
+ /**
+ * 随机字符串,该值用于回调通知请求中的签名,使用callback时 必填
+ */
+ private String seed;
+
+ @Valid
+ @NotEmpty(message = "任务列表不能为空")
+ private List tasks;
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/VoiceTask.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/VoiceTask.java
new file mode 100644
index 0000000000..89f4333bba
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/VoiceTask.java
@@ -0,0 +1,31 @@
+package com.epmet.openapi.scan.support.param;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 语音异步检测 对象
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 10:16
+ */
+@Data
+public class VoiceTask implements Serializable {
+ /**
+ * 不必填
+ * 要检测的数据id 非必填
+ * 检测对象对应的数据ID。
+ * 由大小写英文字母、数字、下划线(_)、短划线(-)、英文句号(.)组成,不超过128个字符,可以用于唯一标识您的业务数据。
+ * */
+ @NotBlank(message = "dataId不能为空")
+ private String dataId;
+
+ /**
+ * 必填
+ * 需要检测的音频文件或语音流的下载地址。
+ */
+ @NotBlank(message = "音频URL不能为空")
+ private String url;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/video/VideoAsyncScanParam.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/video/VideoAsyncScanParam.java
new file mode 100644
index 0000000000..c0315f8c17
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/video/VideoAsyncScanParam.java
@@ -0,0 +1,76 @@
+package com.epmet.openapi.scan.support.param.video;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotEmpty;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 视频审核-异步检测入参DTO
+ *
+ * @author yinzuomei@elink-cn.com
+ */
+@Data
+public class VideoAsyncScanParam implements Serializable {
+ private static final long serialVersionUID = -7635290200099445362L;
+
+ /**
+ * 是否开启回调
+ */
+ private Boolean openCallBack;
+
+ /**
+ * 不必填
+ * 该字段用于标识您的业务场景。您可以通过内容安全控制台创建业务场景(具体操作,请参见自定义机审标准),或者提交工单联系我们帮助您创建业务场景。
+ */
+ private String bizType;
+
+ /**
+ * 不必填
+ * 是否为语音流(例如直播流)检测。取值:
+ * true:表示语音流检测。
+ * false(默认):表示音频文件检测。
+ */
+ private Boolean live;
+
+ /**
+ * 不必填
+ * 是否为近线检测模式。 取值:
+ * true:表示近线检测模式。近线检测模式下,您提交的任务不保证能够实时处理,但是可以排队并在24小时内开始检测。
+ * false(默认):表示实时检测模式。对于超过了并发路数限制的检测请求会直接拒绝。
+ * 说明 该参数仅适用于音频文件检测,不适用于语音流检测。
+ */
+ private Boolean offline;
+
+ /**
+ * 必填
+ * 指定视频检测场景。取值:
+ * porn:视频智能鉴黄
+ * terrorism:视频暴恐涉政
+ * live:视频不良场景
+ * logo:视频logo
+ * ad:视频图文违规
+ */
+ private List scenes;
+
+ /**
+ * 不必填
+ * 指定视频语音检测场景,唯一取值:antispam,表示语音反垃圾。不传入该参数时仅检测视频图像内容;如果传入该参数,则在检测视频中图像的同时,对视频中语音进行检测。
+ * 说明 如果需要检测视频语音,则不支持通过上传视频截帧序列的方式(即在task中传入frames)进行检测,您必须传入视频或视频流的URL地址(即在task中传入url)进行检测。
+ */
+ private List audioScenes;
+
+ /**
+ * 异步检测结果回调地址,执行异步审查内容时 必填
+ */
+ private String callback;
+
+ /**
+ * 随机字符串,该值用于回调通知请求中的签名,使用callback时 必填
+ */
+ private String seed;
+
+ @NotEmpty(message = "检测对象不能为空")
+ private List tasks;
+}
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/video/VideoAsyncScanTask.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/video/VideoAsyncScanTask.java
new file mode 100644
index 0000000000..38a4584d94
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/param/video/VideoAsyncScanTask.java
@@ -0,0 +1,30 @@
+package com.epmet.openapi.scan.support.param.video;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import java.io.Serializable;
+
+/**
+ * 视频审核-异步检测入参-检测对象
+ *
+ * @author yinzuomei@elink-cn.com
+ */
+@Data
+public class VideoAsyncScanTask implements Serializable {
+ /**
+ * 建议必填
+ * 要检测的数据id 非必填
+ * 检测对象对应的数据ID。
+ * 由大小写英文字母、数字、下划线(_)、短划线(-)、英文句号(.)组成,不超过128个字符,可以用于唯一标识您的业务数据。
+ * */
+ @NotBlank(message = "dataId不能为空")
+ private String dataId;
+
+ /**
+ * 必填
+ * 待检测视频的URL。该字段不能和frames同时为空,也不能和frames同时有值。
+ */
+ @NotBlank(message = "音频URL不能为空")
+ private String url;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/ImgAsyncScanResult.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/ImgAsyncScanResult.java
new file mode 100644
index 0000000000..d988cf7a88
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/ImgAsyncScanResult.java
@@ -0,0 +1,24 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 检测结果
+ *
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-05 10:52
+ **/
+@Data
+public class ImgAsyncScanResult {
+ /**
+ * 执行成功的任务Id集合
+ */
+ private List successTaskIds;
+ /**
+ * 执行失败的任务Id集合
+ */
+ private List failTaskIds;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/ScanTaskResult.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/ScanTaskResult.java
new file mode 100644
index 0000000000..d358a570fa
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/ScanTaskResult.java
@@ -0,0 +1,28 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * desc:文本检测返回结果
+ * @author jianjun liu
+ * @email liujianjun@yunzongnet.com
+ * @date 2020-06-05 14:24
+ **/
+@Data
+public class ScanTaskResult implements Serializable {
+
+ private static final long serialVersionUID = -7905091710384256911L;
+ private Integer code;
+
+
+ private String msg;
+
+
+ private String dataId;
+
+
+ private List results;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/SceneDetailResult.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/SceneDetailResult.java
new file mode 100644
index 0000000000..4023153d10
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/SceneDetailResult.java
@@ -0,0 +1,31 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+/**
+ * desc:场景扫描结果
+ * @author jianjun liu
+ * @date 2020-06-05 14:24
+ **/
+@Data
+public class SceneDetailResult {
+ /**
+ * 结果为该分类的概率
+ */
+ private Double rate;
+
+ /**
+ * 建议用户执行的操作
+ */
+ private String suggestion;
+
+ /**
+ * 场景
+ */
+ private String scene;
+
+ /**
+ * 标签
+ */
+ private String label;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/SyncScanResult.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/SyncScanResult.java
new file mode 100644
index 0000000000..8dcb757f64
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/SyncScanResult.java
@@ -0,0 +1,42 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 检测结果
+ *
+ * @author jianjun liu
+ * @date 2020-06-05 10:52
+ **/
+@Data
+public class SyncScanResult implements Serializable {
+ /**
+ * 执行成功的任务Id集合
+ */
+ private List successDataIds = new ArrayList<>();
+ /**
+ * 执行失败的任务Id集合
+ */
+ private List failDataIds = new ArrayList<>();
+
+ /**
+ * desc:检测详情
+ */
+ private List details = new ArrayList<>();
+
+ /**
+ * 本地是否全部通过
+ */
+ private boolean isAllPass;
+
+ public boolean isAllPass() {
+ if (failDataIds.isEmpty() && !successDataIds.isEmpty()) {
+ return true;
+ }
+ return isAllPass;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanDetailDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanDetailDTO.java
new file mode 100644
index 0000000000..7e74caf5a6
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanDetailDTO.java
@@ -0,0 +1,47 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 语音异步检测结果查询结果返参 -data-result-detail详情
+ * 语音对应的文本详情。每一句文本对应一个元素,包含一个或者多个元素。关于每个元素的结构描述
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 11:11
+ */
+@Data
+public class VoiceAsyncScanDetailDTO implements Serializable {
+ private static final long serialVersionUID = -2664219492371705160L;
+ /**
+ * 句子开始的时间,单位:秒。
+ */
+ private Integer startTime;
+
+ /**
+ * 句子结束的时间,单位:秒。
+ */
+ private Integer endTime;
+
+ /**
+ * 语音转换成文本的结果。
+ */
+ private String text;
+
+ /**
+ * 检测结果的分类。取值:
+ * normal:正常文本
+ * spam:含垃圾信息
+ * ad:广告
+ * politics:涉政
+ * terrorism:暴恐
+ * abuse:辱骂
+ * porn:色情
+ * flood:灌水
+ * contraband:违禁
+ * meaningless:无意义
+ * customized:自定义(例如命中自定义关键词)
+ */
+ private String label;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanResult.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanResult.java
new file mode 100644
index 0000000000..1cbf3dab4a
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanResult.java
@@ -0,0 +1,89 @@
+package com.epmet.openapi.scan.support.result;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 语音异步检测结果查询结果返参
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 10:56
+ */
+@Data
+public class VoiceAsyncScanResult implements Serializable {
+ private static final long serialVersionUID = 8702129292884498023L;
+
+ /**
+ * 检测对象对应的数据ID。
+ */
+ private String dataId;
+
+ /**
+ * 检测任务的ID
+ */
+ private String taskId;
+
+ /**
+ * 检测结果的分类。取值:
+ * normal:正常文本
+ * spam:含垃圾信息
+ * ad:广告
+ * politics:涉政
+ * terrorism:暴恐
+ * abuse:辱骂
+ * porn:色情
+ * flood:灌水
+ * contraband:违禁
+ * meaningless:无意义
+ * customized:自定义(例如命中自定义关键词)
+ */
+ private String label;
+
+ /**
+ * labelDesc是对label的说明,包含两种特殊说明:
+ * (1)如果检测任务失败labelDesc:智能检测任务失败,结果已失效,需要人工审核
+ * (2)如果检测结果失效labelDesc:智能检测任务失败,需要人工审核
+ */
+ private String labelDesc;
+
+ /**
+ * 建议您执行的后续操作。取值:
+ * pass:结果正常,无需进行其余操作。
+ * review:结果不确定,需要进行人工审核。
+ * block:结果违规,建议直接删除或者限制公开。
+ */
+ private String suggestion;
+
+
+ /**
+ * 错误码,和HTTP状态码一致。
+ * 200:表示检测成功。
+ * 280:表示处理中,需要继续轮询。
+ * 其他:表示任务失败。
+ * 更多信息,请参见公共错误码。
+ */
+ @JsonIgnore
+ private Integer code;
+ /**
+ * 错误描述信息。
+ */
+ @JsonIgnore
+ private String msg;
+
+ /**
+ * 暂时没用,所以返回忽略
+ */
+ @JsonIgnore
+ private String url;
+
+ /**
+ * 检测成功(code=200)时,返回的检测结果。该结果包含一个或多个元素,每个元素是个结构体,对应一个场景。关于每个元素的结构描述,请参见result。
+ * 暂时不展示审核结果明细
+ */
+ @JsonIgnore
+ private List results;
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanResultDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanResultDTO.java
new file mode 100644
index 0000000000..34f3280a6f
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanResultDTO.java
@@ -0,0 +1,57 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 语音异步检测结果查询结果返参 -data-result详情
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 11:07
+ */
+@Data
+public class VoiceAsyncScanResultDTO implements Serializable {
+ private static final long serialVersionUID = 4602226363259983753L;
+ /**
+ * 检测场景,和调用请求中的场景对应。取值:antispam。
+ */
+ private String scene;
+
+ /**
+ * 检测结果的分类。取值:
+ * normal:正常文本
+ * spam:含垃圾信息
+ * ad:广告
+ * politics:涉政
+ * terrorism:暴恐
+ * abuse:辱骂
+ * porn:色情
+ * flood:灌水
+ * contraband:违禁
+ * meaningless:无意义
+ * customized:自定义(例如命中自定义关键词)
+ */
+ private String label;
+
+ /**
+ * 建议您执行的后续操作。取值:
+ * pass:结果正常,无需进行其余操作。
+ * review:结果不确定,需要进行人工审核。
+ * block:结果违规,建议直接删除或者限制公开。
+ */
+ private String suggestion;
+
+ /**
+ * 置信度分数,取值范围:0(表示置信度最低)~100(表示置信度最高)。
+ * 如果suggestion为pass,则置信度越高,表示内容正常的可能性越高;如果suggestion为review或block,则置信度越高,表示内容违规的可能性越高。
+ * 注意 该值仅作为参考,强烈建议您不要在业务中使用。建议您参考suggestion和label(或者部分接口返回的sublabel)结果用于内容违规判定。
+ */
+ private Float rate;
+
+ /**
+ * 语音对应的文本详情。每一句文本对应一个元素,包含一个或者多个元素。关于每个元素的结构描述,
+ */
+ private List details;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanTaskDataDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanTaskDataDTO.java
new file mode 100644
index 0000000000..ce43fec932
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanTaskDataDTO.java
@@ -0,0 +1,40 @@
+package com.epmet.openapi.scan.support.result;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 语音异步检测,返回检测对象列表
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 16:38
+ */
+@Data
+public class VoiceAsyncScanTaskDataDTO implements Serializable {
+ /**
+ * 错误码,和HTTP状态码一致。
+ * 更多信息,请参见公共错误码。
+ */
+ private Integer code;
+ /**
+ * 错误描述信息。
+ */
+ private String msg;
+ /**
+ * 检测对象对应的数据ID。
+ */
+ private String dataId;
+
+ /**
+ * 检测任务的ID
+ */
+ private String taskId;
+
+ /**
+ * 暂时没用,所以返回忽略
+ */
+ @JsonIgnore
+ private String url;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanTaskResult.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanTaskResult.java
new file mode 100644
index 0000000000..2dcbecc398
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/VoiceAsyncScanTaskResult.java
@@ -0,0 +1,46 @@
+package com.epmet.openapi.scan.support.result;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 语音异步检测,返参
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/9 9:23
+ */
+@Data
+public class VoiceAsyncScanTaskResult implements Serializable {
+ private static final long serialVersionUID = 8702129292884498023L;
+ /**
+ * 随机字符串,该值用于回调通知请求中的签名。
+ */
+ private String seed;
+
+ /**
+ * 提交成功的失败对象
+ */
+ private List successTasks=new ArrayList<>();
+
+ /**
+ * 提交失败的检测对象
+ */
+ private List failTasks=new ArrayList<>();
+
+ /**
+ * 是否全部提交成功
+ */
+ private boolean isAllSuccess;
+
+ public boolean isAllSuccess() {
+ if (failTasks.isEmpty() && !successTasks.isEmpty()) {
+ return true;
+ }
+ return isAllSuccess;
+ }
+
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoAsyncScanTaskDataDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoAsyncScanTaskDataDTO.java
new file mode 100644
index 0000000000..1d559a31cd
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoAsyncScanTaskDataDTO.java
@@ -0,0 +1,41 @@
+package com.epmet.openapi.scan.support.result.video;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 视频审核-异步检测任务提交返参详情
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/29 13:42
+ */
+@Data
+public class VideoAsyncScanTaskDataDTO implements Serializable {
+ private static final long serialVersionUID = 8430710131685814181L;
+ /**
+ * 错误码,和HTTP状态码一致。
+ * 更多信息,请参见公共错误码。
+ */
+ private Integer code;
+ /**
+ * 错误描述信息。
+ */
+ private String msg;
+ /**
+ * 检测对象对应的数据ID。
+ */
+ private String dataId;
+
+ /**
+ * 检测任务的ID
+ */
+ private String taskId;
+
+ /**
+ * 暂时没用,所以返回忽略
+ */
+ @JsonIgnore
+ private String url;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoAsyncScanTaskResultDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoAsyncScanTaskResultDTO.java
new file mode 100644
index 0000000000..75ecd6e84f
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoAsyncScanTaskResultDTO.java
@@ -0,0 +1,45 @@
+package com.epmet.openapi.scan.support.result.video;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 视频审核-异步检测任务提交返参
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/29 13:38
+ */
+@Data
+public class VideoAsyncScanTaskResultDTO implements Serializable {
+ private static final long serialVersionUID = -467990806428860191L;
+
+ /**
+ * 随机字符串,该值用于回调通知请求中的签名。
+ */
+ private String seed;
+
+ /**
+ * 提交成功的失败对象
+ */
+ private List successTasks=new ArrayList<>();
+
+ /**
+ * 提交失败的检测对象
+ */
+ private List failTasks=new ArrayList<>();
+
+ /**
+ * 是否全部提交成功
+ */
+ private Boolean isAllSuccess;
+
+ public boolean isAllSuccess() {
+ if (failTasks.isEmpty() && !successTasks.isEmpty()) {
+ return true;
+ }
+ return isAllSuccess;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoResultDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoResultDTO.java
new file mode 100644
index 0000000000..0e781bf463
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoResultDTO.java
@@ -0,0 +1,48 @@
+package com.epmet.openapi.scan.support.result.video;
+
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 视频异步检测结果查询接口返参
+ * 正在检测中的不返回,调用方继续轮询查询结果
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/29 15:37
+ */
+@Data
+public class VideoResultDTO implements Serializable {
+ private static final long serialVersionUID = -3451342817149956488L;
+
+ /**
+ * 执行成功的任务Id集合
+ * code=200,且所有语音+视频所有场景返回结果都为pass时则为成功
+ */
+ private List passDataIds = new ArrayList<>();
+ /**
+ * 执行失败的任务Id集合
+ */
+ private List noPassDataIds = new ArrayList<>();
+
+ private List passTaskIds = new ArrayList<>();
+ private List noPassTaskIds = new ArrayList<>();
+
+ /**
+ * desc:阿里内容审核API返回结果详情
+ */
+ private List details = new ArrayList<>();
+
+ /**
+ * 本地是否全部通过
+ */
+ private Boolean isAllPass;
+
+ public boolean isAllPass() {
+ if (noPassTaskIds.isEmpty() && !passTaskIds.isEmpty()) {
+ return true;
+ }
+ return isAllPass;
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoScanOriginDetail.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoScanOriginDetail.java
new file mode 100644
index 0000000000..78916c1fe6
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoScanOriginDetail.java
@@ -0,0 +1,53 @@
+package com.epmet.openapi.scan.support.result.video;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 视频异步检测结果查询接口原生返参-视频检测结果
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/29 16:39
+ */
+@Data
+public class VideoScanOriginDetail implements Serializable {
+ private static final long serialVersionUID = 5547706236158849091L;
+ /**
+ * 视频检测场景,和调用请求中的场景对应。取值:
+ * porn:视频智能鉴黄
+ * terrorism:视频暴恐涉政
+ * live:视频不良场景
+ * logo:视频logo
+ * ad:视频图文违规
+ */
+ private String scene;
+
+ /**
+ * 视频检测结果的分类。不同检测场景的结果分类不同,具体如下:
+ * 视频智能鉴黄(porn)结果分类:
+ * normal:正常
+ * porn:色情
+ * 视频暴恐涉政(terrorism)结果分类:
+ * normal:正常
+ * terrorism:暴恐涉政
+ * 视频不良场景(live)结果分类:
+ * normal:正常
+ * live:包含不良场景
+ * 视频logo(logo)结果分类:
+ * normal:正常
+ * logo:包含logo
+ * 视频图文违规(ad)结果分类:
+ * normal:正常
+ * ad:包含广告或文字违规信息
+ */
+ private String label;
+
+ /**
+ * 建议您执行的后续操作。取值:
+ * pass:结果正常,无需进行其余操作。
+ * review:结果不确定,需要进行人工审核。
+ * block:结果违规,建议直接删除或者限制公开。
+ */
+ private String suggestion;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoScanOriginalResultDTO.java b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoScanOriginalResultDTO.java
new file mode 100644
index 0000000000..8964d5fe00
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/java/com/epmet/openapi/scan/support/result/video/VideoScanOriginalResultDTO.java
@@ -0,0 +1,51 @@
+package com.epmet.openapi.scan.support.result.video;
+
+import com.epmet.openapi.scan.support.result.VoiceAsyncScanResultDTO;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 视频异步检测结果查询接口原生返参
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/29 15:48
+ */
+@Data
+public class VideoScanOriginalResultDTO implements Serializable {
+ private static final long serialVersionUID = -1565008507757551616L;
+
+ /**
+ * 错误码,和HTTP状态码一致。
+ * 更多信息,请参见公共错误码。
+ */
+ private Integer code;
+
+ private String codeDesc;
+
+ /**
+ * 错误描述信息。
+ */
+ private String msg;
+ /**
+ * 检测对象对应的数据ID。
+ */
+ private String dataId;
+
+ /**
+ * 检测任务的ID
+ */
+ private String taskId;
+
+ /**
+ * 返回结果,调用成功时(code=200),返回结果中包含一个或多个元素。每个元素是个结构体,具体结构描述,请参见result。
+ * 说明 视频流检测场景中,code返回280表示在检测中,返回200表示检测完成。在检测中状态时,检测结果中包含从开始检测到当前时间的检测到结果。
+ */
+ private List results;
+
+ /**
+ * 视频语音检测结果。具体结构描述,请参见audioScanResult。
+ */
+ private List audioScanResults;
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/resources/bootstrap.yml b/epmet-openapi/epmet-openapi-scan/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000000..0aa0583c97
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/resources/bootstrap.yml
@@ -0,0 +1,91 @@
+server:
+ port: @server.port@
+ version: @version@
+ servlet:
+ context-path: /epmetscan
+
+spring:
+ main:
+ allow-bean-definition-overriding: true
+ application:
+ name: epmet-openapi-scan
+ #环境 dev|test|prod
+ profiles:
+ active: @spring.profiles.active@
+ messages:
+ encoding: UTF-8
+ basename: i18n/messages_common
+ jackson:
+ time-zone: GMT+8
+ date-format: yyyy-MM-dd HH:mm:ss
+ redis:
+ database: @spring.redis.index@
+ host: @spring.redis.host@
+ port: @spring.redis.port@
+ password: @spring.redis.password@
+ timeout: 30s
+ cloud:
+ nacos:
+ discovery:
+ server-addr: @nacos.server-addr@
+ #nacos的命名空间ID,默认是public
+ namespace: @nacos.discovery.namespace@
+ #不把自己注册到注册中心的地址
+ register-enabled: @nacos.register-enabled@
+ ip: @nacos.ip@
+ config:
+ enabled: @nacos.config-enabled@
+ server-addr: @nacos.server-addr@
+ namespace: @nacos.config.namespace@
+ group: @nacos.config.group@
+ file-extension: yaml
+management:
+ endpoints:
+ web:
+ exposure:
+ include: "*"
+ endpoint:
+ health:
+ show-details: ALWAYS
+
+feign:
+ hystrix:
+ enabled: true
+ client:
+ config:
+ default:
+ loggerLevel: BASIC
+ okhttp:
+ enabled: true
+
+
+hystrix:
+ command:
+ default:
+ execution:
+ isolation:
+ thread:
+ timeoutInMilliseconds: 60000 #缺省为1000
+
+ribbon:
+ ReadTimeout: 300000
+ ConnectTimeout: 300000
+
+aliyun:
+ green:
+ accessKeyId: LTAI4G6Fv6uTzQbpsayATHq4
+ accessKeySecret: QevMw1RYCwQUG3RSMPq1J6EAfmSblo
+ regionId: cn-shanghai
+ bizType: epmet_img_text
+
+dingTalk:
+ robot:
+ webHook: @dingTalk.robot.webHook@
+ secret: @dingTalk.robot.secret@
+
+# 停机选项
+shutdown:
+ graceful:
+ enable: true #是否开启优雅停机
+ waitTimeSecs: 30 # 优雅停机等待时间,超过30秒,发出告警
+
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/resources/logback-spring.xml b/epmet-openapi/epmet-openapi-scan/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000000..9d2ad51e14
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/resources/logback-spring.xml
@@ -0,0 +1,169 @@
+
+
+
+
+
+
+
+
+
+
+
+ ${appname}
+
+
+
+
+
+
+
+
+ debug
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+ UTF-8
+
+
+
+
+
+
+
+ ${log.path}/debug.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+
+ ${log.path}/debug-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ debug
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/info.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+
+ ${log.path}/info-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ info
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/warn.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+ ${log.path}/warn-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ warn
+ ACCEPT
+ DENY
+
+
+
+
+
+
+ ${log.path}/error.log
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%contextName] [%thread] %-5level %logger{50} - %msg%n
+ UTF-8
+
+
+
+ ${log.path}/error-%d{yyyy-MM-dd}.%i.log
+
+ 100MB
+
+
+ 15
+
+
+
+ ERROR
+ ACCEPT
+ DENY
+ ${webHook}
+ ${secret}
+ ${appname}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/epmet-openapi/epmet-openapi-scan/src/main/resources/readme b/epmet-openapi/epmet-openapi-scan/src/main/resources/readme
new file mode 100644
index 0000000000..384fca6dfc
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/main/resources/readme
@@ -0,0 +1,7 @@
+#访问openApi 需要向redis中 添加白名单
+sadd epmet:openapi:scan:whitelist "客户端ip地址"
+#eg:
+sadd epmet:openapi:scan:whitelist "\"192.168.1.1\""
+
+#del
+srem 'epmet:openapi:scan:whitelist' "\"116.179.32.197\"" "\"27.219.156.47\""
\ No newline at end of file
diff --git a/epmet-openapi/epmet-openapi-scan/src/test/java/BaseSample.java b/epmet-openapi/epmet-openapi-scan/src/test/java/BaseSample.java
new file mode 100644
index 0000000000..8c0774030d
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/test/java/BaseSample.java
@@ -0,0 +1,50 @@
+import java.io.IOException;
+import java.util.Properties;
+
+/**
+ * Created by liuhai.lh on 17/01/12.
+ */
+public class BaseSample {
+
+ protected static String accessKeyId = "123";
+ protected static String accessKeySecret = "456";
+
+ protected static String regionId = "cn-shanghai";
+
+ static {
+ Properties properties = new Properties();
+
+ try {
+ properties.load(BaseSample.class.getResourceAsStream("bootstrap.yml"));
+ accessKeyId = properties.getProperty("aliyun.green.accessKeyId");
+ accessKeySecret = properties.getProperty("aliyun.green.accessKeySecret");
+ regionId = properties.getProperty("aliyun.green.url");
+ } catch(IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+ protected static String getDomain(){
+ if("cn-shanghai".equals(regionId)){
+ return "green.cn-shanghai.aliyuncs.com";
+ }
+
+ if ("cn-beijing".equals(regionId)) {
+ return "green.cn-beijing.aliyuncs.com";
+ }
+
+ if ("ap-southeast-1".equals(regionId)) {
+ return "green.ap-southeast-1.aliyuncs.com";
+ }
+
+ if ("us-west-1".equals(regionId)) {
+ return "green.us-west-1.aliyuncs.com";
+ }
+
+ return "green.cn-shanghai.aliyuncs.com";
+ }
+ protected static String getEndPointName(){
+ return regionId;
+ }
+
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/test/java/ImageAsyncScanRequestSample.java b/epmet-openapi/epmet-openapi-scan/src/test/java/ImageAsyncScanRequestSample.java
new file mode 100644
index 0000000000..acba42e763
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/test/java/ImageAsyncScanRequestSample.java
@@ -0,0 +1,95 @@
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.exceptions.ServerException;
+import com.aliyuncs.green.model.v20180509.ImageAsyncScanRequest;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+import com.epmet.openapi.scan.common.enu.RegionIdEnum;
+
+import java.util.*;
+
+/**
+ * Created by liuhai.lh on 2017/2/17.
+ * 图片异步检测接口
+ * @author liuhai.lh
+ * @date 2017/02/17
+ */
+public class ImageAsyncScanRequestSample extends BaseSample{
+
+ public static void main(String[] args) throws Exception {
+ //请替换成你自己的accessKeyId、accessKeySecret
+ IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
+ DefaultProfile.addEndpoint(getEndPointName(), regionId, "Green", RegionIdEnum.getDoMain(regionId));
+ IAcsClient client = new DefaultAcsClient(profile);
+
+ ImageAsyncScanRequest imageAsyncScanRequest = new ImageAsyncScanRequest();
+ imageAsyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式
+ imageAsyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法
+ imageAsyncScanRequest.setEncoding("utf-8");
+ imageAsyncScanRequest.setRegionId(regionId);
+
+
+ List> tasks = new ArrayList>();
+ Map task1 = new LinkedHashMap();
+ task1.put("dataId", UUID.randomUUID().toString());
+ task1.put("url", "https://img.alicdn.com/tfs/TB1Xk_qvwmTBuNjy1XbXXaMrVXa-550-407.jpg");
+ task1.put("time", new Date());
+
+ tasks.add(task1);
+ JSONObject data = new JSONObject();
+ /**
+ * porn: 色情
+ * terrorism: 暴恐
+ * qrcode: 二维码
+ * ad: 图片广告
+ * ocr: 文字识别
+ */
+ data.put("scenes", Arrays.asList("porn", "ocr", "qrcode", "sface"));
+ data.put("tasks", tasks);
+
+ imageAsyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+
+ /**
+ * 请务必设置超时时间
+ */
+ imageAsyncScanRequest.setConnectTimeout(3000);
+ imageAsyncScanRequest.setReadTimeout(6000);
+
+ try {
+ HttpResponse httpResponse = client.doAction(imageAsyncScanRequest);
+
+ if(httpResponse.isSuccess()){
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ System.out.println(JSON.toJSONString(scrResponse, true));
+ if (200 == scrResponse.getInteger("code")) {
+ JSONArray taskResults = scrResponse.getJSONArray("data");
+ for (Object taskResult : taskResults) {
+ if(200 == ((JSONObject)taskResult).getInteger("code")){
+ String taskId = ((JSONObject)taskResult).getString("taskId");
+ // 将taskId 保存下来,间隔一段时间来轮询结果, 参照ImageAsyncScanResultsRequest
+ System.out.println("args = [" + taskId + "]");
+ }else{
+ System.out.println("task process fail:" + ((JSONObject)taskResult).getInteger("code"));
+ }
+ }
+ } else {
+ System.out.println("detect not success. code:" + scrResponse.getInteger("code"));
+ }
+ }else{
+ System.out.println("response not success. status:" + httpResponse.getStatus());
+ }
+ } catch (ServerException e) {
+ e.printStackTrace();
+ } catch (ClientException e) {
+ e.printStackTrace();
+ } catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/test/java/ImageAsyncScanResultsSample.java b/epmet-openapi/epmet-openapi-scan/src/test/java/ImageAsyncScanResultsSample.java
new file mode 100644
index 0000000000..27e0b6e233
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/test/java/ImageAsyncScanResultsSample.java
@@ -0,0 +1,83 @@
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.exceptions.ServerException;
+import com.aliyuncs.green.model.v20180509.ImageAsyncScanResultsRequest;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by liuhai.lh on 2017/2/17.
+ * 获取图片异步检测结果接口
+ * @author liuhai.lh
+ * @date 2017/02/17
+ */
+public class ImageAsyncScanResultsSample extends BaseSample{
+
+ public static void main(String[] args) throws Exception {
+ //请替换成你自己的accessKeyId、accessKeySecret
+ IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
+ DefaultProfile.addEndpoint(getEndPointName(), regionId, "Green", getDomain());
+ IAcsClient client = new DefaultAcsClient(profile);
+
+ ImageAsyncScanResultsRequest imageAsyncScanResultsRequest = new ImageAsyncScanResultsRequest();
+ imageAsyncScanResultsRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式
+ imageAsyncScanResultsRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法
+ imageAsyncScanResultsRequest.setEncoding("utf-8");
+ imageAsyncScanResultsRequest.setRegionId(regionId);
+
+
+ List taskIds = new ArrayList();
+ taskIds.add("img1hdP5Wn0QC@7wW0n$VX0R@-1p3mnZ");
+ imageAsyncScanResultsRequest.setHttpContent(JSON.toJSONString(taskIds).getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+
+ /**
+ * 请务必设置超时时间
+ */
+ imageAsyncScanResultsRequest.setConnectTimeout(3000);
+ imageAsyncScanResultsRequest.setReadTimeout(6000);
+
+ try {
+ HttpResponse httpResponse = client.doAction(imageAsyncScanResultsRequest);
+
+ if(httpResponse.isSuccess()){
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ System.out.println(JSON.toJSONString(scrResponse, true));
+ if (200 == scrResponse.getInteger("code")) {
+ JSONArray taskResults = scrResponse.getJSONArray("data");
+ for (Object taskResult : taskResults) {
+ if(200 == ((JSONObject)taskResult).getInteger("code")){
+ JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");
+ for (Object sceneResult : sceneResults) {
+ String scene = ((JSONObject)sceneResult).getString("scene");
+ String suggestion = ((JSONObject)sceneResult).getString("suggestion");
+ //根据scene和suggetion做相关的处理
+ //do something
+ }
+ }else{
+ System.out.println("task process fail:" + ((JSONObject)taskResult).getInteger("code"));
+ }
+ }
+ } else {
+ System.out.println("detect not success. code:" + scrResponse.getInteger("code"));
+ }
+ }else{
+ System.out.println("response not success. status:" + httpResponse.getStatus());
+ }
+ } catch (ServerException e) {
+ e.printStackTrace();
+ } catch (ClientException e) {
+ e.printStackTrace();
+ } catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/test/java/ImageSyncScanRequestSample.java b/epmet-openapi/epmet-openapi-scan/src/test/java/ImageSyncScanRequestSample.java
new file mode 100644
index 0000000000..ec418154d9
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/test/java/ImageSyncScanRequestSample.java
@@ -0,0 +1,101 @@
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.exceptions.ClientException;
+import com.aliyuncs.exceptions.ServerException;
+import com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+
+import java.util.*;
+
+/**
+ * Created by liuhai.lh on 2017/2/17.
+ * 图片同步检测接口
+ * @author liuhai.lh
+ * @date 2017/02/17
+ */
+public class ImageSyncScanRequestSample extends BaseSample {
+
+
+ public static void main(String[] args) throws Exception {
+ //请替换成你自己的accessKeyId、accessKeySecret
+ IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
+ DefaultProfile.addEndpoint(getEndPointName(), regionId, "Green", getDomain());
+ IAcsClient client = new DefaultAcsClient(profile);
+
+ ImageSyncScanRequest imageSyncScanRequest = new ImageSyncScanRequest();
+ imageSyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定api返回格式
+ imageSyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法
+ imageSyncScanRequest.setEncoding("utf-8");
+ imageSyncScanRequest.setRegionId(regionId);
+
+
+ List> tasks = new ArrayList>();
+ Map task = new LinkedHashMap();
+ task.put("dataId", UUID.randomUUID().toString());
+ task.put("url", "http://f.hiphotos.baidu.com/image/pic/item/aa18972bd40735fa13899ac392510fb30f24084b.jpg");
+ task.put("time", new Date());
+
+ tasks.add(task);
+ JSONObject data = new JSONObject();
+ /**
+ * porn: 色情
+ * terrorism: 暴恐
+ * qrcode: 二维码
+ * ad: 图片广告
+ * ocr: 文字识别
+ */
+ data.put("scenes", Arrays.asList("porn","terrorism"));
+ data.put("tasks", tasks);
+
+ imageSyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+
+ /**
+ * 请务必设置超时时间
+ */
+ imageSyncScanRequest.setConnectTimeout(3000);
+ imageSyncScanRequest.setReadTimeout(10000);
+
+ try {
+ HttpResponse httpResponse = client.doAction(imageSyncScanRequest);
+
+ if (httpResponse.isSuccess()) {
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ System.out.println(JSON.toJSONString(scrResponse, true));
+ if (200 == scrResponse.getInteger("code")) {
+ JSONArray taskResults = scrResponse.getJSONArray("data");
+ for (Object taskResult : taskResults) {
+ if(200 == ((JSONObject)taskResult).getInteger("code")){
+ JSONArray sceneResults = ((JSONObject)taskResult).getJSONArray("results");
+ for (Object sceneResult : sceneResults) {
+ String scene = ((JSONObject)sceneResult).getString("scene");
+ String suggestion = ((JSONObject)sceneResult).getString("suggestion");
+ //根据scene和suggetion做相关的处理
+ //do something
+ System.out.println("args = [" + scene + "]");
+ System.out.println("args = [" + suggestion + "]");
+ }
+ }else{
+ System.out.println("task process fail:" + ((JSONObject)taskResult).getInteger("code"));
+ }
+ }
+ } else {
+ System.out.println("detect not success. code:" + scrResponse.getInteger("code"));
+ }
+ } else {
+ System.out.println("response not success. status:" + httpResponse.getStatus());
+ }
+ } catch (ServerException e) {
+ e.printStackTrace();
+ } catch (ClientException e) {
+ e.printStackTrace();
+ } catch (Exception e){
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/test/java/VoiceAsyncScanRequestSample.java b/epmet-openapi/epmet-openapi-scan/src/test/java/VoiceAsyncScanRequestSample.java
new file mode 100644
index 0000000000..617e6246d1
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/test/java/VoiceAsyncScanRequestSample.java
@@ -0,0 +1,90 @@
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.green.model.v20180509.VoiceAsyncScanRequest;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+
+import java.util.*;
+
+/**
+ * 提交语音异步检测任务 demo
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/8 21:51
+ */
+public class VoiceAsyncScanRequestSample extends BaseSample {
+
+
+
+ public static void main(String[] args) throws Exception {
+
+ //请替换成您自己的AccessKey ID、AccessKey Secret。
+ IClientProfile profile = DefaultProfile.getProfile("cn-shanghai",
+ "LTAI4G6Fv6uTzQbpsayATHq4", //您自己的AccessKey ID
+ "QevMw1RYCwQUG3RSMPq1J6EAfmSblo");//您自己的AccessKey Secret
+ final IAcsClient client = new DefaultAcsClient(profile);
+
+ VoiceAsyncScanRequest asyncScanRequest = new VoiceAsyncScanRequest(); //class different vs common
+ asyncScanRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。
+ asyncScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法。
+ asyncScanRequest.setRegionId("cn-shanghai");
+ asyncScanRequest.setConnectTimeout(3000);
+ asyncScanRequest.setReadTimeout(6000);
+
+ List> tasks = new ArrayList>();
+ Map task1 = new LinkedHashMap();
+ // 请将下面的地址修改为要检测的语音文件的地址。
+ task1.put("dataId","voice1");
+ task1.put("url", "https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20201208/6480bd6be9f14a458162218cea84dfa5.aac");
+
+ Map task2 = new LinkedHashMap();
+ task2.put("dataId","voice2");
+ task2.put("url", "https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20201208/b566d94fd7114ffb9a203e80c22ebb96.aac");
+
+ tasks.add(task1);
+ tasks.add(task2);
+
+ JSONObject data = new JSONObject();
+
+ System.out.println("==========Task count:" + tasks.size());
+ data.put("scenes", Arrays.asList("antispam"));
+ data.put("tasks", tasks);
+ // 如果是语音流检测,则修改为true。
+ data.put("live", false);
+ asyncScanRequest.setHttpContent(data.toJSONString().getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+ System.out.println("接口入参:"+JSON.toJSONString(data, true));
+
+ try {
+ HttpResponse httpResponse = client.doAction(asyncScanRequest);
+
+ if (httpResponse.isSuccess()) {
+ JSONObject scrResponse = JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ System.out.println("接口返参:"+JSON.toJSONString(scrResponse, true));
+ if (200 == scrResponse.getInteger("code")) {
+ JSONArray taskResults = scrResponse.getJSONArray("data");
+ for (Object taskResult : taskResults) {
+ Integer code = ((JSONObject) taskResult).getInteger("code");
+ if (200 == code) {
+ final String taskId = ((JSONObject) taskResult).getString("taskId");
+ System.out.println("submit async task success, taskId = [" + taskId + "]");
+ } else {
+ System.out.println("task process fail: " + code);
+ }
+ }
+ } else {
+ System.out.println("detect not success. code: " + scrResponse.getInteger("code"));
+ }
+ } else {
+ System.out.println("response not success. status: " + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+}
diff --git a/epmet-openapi/epmet-openapi-scan/src/test/java/VoiceAsyncScanResultsRequestSample.java b/epmet-openapi/epmet-openapi-scan/src/test/java/VoiceAsyncScanResultsRequestSample.java
new file mode 100644
index 0000000000..85d268f175
--- /dev/null
+++ b/epmet-openapi/epmet-openapi-scan/src/test/java/VoiceAsyncScanResultsRequestSample.java
@@ -0,0 +1,113 @@
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyuncs.DefaultAcsClient;
+import com.aliyuncs.IAcsClient;
+import com.aliyuncs.green.model.v20180509.VoiceAsyncScanResultsRequest;
+import com.aliyuncs.http.FormatType;
+import com.aliyuncs.http.HttpResponse;
+import com.aliyuncs.profile.DefaultProfile;
+import com.aliyuncs.profile.IClientProfile;
+
+import java.util.*;
+
+/**
+ * 查询异步语音检测结果。
+ *
+ * @author yinzuomei@elink-cn.com
+ * @date 2020/12/8 22:08
+ */
+public class VoiceAsyncScanResultsRequestSample extends BaseSample {
+
+
+ public static void main(String[] args) throws Exception {
+ // 请替换成您自己的AccessKey ID、AccessKey Secret。
+ IClientProfile profile = DefaultProfile
+ .getProfile("cn-shanghai",
+ "LTAI4G6Fv6uTzQbpsayATHq4",
+ "QevMw1RYCwQUG3RSMPq1J6EAfmSblo");
+ final IAcsClient client = new DefaultAcsClient(profile);
+ //提交语音异步检测任务后返回的taskId
+ pollingScanResult(client, Arrays.asList("vc_f_7WZZ01BCH0q6ZnM3g1OKGG-1tAaZ7", "vc_f_6AKaBxy4HdG5bruQ0JwweV-1tAaJi"));
+ // pollingScanResult(client, "vc_f_6AKaBxy4HdG5bruQ0JwweV-1tAaJi");
+ }
+
+ public static void pollingScanResult(IAcsClient client, List taskIdList) throws InterruptedException {
+ int failCount = 0;
+ boolean stop = false;
+ do {
+ // 设置每10秒查询一次。
+ Thread.sleep(10 * 1000);
+ JSONObject scanResult = getScanResult(client, taskIdList);
+ System.out.println("接口完整返参:"+JSON.toJSONString(scanResult, true));
+ if (scanResult == null || 200 != scanResult.getInteger("code")) {
+ failCount++;
+ System.out.println("请求失败,get result fail, failCount=" + failCount);
+ if (scanResult != null) {
+ System.out.println("请求失败,错误信息errorMsg:" + scanResult.getString("msg"));
+ }
+ if (failCount > 20) {
+ break;
+ }
+ continue;
+ }
+
+ JSONArray taskResults = scanResult.getJSONArray("data");
+ if (taskResults.isEmpty()) {
+ System.out.println("请求成功,but data is empty");
+ break;
+ }
+ System.out.println("data.size=" + taskResults.size());
+ for (Object taskResult : taskResults) {
+ JSONObject result = (JSONObject) taskResult;
+ Integer code = result.getInteger("code");
+ String taskId = result.getString("taskId");
+ if (280 == code) {
+ System.out.println("taskId=" + taskId + ": processing status: " + result.getString("msg"));
+ } else if (200 == code) {
+ System.out.println("taskId=" + taskId + "请求成功,返参:" + JSON.toJSONString(taskResult, true));
+ stop = true;
+ } else {
+ System.out.println("taskId=" + taskId + "请求失败,返参:" + JSON.toJSONString(taskResult, true));
+ stop = true;
+ }
+ }
+ } while (!stop);
+ }
+
+ private static JSONObject getScanResult(IAcsClient client, List taskIdList) {
+ VoiceAsyncScanResultsRequest getResultsRequest = new VoiceAsyncScanResultsRequest();
+ getResultsRequest.setAcceptFormat(FormatType.JSON); // 指定API返回格式。
+ getResultsRequest.setMethod(com.aliyuncs.http.MethodType.POST); // 指定请求方法。
+ getResultsRequest.setEncoding("utf-8");
+ getResultsRequest.setRegionId("cn-shanghai");
+
+
+ List> tasks = new ArrayList>();
+ for (String taskId : taskIdList) {
+ Map task1 = new LinkedHashMap();
+ task1.put("taskId", taskId);
+ tasks.add(task1);
+ }
+
+ /**
+ * 请务必设置超时时间。
+ */
+ getResultsRequest.setConnectTimeout(3000);
+ getResultsRequest.setReadTimeout(6000);
+
+ try {
+ getResultsRequest.setHttpContent(JSON.toJSONString(tasks).getBytes("UTF-8"), "UTF-8", FormatType.JSON);
+
+ HttpResponse httpResponse = client.doAction(getResultsRequest);
+ if (httpResponse.isSuccess()) {
+ return JSON.parseObject(new String(httpResponse.getHttpContent(), "UTF-8"));
+ } else {
+ System.out.println("response not success. status: " + httpResponse.getStatus());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/epmet-openapi/pom.xml b/epmet-openapi/pom.xml
new file mode 100644
index 0000000000..fd15705343
--- /dev/null
+++ b/epmet-openapi/pom.xml
@@ -0,0 +1,19 @@
+
+
+
+ epmet-cloud
+ com.epmet
+ 2.0.0
+
+ 4.0.0
+ pom
+
+ epmet-openapi
+
+ epmet-openapi-scan
+ epmet-openapi-adv
+
+
+
\ No newline at end of file