江体小程序和zlb接口开发 #1

Merged
XiangZ merged 32 commits from feat/script_v1 into master 2026-05-10 09:06:35 +00:00
25 changed files with 603 additions and 7 deletions
Showing only changes of commit 72db541e22 - Show all commits

View File

@@ -8,7 +8,7 @@ import lombok.Getter;
public enum ScheduleEnums {
DOMAIN_DYNAMIC_ANALYSIS_TASK(4, "domain", "domainDynamicAnalysisTask"),
GLADOS_CHECK_IN_TASK(0, "glados", "gladosCheckInTask"),
;
private final Integer modeleCode;

View File

@@ -1,9 +1,11 @@
package com.xiang.common.factory.schedule;
import com.xiang.common.pojo.schedule.ScheduleOpeningConfigDO;
import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
import com.xiang.common.pojo.schedule.TaskResult;
import com.xiang.common.pojo.schedule.ValidationResult;
import com.xiang.common.service.IScheduleOpeningConfigService;
import com.xiang.common.service.IScheduleRunLogService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -16,9 +18,11 @@ public abstract class BaseScheduleTaskTemplate {
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private final IScheduleOpeningConfigService scheduleOpeningConfigService;
private final IScheduleRunLogService scheduleRunLogService;
protected BaseScheduleTaskTemplate(IScheduleOpeningConfigService scheduleOpeningConfigService) {
protected BaseScheduleTaskTemplate(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService) {
this.scheduleOpeningConfigService = scheduleOpeningConfigService;
this.scheduleRunLogService = scheduleRunLogService;
}
@@ -70,6 +74,11 @@ public abstract class BaseScheduleTaskTemplate {
* @return
*/
protected abstract Integer getModule();
/**
* 获取模块名称(子类必须实现)
* @return
*/
protected abstract String getModuleName();
/**
* 任务校验(子类必须实现)
@@ -117,6 +126,14 @@ public abstract class BaseScheduleTaskTemplate {
// 可在此扩展:写入数据库、发送通知等
// 例如saveTaskLog(getTaskName(), "SUCCESS", duration, result.getDetail());
ScheduleRunLogDO scheduleRunLogDO = new ScheduleRunLogDO();
scheduleRunLogDO.setModuleName(getModuleName());
scheduleRunLogDO.setTaskName(getTaskName());
scheduleRunLogDO.setParams(result.getParams());
scheduleRunLogDO.setResponse(result.getSummary());
scheduleRunLogDO.setCreateTime(endTime);
scheduleRunLogDO.setRequestFlag(result.isSuccess() ? 1 : 0);
scheduleRunLogService.save(scheduleRunLogDO);
}
/**
@@ -131,6 +148,15 @@ public abstract class BaseScheduleTaskTemplate {
// 可在此扩展:写入数据库、发送告警等
// 例如saveTaskLog(getTaskName(), "FAILURE", duration, e.getMessage());
ScheduleRunLogDO scheduleRunLogDO = new ScheduleRunLogDO();
scheduleRunLogDO.setModuleName(getModuleName());
scheduleRunLogDO.setTaskName(getTaskName());
// scheduleRunLogDO.setParams();
scheduleRunLogDO.setResponse(e.getMessage());
scheduleRunLogDO.setCreateTime(endTime);
scheduleRunLogDO.setRequestFlag(0);
scheduleRunLogService.save(scheduleRunLogDO);
}
/**

View File

@@ -0,0 +1,11 @@
package com.xiang.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiang.common.pojo.glados.GladosRunLogDO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface GladosRunLogDao extends BaseMapper<GladosRunLogDO> {
}

View File

@@ -0,0 +1,17 @@
package com.xiang.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiang.common.pojo.glados.GladosUserDO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
/**
* @Author: xiang
* @Date: 2025-05-09 13:49
*/
@Mapper
@Repository
public interface GladosUserDao extends BaseMapper<GladosUserDO> {
}

View File

@@ -0,0 +1,11 @@
package com.xiang.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface ScheduleRunLogDao extends BaseMapper<ScheduleRunLogDO> {
}

View File

@@ -0,0 +1,47 @@
package com.xiang.common.pojo.glados;
import lombok.Builder;
import lombok.Data;
import java.time.LocalDateTime;
/**
* @Author: xiang
* @Date: 2025-05-09 13:56
*/
@Data
@Builder
public class GladosRunLogDO {
private static final long serialVersionUID = 1L;
private Integer id;
/**
* 用户id
*/
private Integer userId;
/**
* 用户
*/
private String user;
/**
* 请求的时间
*/
private LocalDateTime time;
/**
* 是否成功0: 失败 1:成功)
*/
private Integer status;
private Integer code;
/**
* 返回的响应
*/
private String response;
}

View File

@@ -0,0 +1,24 @@
package com.xiang.common.pojo.glados;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
* @Author: xiang
* @Date: 2025-05-09 13:49
*/
@Data
@TableName("glados_script_user")
public class GladosUserDO {
private Integer id;
private String user;
private String email;
private String cookie;
private Integer status;
}

View File

@@ -0,0 +1,16 @@
package com.xiang.common.pojo.glados.req;
import lombok.Data;
/**
* @Author: xiang
* @Date: 2025-05-08 15:22
*/
@Data
public class GladosCheckInReq {
/**
* cookie
*/
private String cookie;
}

View File

@@ -0,0 +1,20 @@
package com.xiang.common.pojo.glados.resp;
import lombok.Data;
/**
* @Author: xiang
* @Date: 2026-01-23 09:21
*/
@Data
public class CheckInResp {
private Long id;
private Long userId;
private Long time;
private String asset;
private String business;
private String change;
private String balance;
private String detail;
}

View File

@@ -0,0 +1,21 @@
package com.xiang.common.pojo.glados.resp;
import lombok.Data;
import java.util.List;
/**
* @Author: xiang
* @Date: 2025-05-08 14:55
*/
@Data
public class GLaDOSResponse<T> {
private Long code;
private Integer points;
private String message;
private List<T> list;
}

View File

@@ -0,0 +1,22 @@
package com.xiang.common.pojo.schedule;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("schedule_run_log")
public class ScheduleRunLogDO {
private Long id;
private String moduleName;
private String taskName;
private String params;
private String response;
private LocalDateTime createTime;
private Integer requestFlag;
}

View File

@@ -8,10 +8,15 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor
@NoArgsConstructor
public class TaskResult {
private String params;
/**
* 是否成功
*/
private boolean success;
/**
* 响应结果
*/
private String summary;
private Object detail;
}

View File

@@ -0,0 +1,7 @@
package com.xiang.common.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
public interface IScheduleRunLogService extends IService<ScheduleRunLogDO> {
}

View File

@@ -0,0 +1,10 @@
package com.xiang.common.service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiang.common.mapper.ScheduleRunLogDao;
import com.xiang.common.pojo.schedule.ScheduleRunLogDO;
import org.springframework.stereotype.Service;
@Service
public class ScheduleRunLogServiceImpl extends ServiceImpl<ScheduleRunLogDao, ScheduleRunLogDO> implements IScheduleRunLogService {
}

View File

@@ -4,6 +4,7 @@ import com.xiang.common.enums.ScheduleEnums;
import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate;
import com.xiang.common.pojo.schedule.TaskResult;
import com.xiang.common.service.IScheduleOpeningConfigService;
import com.xiang.common.service.IScheduleRunLogService;
import com.xiang.common.utils.IpUtils;
import com.xiang.service.module.domain.service.IDomainService;
import lombok.extern.slf4j.Slf4j;
@@ -15,8 +16,8 @@ import org.springframework.stereotype.Component;
public class DomainDynamicAnalysisTask extends BaseScheduleTaskTemplate {
private final IDomainService IDomainService;
public DomainDynamicAnalysisTask(IScheduleOpeningConfigService scheduleOpeningConfigService, IDomainService IDomainService) {
super(scheduleOpeningConfigService);
public DomainDynamicAnalysisTask(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService, IDomainService IDomainService) {
super(scheduleOpeningConfigService, scheduleRunLogService);
this.IDomainService = IDomainService;
}
@@ -25,6 +26,11 @@ public class DomainDynamicAnalysisTask extends BaseScheduleTaskTemplate {
return ScheduleEnums.DOMAIN_DYNAMIC_ANALYSIS_TASK.getModeleCode();
}
@Override
protected String getModuleName() {
return ScheduleEnums.DOMAIN_DYNAMIC_ANALYSIS_TASK.getModule();
}
@Override
protected String getTaskName() {
return ScheduleEnums.DOMAIN_DYNAMIC_ANALYSIS_TASK.getTaskName();
@@ -44,11 +50,13 @@ public class DomainDynamicAnalysisTask extends BaseScheduleTaskTemplate {
IDomainService.dynamicDomainAnalysis(publicIp);
} catch (Exception e) {
log.error("动态解析公网ip失败, ip:{}", publicIp, e);
taskResult.setSuccess(false);
taskResult.setSummary(e.getMessage());
return taskResult;
}
}
taskResult.setSuccess(true);
taskResult.setSummary("");
taskResult.setDetail(null);
taskResult.setSummary("ddns解析成功");
return taskResult;
}

View File

@@ -0,0 +1,23 @@
package com.xiang.service.module.glados.constants;
/**
* @Author: xiang
* @Date: 2025-05-08 15:27
*/
public class GladosConstants {
/**
* glados 主域名
*/
private static final String GLADOS_URL_PREFIX = "https://glados.cloud";
/**
* 签到接口
*/
public static final String GLADOS_CHECK_IN_URL = GLADOS_URL_PREFIX + "/api/user/checkin";
/**
* 签到请求体
*/
public static final String GLADOS_CHECK_IN_BODY = "{\"token\":\"glados.cloud\"}";
}

View File

@@ -0,0 +1,10 @@
package com.xiang.service.module.glados.manage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiang.common.mapper.GladosRunLogDao;
import com.xiang.common.pojo.glados.GladosRunLogDO;
import org.springframework.stereotype.Service;
@Service
public class GladosRunLogManageImpl extends ServiceImpl<GladosRunLogDao, GladosRunLogDO> implements IGladosRunLogManage {
}

View File

@@ -0,0 +1,30 @@
package com.xiang.service.module.glados.manage;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.xiang.common.mapper.GladosUserDao;
import com.xiang.common.pojo.glados.GladosUserDO;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class GladosUserManageImpl extends ServiceImpl<GladosUserDao, GladosUserDO> implements IGladosUserManage {
@Override
public List<GladosUserDO> listAllUsers() {
LambdaQueryWrapper<GladosUserDO> lqw = Wrappers.lambdaQuery();
lqw.eq(GladosUserDO::getStatus, 1);
return baseMapper.selectList(lqw);
}
@Override
public GladosUserDO findByUsername(String username) {
LambdaQueryWrapper<GladosUserDO> lqw = Wrappers.lambdaQuery();
lqw.eq(GladosUserDO::getStatus, 1);
lqw.eq(GladosUserDO::getUser, username);
lqw.last("limit 1");
return baseMapper.selectOne(lqw);
}
}

View File

@@ -0,0 +1,7 @@
package com.xiang.service.module.glados.manage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiang.common.pojo.glados.GladosRunLogDO;
public interface IGladosRunLogManage extends IService<GladosRunLogDO> {
}

View File

@@ -0,0 +1,13 @@
package com.xiang.service.module.glados.manage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.xiang.common.pojo.glados.GladosUserDO;
import java.util.List;
public interface IGladosUserManage extends IService<GladosUserDO> {
List<GladosUserDO> listAllUsers();
GladosUserDO findByUsername(String username);
}

View File

@@ -0,0 +1,46 @@
package com.xiang.service.module.glados.schedule;
import com.xiang.common.enums.ScheduleEnums;
import com.xiang.common.factory.schedule.BaseScheduleTaskTemplate;
import com.xiang.common.pojo.schedule.TaskResult;
import com.xiang.common.service.IScheduleOpeningConfigService;
import com.xiang.common.service.IScheduleRunLogService;
import com.xiang.service.module.glados.service.IGLaDOSService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @Author: xiang
* @Date: 2025-05-08 15:24
*/
@Component
@Slf4j
public class GladosCheckInTask extends BaseScheduleTaskTemplate {
private final IGLaDOSService glaDOSService;
public GladosCheckInTask(IScheduleOpeningConfigService scheduleOpeningConfigService, IScheduleRunLogService scheduleRunLogService, IGLaDOSService glaDOSService) {
super(scheduleOpeningConfigService, scheduleRunLogService);
this.glaDOSService = glaDOSService;
}
@Override
protected String getTaskName() {
return ScheduleEnums.GLADOS_CHECK_IN_TASK.getTaskName();
}
@Override
protected Integer getModule() {
return ScheduleEnums.GLADOS_CHECK_IN_TASK.getModeleCode();
}
@Override
protected String getModuleName() {
return ScheduleEnums.GLADOS_CHECK_IN_TASK.getModule();
}
@Override
protected TaskResult doExecute(Object validatedParams) {
return glaDOSService.checkIn();
}
}

View File

@@ -0,0 +1,23 @@
package com.xiang.service.module.glados.schedule;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@Component
@Slf4j
@RequiredArgsConstructor
@RestController
public class GladosSchedule {
private final GladosCheckInTask gladosCheckInJob;
@Scheduled(cron = "0 0 7 1/1 * ?")
@GetMapping("/test1")
public void checkIn() {
gladosCheckInJob.run();
}
}

View File

@@ -0,0 +1,27 @@
package com.xiang.service.module.glados.server;
import com.xiang.service.module.glados.service.IGLaDOSService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/script/glados")
@RequiredArgsConstructor
public class GladosServer {
private final IGLaDOSService gladosService;
@GetMapping("/checkIn")
public void checkIn(@RequestParam("username") String username) {
try {
gladosService.checkIn(username);
} catch (Exception e) {
log.error(e.getMessage());
}
}
}

View File

@@ -0,0 +1,149 @@
package com.xiang.service.module.glados.service;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.fastjson2.TypeReference;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.common.collect.Maps;
import com.xiang.common.factory.ScriptDingTalkFactory;
import com.xiang.common.pojo.glados.GladosRunLogDO;
import com.xiang.common.pojo.glados.GladosUserDO;
import com.xiang.common.pojo.glados.resp.CheckInResp;
import com.xiang.common.pojo.glados.resp.GLaDOSResponse;
import com.xiang.common.pojo.schedule.TaskResult;
import com.xiang.common.utils.HttpService;
import com.xiang.service.module.glados.constants.GladosConstants;
import com.xiang.service.module.glados.manage.IGladosRunLogManage;
import com.xiang.service.module.glados.manage.IGladosUserManage;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/**
* @Author: xiang
* @Date: 2025-05-08 14:38
*/
@Service
@Slf4j
@RequiredArgsConstructor
public class GLaDOSServiceImpl implements IGLaDOSService {
private final IGladosUserManage gladosUserManage;
private final ScriptDingTalkFactory dingTalkService;
@Override
public TaskResult checkIn() {
TaskResult taskResult = new TaskResult();
List<GladosUserDO> users = gladosUserManage.listAllUsers();
if (CollectionUtils.isEmpty(users)) {
taskResult.setSuccess(false);
taskResult.setSummary("无可使用的用户");
return taskResult;
}
StringBuilder sb = new StringBuilder();
for (GladosUserDO user : users) {
try {
for (int i = 0; i < 3; i++) {
if (checkInV2(user, sb)) {
break;
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
log.error("线程暂停10s失败");
}
}
} catch (Exception e) {
log.error("签到失败,", e);
}
}
if (StringUtils.isNotBlank(sb.toString())) {
taskResult.setSuccess(false);
taskResult.setSummary(sb.toString());
return taskResult;
}
taskResult.setSuccess(true);
return taskResult;
}
@Override
public void checkIn(String username) {
GladosUserDO gladosUserDO = gladosUserManage.findByUsername(username);
if (Objects.isNull(gladosUserDO)) {
log.info("[job] Glados Check In user not exists, username:{}", username);
return;
}
checkInV2(gladosUserDO, new StringBuilder());
}
public boolean checkInV2(GladosUserDO user, StringBuilder sb) {
Map<String, String> header = Maps.newHashMap();
header.put("Cookie", user.getCookie());
String response = null;
try {
response = HttpService.doPost(GladosConstants.GLADOS_CHECK_IN_URL, header, GladosConstants.GLADOS_CHECK_IN_BODY);
} catch (Exception e) {
log.error("http请求异常:{}", user.getEmail());
return false;
}
if (org.apache.commons.lang3.StringUtils.isBlank(response)) {
sb.append(user.getUser()).append("请求结果为空!");
return false;
}
GLaDOSResponse<CheckInResp> gLaDOSResponse = JSONObject.parseObject(response, new TypeReference<GLaDOSResponse<CheckInResp>>() {
});
if (Objects.isNull(gLaDOSResponse)) {
sb.append(user.getUser()).append("请求结果为空!");
return false;
}
if (0 == gLaDOSResponse.getCode()) {
// 成功请求
if (Objects.nonNull(gLaDOSResponse.getPoints()) && 0 != gLaDOSResponse.getPoints()) {
// 签到成功
dingTalkService.sendMsg("[时间:" + LocalDateTime.now() + "] 用户: " +
user.getEmail() + "签到成功,获得积分:" + gLaDOSResponse.getPoints());
return Boolean.TRUE;
}
}
if (gLaDOSResponse.getMessage().contains("Today's observation logged")) {
if (!CollectionUtils.isEmpty(gLaDOSResponse.getList())) {
dingTalkService.sendMsg("用户:" + user.getEmail() + "当前已签到。结果:" + gLaDOSResponse.getList().get(0));
sb.append(user.getUser()).append("当前已经签到!");
return true;
}
}
if (-2 == gLaDOSResponse.getCode()) {
log.warn("签到失败,用户:{}, cookie过期:{}", user.getEmail(), gLaDOSResponse.getMessage());
String message = "[时间:" + LocalDateTime.now() + "] 用户: " + user.getEmail() + ",签到消息: " +
gLaDOSResponse.getMessage() + "手动请求http://general.xiangtech.xyz:30026/script/glados/checkIn?username=" + user.getUser();
try {
dingTalkService.sendMsg(message);
sb.append(user.getUser()).append("签到结果异常!结果:").append(gLaDOSResponse.getMessage());
return true;
} catch (Exception e) {
log.error("发送钉钉消息失败", e);
}
}
// 请求异常
dingTalkService.sendMsg("用户:" + user.getEmail() + "请求异常,响应结果:" + gLaDOSResponse.getMessage());
sb.append(user.getUser()).append("响应结果异常!结果:").append(gLaDOSResponse.getMessage());
return false;
}
}

View File

@@ -0,0 +1,23 @@
package com.xiang.service.module.glados.service;
import com.xiang.common.pojo.glados.GladosUserDO;
import com.xiang.common.pojo.schedule.TaskResult;
/**
* @Author: xiang
* @Date: 2025-05-08 14:38
*/
public interface IGLaDOSService {
/**
* 签到
*/
TaskResult checkIn();
/**
* 根据用户名签到
* @param username
*/
void checkIn(String username);
}