package cn.van.business.util; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONArray; import com.alibaba.fastjson2.JSONObject; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.util.*; import java.util.concurrent.TimeUnit; import static cn.hutool.core.thread.ThreadUtil.sleep; /** * @author Leo * @version 1.0 * @create 2023/12/22 0022 上午 09:59 * @description: */ @Component public class QLUtil { //client_id public static final String CLIENT_ID = "Ouv_S9gk5LpV"; //client_secret public static final String CLIENT_SECRET = "1pLjAIfBBzu1_UA9q-hOj778"; public static final String QL_TOKEN_KEY = "QL_TOKEN_KEY"; //private static final RedisCache redisCache = SpringUtil.getBean(RedisCache.class); private static final Logger logger = LoggerFactory.getLogger(QLUtil.class); /** * 1. 在系统设置 -> 应用设置 -> 添加应用,权限目前支持5个模块,可以选择多个模块。选择一个模块之后,可读写此模块的所有接口。 * 2. 使用生成的 client_id 和 client_secret 请求获取token接口 http://localhost:5700/open/auth/token?client_id=xxxxxx&client_secret=xxxxxxxx * 3. 上面接口返回的token有效期为30天,可用于请求青龙的接口 curl 'http://localhost:5700/open/envs?searchValue=&t=1630032278171' -H 'Authorization: Bearer * 接口返回的token' * 4. openapi的接口与系统正常接口的区别就是青龙里的是/api/envs,openapi是/open/envs,即就是青龙接口中的api换成open */ public static String QL_BASE_URL = "http://134.175.126.60:45700"; public static final String GET_TOKEN = QL_BASE_URL + "/open/auth/token"; // /open/envs public static final String GET_ENV = QL_BASE_URL + "/open/envs"; // /open/crons public static final String GET_CRON = QL_BASE_URL + "/open/crons"; private Environment env; @Autowired private StringRedisTemplate redisTemplate; public QLUtil(Environment env) { this.env = env; QL_BASE_URL = env.getProperty("config.QL_BASE_URL"); } public String getToken() { String token = null; token = redisTemplate.opsForValue().get(QL_TOKEN_KEY); if (StrUtil.isNotEmpty(token)) { } else { //HashMap map = new HashMap<>(); //map.put("client_id", CLIENT_ID); //map.put("client_secret", CLIENT_SECRET); //String jsonStr = JSON.toJSONString(map); while (Util.isNotEmpty(token)) { //* 2. 使用生成的 client_id 和 client_secret 请求获取token接口 http://localhost:5700/open/auth/token?client_id=xxxxxx&client_secret=xxxxxxxx String responseStr = HttpRequest.get(GET_TOKEN + "?client_id=" + CLIENT_ID + "&client_secret=" + CLIENT_SECRET).execute().body(); if (ObjectUtil.isNotEmpty(responseStr)) { //{"code":200,"data":{"token":"950e3060-d714-4f6a-9839-c098a116f0a8","token_type":"Bearer","expiration":1705743778}} JSONObject jsonObject = JSON.parseObject(responseStr); if (Objects.equals(String.valueOf(jsonObject.getString("code")), "200")) { JSONObject response = jsonObject.getJSONObject("data"); redisTemplate.opsForValue().set(QL_TOKEN_KEY, (String) response.get("token"), (int) response.get("expiration"), TimeUnit.SECONDS); token = (String) response.get("token"); } } sleep(500); } } return token; } // get /envs /** * @return * @throws * @description 获取所有环境变量 */ public JSONArray getEnv(String searchKey) { String token = getToken(); JSONArray result = new JSONArray(); int maxRetryCount = 3; int retryCount = 0; String getUrl = GET_ENV + "?searchValue=&t=1630032278171"; if (Util.isNotEmpty(searchKey)) { getUrl = GET_ENV + "?searchValue=" + searchKey + "&t=1630032278171"; } while (result.size() == 0 && retryCount < maxRetryCount) { String responseStr = HttpRequest.get(getUrl).header("Authorization", "Bearer " + token).execute().body(); if (ObjectUtil.isNotEmpty(responseStr)) { JSONObject qlResponse = JSONObject.parseObject(responseStr); if (qlResponse.getString("code").equals("200")) { result = (JSONArray) qlResponse.get("data"); //result = null; } } retryCount++; sleep(1000); } return result; } /** * @param name * @return * @throws * @description 检查是否存在环境变量,存在返回值,不存在返回null */ //public String getEnvValue(String name) { // JSONObject jsonObject = getEnv(); // if (ObjectUtil.isNotEmpty(jsonObject)) { // return jsonObject.getJSONObject(name).getString("value"); // } // return null; //} // post /envs // { // "value": "123", // "name": "test_add", // "remarks": "新建测试" //} /** * @param name * @param remarks * @param value * @return * @throws * @description 添加环境变量 name 环境变量名,value 环境变量值,remarks 环境变量备注 * 如果存在一样的value 会返回 400 * 如果添加成功,就返回 TRUE ,否则返回 FALSE */ public Boolean addEnv(String value, String name, String remarks) { String token = getToken(); JSONObject result = new JSONObject(); List bodyArr = Collections.singletonList(new QLEnv(value, name, remarks)); logger.info("addEnv 请求body {}", JSON.toJSONString(bodyArr)); // 设置最大重试次数 int maxRetryCount = 3; int retryCount = 0; while (Util.isEmpty(result) && retryCount < maxRetryCount) { String responseStr = HttpRequest.post(GET_ENV) .header("Authorization", "Bearer " + token) .body(JSON.toJSONString(bodyArr)) .execute() .body(); logger.info("responseStr 响应 {}", responseStr); if (Util.isNotEmpty(responseStr)) { JSONObject qlResponse = JSONObject.parseObject(responseStr); String code = qlResponse.getString("code"); if ("200".equals(code)) { logger.info("200 响应 {}", qlResponse); result = (JSONObject) qlResponse.get("data"); return true; } else if ("400".equals(code)) { logger.info("400 响应 {}", qlResponse); result = (JSONObject) qlResponse.get("message"); break; } } retryCount++; sleep(1000); } return false; } // http://134.175.126.60:45700/api/crons?searchValue=&page=1&size=20&filters={}&queryString={%22filters%22:null,%22sorts%22:null,%22filterRelation%22:%22and%22}&t=1703148561868 /** * @param searchKey * @return * @throws * @description 获取定时任务列表 */ public List getCron(String searchKey) { String token = getToken(); List cronList = new ArrayList<>(); int maxRetryCount = 3; int retryCount = 0; String getUrl = GET_CRON + "?searchValue=&t=1630032278171"; if (Util.isNotEmpty(searchKey)) { getUrl = GET_CRON + "?searchValue=" + searchKey + "&t=1630032278171"; } while (cronList.size() == 0 && retryCount < maxRetryCount) { String responseStr = HttpRequest.get(getUrl).header("Authorization", "Bearer " + token).execute().body(); if (ObjectUtil.isNotEmpty(responseStr)) { JSONObject qlResponse = JSONObject.parseObject(responseStr); String code = qlResponse.getString("code"); //{"code":200,"data":{"data":[],"total":0}} if ("200".equals(code)) { logger.info("200 响应 {}", qlResponse); JSONObject dataObj = qlResponse.getJSONObject("data"); if (dataObj.getInteger("total") == 0) { } else { ArrayList data = JSONObject.parseObject(dataObj.getString("data"), ArrayList.class); System.out.println(data.size()); } } else if ("400".equals(code)) { logger.info("400 响应 {}", qlResponse); //result = (JSONArray) qlResponse.get("message"); } retryCount++; sleep(500); } } return null; } /* * 请求网址: * http://134.175.126.60:45700/api/crons/run?t=1703148561868 * 请求方法: * PUT*/ //public JSONObject runCron(String cronId) { // String token = getToken(); // if (StrUtil.isNotEmpty(token)) { // for (int i = 0; i < 3; i++) { // String responseStr = HttpRequest.put(GET_CRON + "?cronId=" + cronId).header("Authorization", "Bearer " + token).execute().body(); // if (ObjectUtil.isNotEmpty(responseStr)) { // QLResponse qlResponse = JSON.parseObject(responseStr, QLResponse.class); // if (Objects.equals(String.valueOf(qlResponse.getCode()), "200")) { // return qlResponse.getData(); // } // } // sleep(500); // } // } // return null; //} /** * } * async ["getLoginedUserInfo"](_0x4ef1fe = {}) { * let _0x26ac1b = false; * try { * const _0x3daa7c = { * "token": this.token * }; * const _0xe8bb64 = { * "fn": "getLoginedUserInfo", * "method": "get", * "url": "https://i.meituan.com/wrapapi/getLoginedUserInfo", * "searchParams": _0x3daa7c * }; * let { * result: _0x48e5d7 * } = await this.request(_0xe8bb64); * if (_0x48e5d7?.["mobile"]) { * _0x26ac1b = true; * this.name = _0x48e5d7.nickName; * this.userId = Number(_0x48e5d7.userId); * this.log("登录成功"); * } else { * this.log("获取账号信息失败, ck可能失效");//, {"notify": true} * await expireNotify(this.userId, this.index); * } * } catch (_0x232c57) { * console.log(_0x232c57); * } finally { * return _0x26ac1b; * } * } */ // 通过token 获取用户信息 // url https://i.meituan.com/wrapapi/getLoginedUserInfo // 参数 token // get public HashMap getLoginedUserInfo(String token) { String responseStr = HttpRequest.get("https://i.meituan.com/wrapapi/getLoginedUserInfo" + "?token=" + token).header("token", token).execute().body(); HashMap result = new HashMap<>(); if (ObjectUtil.isNotEmpty(responseStr)) { JSONObject qlResponse = JSON.parseObject(responseStr); //{"userId":"3822095266","nickName":"XLP200660795","growthValue":null,"growthLevel":null,"avatarUrl":"","mobile":"15817969021"} if (qlResponse.containsKey("mobile")) { result.put("mobile", qlResponse.getString("mobile")); } if (qlResponse.containsKey("nickName")) { result.put("nickName", qlResponse.getString("nickName")); } } return result; } // new QLEnv(value, name, remarks) @Data @AllArgsConstructor @NoArgsConstructor private static class QLEnv { private String value; private String name; private String remarks; } @Data @AllArgsConstructor @NoArgsConstructor private class Cron { private long id; private String name; private String command; private String schedule; private String timestamp; private boolean saved; private long status; private long isSystem; private long pid; private long isDisabled; private long isPinned; private String logPath; private List labels; private long lastRunningTime; private long lastExecutionTime; private long subID; private String createdAt; private String updatedAt; } }