完成基本京粉功能推送,订单统计,订单拉取的稳定版初版
This commit is contained in:
353
src/main/java/cn/van/business/util/QLUtil.java
Normal file
353
src/main/java/cn/van/business/util/QLUtil.java
Normal file
@@ -0,0 +1,353 @@
|
||||
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<String, String> 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<QLEnv> 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<Cron> getCron(String searchKey) {
|
||||
String token = getToken();
|
||||
List<Cron> 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<String, String> getLoginedUserInfo(String token) {
|
||||
String responseStr = HttpRequest.get("https://i.meituan.com/wrapapi/getLoginedUserInfo" + "?token=" + token).header("token", token).execute().body();
|
||||
HashMap<String, String> 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<Object> labels;
|
||||
private long lastRunningTime;
|
||||
private long lastExecutionTime;
|
||||
private long subID;
|
||||
private String createdAt;
|
||||
private String updatedAt;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user