diff --git a/pom.xml b/pom.xml index c234b20..5e1db2e 100644 --- a/pom.xml +++ b/pom.xml @@ -64,7 +64,23 @@ + + org.java-websocket + Java-WebSocket + 1.5.1 + + + + org.codehaus.jackson + jackson-mapper-asl + 1.9.2 + + + org.codehaus.jackson + jackson-core-asl + 1.9.2 + org.springframework.boot spring-boot-starter-test diff --git a/src/lib/open-api-sdk-2.0-2024-10-21.jar b/src/lib/open-api-sdk-2.0-2024-10-21.jar new file mode 100644 index 0000000..58745e4 Binary files /dev/null and b/src/lib/open-api-sdk-2.0-2024-10-21.jar differ diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/WXListener.java b/src/main/java/cn/van333/mt2ql/wxMessage/WXListener.java index 4cf0e04..e5c6080 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/WXListener.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/WXListener.java @@ -58,7 +58,7 @@ public class WXListener { * } **/ @RequestMapping("/message") - public String message(@RequestBody String requestBody) { + public String message(@RequestBody String requestBody) throws Exception { WxMessage message = JSONObject.parseObject(requestBody, WxMessage.class); wxMessageConsumer.consume(message); return "OK"; @@ -70,5 +70,15 @@ public class WXListener { System.out.println(requestBody); return "OK"; } + @RequestMapping("/receive_msg") + public String receiveMsg(@RequestBody String requestBody) throws Exception { + + System.out.println("测试接口收到数据:"); + System.out.println(requestBody); + WxMessage message = JSONObject.parseObject(requestBody, WxMessage.class); + wxMessageConsumer.consume(message); + + return "OK"; + } } diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/binance/WSClient.java b/src/main/java/cn/van333/mt2ql/wxMessage/binance/WSClient.java new file mode 100644 index 0000000..b1fef29 --- /dev/null +++ b/src/main/java/cn/van333/mt2ql/wxMessage/binance/WSClient.java @@ -0,0 +1,64 @@ +package cn.van333.mt2ql.wxMessage.binance; + +import cn.van333.mt2ql.wxMessage.utils.SpringContextUtil; +import cn.van333.mt2ql.wxMessage.utils.WXUtil; +import com.alibaba.fastjson2.JSONObject; +import org.java_websocket.client.WebSocketClient; +import org.java_websocket.handshake.ServerHandshake; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.ArrayList; +import java.util.List; + +/** + * @author Leo + * @version 1.0 + * @create 2024/03/11 0011 下午 03:52 + * @description: + */ +public class WSClient extends WebSocketClient { + private List dataList = new ArrayList<>(); + + public WSClient(String url) throws URISyntaxException { + super(new URI(url)); + } + + @Override + public void onOpen(ServerHandshake handshakedata) { + System.out.println("连接建立"); + } + + @Override + public void onMessage(String message) { + /** 数据结构 {"e":"avgPrice","E":1710146170238,"s":"APTUSDT","i":"5m","w":"13.26427038","T":1710146170230} + 拿出所有的数据 */ + JSONObject data = JSONObject.parseObject(message); + dataList.add(data); + if (dataList.size() == 5) { + StringBuilder text = new StringBuilder(); + for (JSONObject jsonObject : dataList) { + String type = jsonObject.getString("s"); + String price = jsonObject.getString("w"); + Long start = jsonObject.getLong("T"); + Long end = jsonObject.getLong("E"); + text.append(type).append(" ").append(price).append(" ").append(start).append(" ").append(end).append("\n"); + } + WXUtil wxUtil = SpringContextUtil.getBean(WXUtil.class); + wxUtil.sendTextMessage("wxid_kr145nk7l0an31", text.toString(), 2, "wxid_kr145nk7l0an31"); // 假设send方法接受List作为参数,如果不是,你需要修改这行代码 + dataList.clear(); + } + + + } + + @Override + public void onClose(int code, String reason, boolean remote) { + System.out.println("连接关闭"); + } + + @Override + public void onError(Exception ex) { + System.out.println("发生错误: " + ex.getMessage()); + } +} diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/config/WebSocketConfig.java b/src/main/java/cn/van333/mt2ql/wxMessage/config/WebSocketConfig.java new file mode 100644 index 0000000..1018aee --- /dev/null +++ b/src/main/java/cn/van333/mt2ql/wxMessage/config/WebSocketConfig.java @@ -0,0 +1,30 @@ +package cn.van333.mt2ql.wxMessage.config; + +import cn.van333.mt2ql.wxMessage.binance.WSClient; +import org.java_websocket.client.WebSocketClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.PostConstruct; +import java.net.URISyntaxException; + +/** + * @author Leo + * @version 1.0 + * @create 2024/03/11 0011 下午 03:57 + * @description: + */ +//@Configuration +public class WebSocketConfig { + private WebSocketClient client; + + @PostConstruct + public void init() throws URISyntaxException{ + //client = new WSClient("wss://data-stream.binance.vision/ws/aptusdt@avgPrice"); + } + + @Bean + public WebSocketClient webSocketClient() { + return client; + } +} diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/config/WebSocketInitializer.java b/src/main/java/cn/van333/mt2ql/wxMessage/config/WebSocketInitializer.java new file mode 100644 index 0000000..40919d4 --- /dev/null +++ b/src/main/java/cn/van333/mt2ql/wxMessage/config/WebSocketInitializer.java @@ -0,0 +1,28 @@ +package cn.van333.mt2ql.wxMessage.config; + +import org.java_websocket.client.WebSocketClient; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; + +/** + * @author Leo + * @version 1.0 + * @create 2024/03/11 0011 下午 04:34 + * @description: + */ +//@Component +public class WebSocketInitializer { + + private final WebSocketClient webSocketClient; + + public WebSocketInitializer(WebSocketClient webSocketClient) { + this.webSocketClient = webSocketClient; + } + + @PostConstruct + public void startWebSocketClient() { + webSocketClient.connect(); + } +} diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/enums/EventType.java b/src/main/java/cn/van333/mt2ql/wxMessage/enums/EventType.java index c4f073f..c1c6fd2 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/enums/EventType.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/enums/EventType.java @@ -16,23 +16,38 @@ import java.util.Map; public enum EventType implements IEnum { /** - * 账号变动事件 (10014) - * 收到群聊消息 (10008) - * 收到私聊消息 (10009) - * 自己发出消息 (10010) - * 转账事件 (10006) - * 撤回事件 (10013) - * 好友请求 (10011) - * 支付事件 (10007) + 1 文本消息 + 3 图片消息 + 34 语音消息 + 37 好友确认消息 + 40 好友推荐消息 + 42 共享名片 + 43 视频消息 + 44 主动撤回 + 47 动画表情 + 48 位置消息 + 49 APP分享链接/文件 + 50 VOIP消息 + 51 微信初始化消息 + 52 VOIP结束消息 + 53 VOIP邀请 + 62 小视频 */ - ACCOUNT_CHANGE(10014, "账号变动事件"), - SELF_MESSAGE(10010, "自己发出消息"), - TRANSFER_EVENT(10006, "转账事件"), - PAY_EVENT(10007, "支付事件"), - GROUP_MESSAGE(10008, "收到群聊消息"), - PRIVATE_MESSAGE(10009, "收到私聊消息"), - REVOKE_EVENT(10013, "撤回事件"), - FRIEND_REQUEST(10011, "好友请求"); + TEXT(1, "文本消息"), + IMAGE(3, "图片消息"), + VOICE(34, "语音消息"), + FRIEND_CONFIRM(37, "好友确认消息"), + FRIEND_RECOMMEND(40, "好友推荐消息"), + SHARE_CARD(42, "共享名片"), + VIDEO(43, "视频消息"), + REVOKE(44, "主动撤回"), + ANIMATION(47, "动画表情"), + LOCATION(48, "位置消息"), + APP_SHARE_LINK(49, "APP分享链接/文件"), + VOIP(50, "微信初始化消息"), + VOIP_END(52, "VOIP结束消息"), + VOIP_INVITE(53, "VOIP邀请"), + SMALL_VIDEO(62, "小视频"); private final int key; private final String name; @@ -63,7 +78,7 @@ public enum EventType implements IEnum { return ""; } - public static Map getKeyVlue() { + public static Map getKeyValue() { Map map = new HashMap<>(); EventType[] items = EventType.values(); for (EventType item : items) { diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/enums/MsgTypeEnum.java b/src/main/java/cn/van333/mt2ql/wxMessage/enums/MsgTypeEnum.java index fb63d8f..d3b2ec0 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/enums/MsgTypeEnum.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/enums/MsgTypeEnum.java @@ -13,13 +13,21 @@ import java.util.Map; */ public enum MsgTypeEnum implements IEnum { /** - msgType 消息类型:1|文本 3|图片 34|语音 42|名片 43|视频 47|动态表情 48|地理位置 49|分享链接或附件 2001|红包 2002|小程序 2003|群邀请 10000|系统消息 - * */ + msgType : + 1|文本 3|图片 34|语音 + 42|名片 43|视频 47|动态表情 + 48|地理位置 49|分享链接或附件 2001|红包 + 2002|小程序 2003|群邀请 10000|系统消息 * */ TEXT(1, "文本"), IMAGE(3, "图片"), VOICE(34, "语音"), + ANIMATION(47, "动态表情"), + //名片 42 + CARD(42, "名片"), + + VIDEO(43, "视频"), - SHARE(49, "分享"), + SHARE(49, "分享链接或附件"), LOCATION(48, "位置"), REDPACKET(2001, "红包"), MINIPROGRAM(2002, "小程序"), diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/enums/WXReqType.java b/src/main/java/cn/van333/mt2ql/wxMessage/enums/WXReqType.java index 0f2f9b7..1a1e079 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/enums/WXReqType.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/enums/WXReqType.java @@ -67,18 +67,18 @@ public enum WXReqType { DELETE_FRIEND("Q0022", "删除好友"), MODIFY_OBJECT_REMARK("Q0023", "修改对象备注"), MODIFY_GROUP_NAME("Q0024", "修改群聊名称"); - private final String key; + private final String url; private final String name; - WXReqType(String key, String name) { - this.key = key; + WXReqType(String url, String name) { + this.url = url; this.name = name; } public static WXReqType get(String key) { for (WXReqType e : WXReqType.values()) { - if (Objects.equals(e.getKey(), key)) { + if (Objects.equals(e.getUrl(), key)) { return e; } } @@ -89,7 +89,7 @@ public enum WXReqType { //if (Object.isNotEmpty(key)) { WXReqType[] items = WXReqType.values(); for (WXReqType item : items) { - if (Objects.equals(item.getKey(), key)) { + if (Objects.equals(item.getUrl(), key)) { return item.getName(); } } @@ -101,7 +101,7 @@ public enum WXReqType { Map map = new HashMap<>(); WXReqType[] items = WXReqType.values(); for (WXReqType item : items) { - map.put(item.getKey() + "", item.getName()); + map.put(item.getUrl() + "", item.getName()); } return map; } @@ -112,15 +112,15 @@ public enum WXReqType { for (WXReqType item : items) { Map map = new HashMap<>(); map.put("label", item.getName()); - map.put("value", item.getKey()); + map.put("value", item.getUrl()); result.add(map); } return result; } @JsonValue - public String getKey() { - return key; + public String getUrl() { + return url; } public String getName() { diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/model/WxMessage.java b/src/main/java/cn/van333/mt2ql/wxMessage/model/WxMessage.java index 9aec95c..682f101 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/model/WxMessage.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/model/WxMessage.java @@ -17,16 +17,32 @@ public class WxMessage { // "wxid": "wxid_3sq4tklb6c3121", //收到这条事件的微信 // "data": {} //事件的主要内容,不同事件,具体对象参数也不尽相同 //} - private Integer event; - private String wxid; - private JSONObject data; - public WxMessage() { - } + /** + * { + * "ServerPort":"30001", + * "selfwxid":"wxid_kr145nk7l0an31", + * "time":"1714465284", + * "type":"1", + * "msgsvrid":"4355263386657895005", + * "msg":"【京东】https://3.cn/1Y-DPkR9「可口可乐(Coca-Cola)雪碧 Sprite零卡无糖零卡汽水饮料330ml*24瓶整箱装」\n点击链接直接打开", + * "sougrce":"\n \n \n 1\n \n \n 1\n V1_NQ5b5w2k|v1_NQ5b5w2k\n \n \n \n\n", + * "file_path":"C:\\Users\\雷神\\Documents\\WeChat Files\\", + * "fromtype":"1", + * "fromid":"wxid_ytpc72mdoskt22", + * "toid":"wxid_kr145nk7l0an31" + * }*/ + private String serverPort; + private String selfwxid; + private String time; + private String type; + private String msgsvrid; + private String msg; + private String sougrce; + private String filePath; + private String fromtype; + private String fromid; + private String toid; + private String fromgid; - public WxMessage(Integer event, String wxid, JSONObject data) { - this.event = event; - this.wxid = wxid; - this.data = data; - } } diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/model/WxUser.java b/src/main/java/cn/van333/mt2ql/wxMessage/model/WxUser.java index f1b9a71..1703735 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/model/WxUser.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/model/WxUser.java @@ -47,10 +47,15 @@ public class WxUser implements Serializable { private String name; /** - * 1 正常 2 拉黑 + * 0 正常 1 拉黑 */ private Integer status; + /** + * 0 是 1 不是 + */ + private Integer isnew; + @TableField(exist = false) private static final long serialVersionUID = 1L; @@ -72,7 +77,8 @@ public class WxUser implements Serializable { && (this.getCountChongzhi() == null ? other.getCountChongzhi() == null : this.getCountChongzhi().equals(other.getCountChongzhi())) && (this.getCountXiaofei() == null ? other.getCountXiaofei() == null : this.getCountXiaofei().equals(other.getCountXiaofei())) && (this.getName() == null ? other.getName() == null : this.getName().equals(other.getName())) - && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())); + && (this.getStatus() == null ? other.getStatus() == null : this.getStatus().equals(other.getStatus())) + && (this.getIsnew() == null ? other.getIsnew() == null : this.getIsnew().equals(other.getIsnew())); } @Override @@ -86,6 +92,7 @@ public class WxUser implements Serializable { result = prime * result + ((getCountXiaofei() == null) ? 0 : getCountXiaofei().hashCode()); result = prime * result + ((getName() == null) ? 0 : getName().hashCode()); result = prime * result + ((getStatus() == null) ? 0 : getStatus().hashCode()); + result = prime * result + ((getIsnew() == null) ? 0 : getIsnew().hashCode()); return result; } @@ -102,6 +109,7 @@ public class WxUser implements Serializable { sb.append(", countXiaofei=").append(countXiaofei); sb.append(", name=").append(name); sb.append(", status=").append(status); + sb.append(", isnew=").append(isnew); sb.append(", serialVersionUID=").append(serialVersionUID); sb.append("]"); return sb.toString(); diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/utils/QLUtil.java b/src/main/java/cn/van333/mt2ql/wxMessage/utils/QLUtil.java index acf830f..7297c04 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/utils/QLUtil.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/utils/QLUtil.java @@ -5,10 +5,17 @@ import cn.hutool.core.util.StrUtil; import cn.hutool.extra.spring.SpringUtil; 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.core.env.Environment; +import org.springframework.stereotype.Component; -import java.util.HashMap; -import java.util.Objects; +import java.util.*; import java.util.concurrent.TimeUnit; import static cn.hutool.core.thread.ThreadUtil.sleep; @@ -19,6 +26,7 @@ import static cn.hutool.core.thread.ThreadUtil.sleep; * @create 2023/12/22 0022 上午 09:59 * @description: */ +@Component public class QLUtil { /** * 1. 在系统设置 -> 应用设置 -> 添加应用,权限目前支持5个模块,可以选择多个模块。选择一个模块之后,可读写此模块的所有接口。 @@ -27,7 +35,7 @@ public class QLUtil { * 接口返回的token' * 4. openapi的接口与系统正常接口的区别就是青龙里的是/api/envs,openapi是/open/envs,即就是青龙接口中的api换成open */ - public static final String QL_BASE_URL = "http://134.175.126.60:45700"; + 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 @@ -42,35 +50,42 @@ public class QLUtil { 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); + + private Environment env; + + public QLUtil(Environment env) { + this.env = env; + QL_BASE_URL = env.getProperty("config.QL_BASE_URL"); + } public String getToken() { - String token = redisCache.getCacheObject(QL_TOKEN_KEY); + String token = null; + token = redisCache.getCacheObject(QL_TOKEN_KEY); if (StrUtil.isNotEmpty(token)) { - return token; + } else { //HashMap map = new HashMap<>(); //map.put("client_id", CLIENT_ID); //map.put("client_secret", CLIENT_SECRET); //String jsonStr = JSON.toJSONString(map); - for (int i = 0; i < 3; i++) { + 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); - - System.out.println(jsonObject.getString("code")); if (Objects.equals(String.valueOf(jsonObject.getString("code")), "200")) { JSONObject response = jsonObject.getJSONObject("data"); redisCache.setCacheObject(QL_TOKEN_KEY, (String) response.get("token"), (int) response.get("expiration"), TimeUnit.SECONDS); - return (String) response.get("token"); + token = (String) response.get("token"); } } sleep(500); } - return null; } + return token; } @@ -81,21 +96,30 @@ public class QLUtil { * @throws * @description 获取所有环境变量 */ - public JSONObject getEnv() { + public JSONArray getEnv(String searchKey) { String token = getToken(); - if (StrUtil.isNotEmpty(token)) { - for (int i = 0; i < 3; i++) { - String responseStr = HttpRequest.get(GET_ENV + "?searchValue=&t=1630032278171").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); - } + 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"; } - return null; + 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; } /** @@ -104,13 +128,13 @@ public class QLUtil { * @throws * @description 检查是否存在环境变量,存在返回值,不存在返回null */ - public String getEnvValue(String name) { - JSONObject jsonObject = getEnv(); - if (ObjectUtil.isNotEmpty(jsonObject)) { - return jsonObject.getJSONObject(name).getString("value"); - } - return null; - } + //public String getEnvValue(String name) { + // JSONObject jsonObject = getEnv(); + // if (ObjectUtil.isNotEmpty(jsonObject)) { + // return jsonObject.getJSONObject(name).getString("value"); + // } + // return null; + //} // post /envs // { @@ -125,54 +149,92 @@ public class QLUtil { * @param value * @return * @throws - * @description 添加环境变量 + * @description 添加环境变量 name 环境变量名,value 环境变量值,remarks 环境变量备注 + * 如果存在一样的value 会返回 400 + * 如果添加成功,就返回 TRUE ,否则返回 FALSE */ - public JSONObject addEnv(String value, String name, String remarks) { + public Boolean addEnv(String value, String name, String remarks) { String token = getToken(); - if (StrUtil.isNotEmpty(token)) { - for (int i = 0; i < 3; i++) { - String responseStr = HttpRequest.post(GET_ENV).header("Authorization", "Bearer " + token).body(JSON.toJSONString(new QLEnv(value, name, remarks))).execute().body(); - if (ObjectUtil.isNotEmpty(responseStr)) { - QLResponse qlResponse = JSON.parseObject(responseStr, QLResponse.class); - if (Objects.equals(String.valueOf(qlResponse.getCode()), "200")) { - return qlResponse.getData(); - } + 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; } - sleep(500); } + + retryCount++; + sleep(1000); } - return null; + 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 queryString + * @param searchKey * @return * @throws * @description 获取定时任务列表 */ - public JSONObject getCron(String queryString) { - if (StrUtil.isNotEmpty(queryString)) { - for (int i = 0; i < 3; i++) { - String responseStr = HttpRequest.get(GET_CRON + "?" + queryString).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); - } - } else { - for (int i = 0; i < 3; i++) { - String responseStr = HttpRequest.get(GET_CRON).execute().body(); - if (ObjectUtil.isNotEmpty(responseStr)) { - QLResponse qlResponse = JSON.parseObject(responseStr, QLResponse.class); - if (Objects.equals(String.valueOf(qlResponse.getCode()), "200")) { - return qlResponse.getData(); + 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); } } @@ -180,134 +242,113 @@ public class QLUtil { } /* - * 请求网址: - * 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; - } + * 请求网址: + * 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; - * } - * }*/ + * } + * 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; + 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; - - public QLEnv(String value, String name, String remarks) { - this.value = value; - this.name = name; - this.remarks = remarks; - } - - public String getValue() { - return value; - } - - public void setValue(String value) { - this.value = value; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getRemarks() { - return remarks; - } - - public void setRemarks(String remarks) { - this.remarks = remarks; - } } - private static class QLResponse { - private String code; - private JSONObject data; - - public String getCode() { - return code; - } - - public void setCode(String code) { - this.code = code; - } - - public JSONObject getData() { - return data; - } - - public void setData(JSONObject data) { - this.data = data; - } + @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; } + } diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/utils/SpringContextUtil.java b/src/main/java/cn/van333/mt2ql/wxMessage/utils/SpringContextUtil.java new file mode 100644 index 0000000..67b1a78 --- /dev/null +++ b/src/main/java/cn/van333/mt2ql/wxMessage/utils/SpringContextUtil.java @@ -0,0 +1,27 @@ +package cn.van333.mt2ql.wxMessage.utils; + +/** + * @author Leo + * @version 1.0 + * @create 2024/03/11 0011 下午 04:50 + * @description: + */ + +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +@Component +public class SpringContextUtil implements ApplicationContextAware { + + private static ApplicationContext applicationContext; + + public static T getBean(Class clazz) { + return applicationContext.getBean(clazz); + } + + @Override + public void setApplicationContext(ApplicationContext applicationContext) { + SpringContextUtil.applicationContext = applicationContext; + } +} diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/utils/Util.java b/src/main/java/cn/van333/mt2ql/wxMessage/utils/Util.java index 4f19c69..8d1103a 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/utils/Util.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/utils/Util.java @@ -7,19 +7,10 @@ package cn.van333.mt2ql.wxMessage.utils; * @description: 旗云的 Util 用习惯了 用一下 */ -import org.apache.ibatis.jdbc.SQL; -import org.apache.tomcat.util.codec.binary.Base64; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; import org.springframework.web.util.HtmlUtils; -import javax.activation.FileDataSource; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import java.io.*; import java.math.BigDecimal; import java.util.*; @@ -1023,12 +1014,6 @@ Util { } public static void main(String[] args) { - List s = new ArrayList(); - s.add("a"); - s.add("b"); - s.add(""); - s.add("d"); - System.out.println(joinIgnoreEmpty(s, ",")); } /** diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/utils/WXUtil.java b/src/main/java/cn/van333/mt2ql/wxMessage/utils/WXUtil.java index 13e4e3f..334bcbc 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/utils/WXUtil.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/utils/WXUtil.java @@ -6,8 +6,14 @@ import cn.hutool.http.HttpRequest; import cn.van333.mt2ql.wxMessage.enums.WXReqType; import com.alibaba.fastjson2.JSON; 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.stereotype.Component; import java.util.HashMap; @@ -17,7 +23,11 @@ import java.util.HashMap; * @create 2023/12/22 0022 上午 09:59 * @description: */ +@Component public class WXUtil { + private static final RedisCache redisCache = SpringUtil.getBean(RedisCache.class); + private static final Logger logger = LoggerFactory.getLogger(WXUtil.class); + private static final String super_admin_wxid = "wxid_ytpc72mdoskt22"; /** * url http://127.0.0.1:7777/DaenWxHook/httpapi/ * 获取微信列表 (X0000) @@ -48,12 +58,15 @@ public class WXUtil { * 修改群聊名称(Q0024) * 发送名片(Q0025) */ - public static final String WX_BASE_URL = "http://134.175.126.60:47777/DaenWxHook/httpapi/"; - private static final RedisCache redisCache = SpringUtil.getBean(RedisCache.class); - private static final Logger logger = LoggerFactory.getLogger(WXUtil.class); - - private static final String super_admin_wxid = "wxid_ytpc72mdoskt22"; + public static String WX_BASE_URL; + private Environment env; + @Autowired + public WXUtil(Environment env) { + this.env = env; + WX_BASE_URL = env.getProperty("config.WX_BASE_URL"); + System.out.println("WX_BASE_URL:" + WX_BASE_URL); + } // 获取微信列表 public JSONObject getWxList() { @@ -69,31 +82,39 @@ public class WXUtil { // 发送文本消息 msgType 1:私聊 2:群发 public JSONObject sendTextMessage(String wxid, String content, Integer msgType, String fromwxid) { + // 全部打印 + logger.info("发送文本消息 msgType: " + msgType + " wxid: " + wxid + " fromwxid: " + fromwxid + " content: " + content); // 如果是自己的微信,所有信息都加上少爷 if (wxid.equals(super_admin_wxid) || fromwxid.equals(super_admin_wxid)) { content = " 少爷好!\n " + content; } - String botWxid = ""; - JSONObject wxList = getWxList(); - JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0); - botWxid = wxBotInfo.getString("wxid"); - + //JSONObject wxList = getWxList(); + //JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0); + //botWxid = wxBotInfo.getString("wxid"); // - WxReqDate wxReqDate = createWxReqData(WXReqType.SEND_TEXT_MESSAGE); + //// + //WxReqDate wxReqDate = createWxReqData(WXReqType.SEND_TEXT_MESSAGE); JSONObject jsonObject = new JSONObject(); - if ((msgType.equals(1))) { - jsonObject.put("wxid", wxid); - content = content; - } - //[@,wxid=对象wxid,nick=对象昵称,isAuto=true] - if ((msgType.equals(2))) { - jsonObject.put("wxid", fromwxid); - content = "[@,wxid=" + wxid + ",nick=6,isAuto=true] " + content; - } + //if ((msgType.equals(1))) { + // jsonObject.put("wxid", wxid); + // content = content; + //} + ////[@,wxid=对象wxid,nick=对象昵称,isAuto=true] + //if ((msgType.equals(2))) { + // jsonObject.put("wxid", fromwxid); + // content = "[@,wxid=" + wxid + ",nick=6,isAuto=true] " + content; + //} + /* + * { + "wxid": "filehelper", + "msg": "666大佬~" + }*/ jsonObject.put("msg", content); - wxReqDate.setData(jsonObject); - while (Util.isNotEmpty(botWxid)) { - String responseStr = HttpRequest.post(WX_BASE_URL + "?wxid=" + botWxid).body(JSON.toJSONString(wxReqDate)).execute().body(); + jsonObject.put("wxid", wxid); + System.out.println(JSON.toJSONString(jsonObject)); + //wxReqDate.setData(jsonObject); + while (Util.isNotEmpty(wxid)) { + String responseStr = HttpRequest.post(WX_BASE_URL + "/SendTextMsg").body(JSON.toJSONString(jsonObject)).execute().body(); if (ObjectUtil.isNotEmpty(responseStr)) { JSONObject response = JSON.parseObject(responseStr); //WxResponse wxResponse = JSON.parseObject(responseStr, WxResponse.class); @@ -102,6 +123,7 @@ public class WXUtil { // return wxResponse.getData(); //} //JSONObject jsonObject = HttpUtil.sendPost(url, wxReqDate.getData()); + logger.info("消息响应:" + response.toString()); return response; } try { @@ -151,7 +173,7 @@ public class WXUtil { JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0); botWxid = wxBotInfo.getString("wxid"); WxReqDate wxReqDate = createWxReqData(WXReqType.CONFIRM_RECEIPT); - HashMap body = new HashMap<>(); + HashMap body = new HashMap<>(); body.put("wxid", wxid); body.put("transferid", transferid); JSONObject jsonObject = new JSONObject(body); @@ -168,11 +190,14 @@ public class WXUtil { public WxReqDate createWxReqData(WXReqType wxReqType) { - WxReqDate wxReqDate = new WxReqDate(wxReqType.getKey(), null); + WxReqDate wxReqDate = new WxReqDate(wxReqType.getUrl(), null); return wxReqDate; } + @Data + @AllArgsConstructor + @NoArgsConstructor private class WxResponse { /** * { @@ -194,86 +219,11 @@ public class WXUtil { private Integer pid; private String flag; private String timestamp; - - public WxResponse(Integer code, String msg, JSONObject result, String wxid, Integer port, Integer pid, String flag, String timestamp) { - this.code = code; - this.msg = msg; - this.result = result; - this.wxid = wxid; - this.port = port; - this.pid = pid; - this.flag = flag; - this.timestamp = timestamp; - } - - public WxResponse() { - } - - public Integer getCode() { - return code; - } - - public void setCode(Integer code) { - this.code = code; - } - - public String getMsg() { - return msg; - } - - public void setMsg(String msg) { - this.msg = msg; - } - - public JSONObject getResult() { - return result; - } - - public void setResult(JSONObject result) { - this.result = result; - } - - public String getWxid() { - return wxid; - } - - public void setWxid(String wxid) { - this.wxid = wxid; - } - - public Integer getPort() { - return port; - } - - public void setPort(Integer port) { - this.port = port; - } - - public Integer getPid() { - return pid; - } - - public void setPid(Integer pid) { - this.pid = pid; - } - - public String getFlag() { - return flag; - } - - public void setFlag(String flag) { - this.flag = flag; - } - - public String getTimestamp() { - return timestamp; - } - - public void setTimestamp(String timestamp) { - this.timestamp = timestamp; - } } + @Data + @AllArgsConstructor + @NoArgsConstructor private class WxReqDate { //{ // "type": "X0000", @@ -282,29 +232,6 @@ public class WXUtil { private String type; private JSONObject data; - public WxReqDate(String type, JSONObject data) { - this.type = type; - this.data = data; - } - - public WxReqDate() { - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public Object getData() { - return data; - } - - public void setData(JSONObject data) { - this.data = data; - } } diff --git a/src/main/java/cn/van333/mt2ql/wxMessage/utils/WxMessageConsumer.java b/src/main/java/cn/van333/mt2ql/wxMessage/utils/WxMessageConsumer.java index 54eb1a5..0a81d8d 100644 --- a/src/main/java/cn/van333/mt2ql/wxMessage/utils/WxMessageConsumer.java +++ b/src/main/java/cn/van333/mt2ql/wxMessage/utils/WxMessageConsumer.java @@ -1,15 +1,21 @@ package cn.van333.mt2ql.wxMessage.utils; import cn.hutool.extra.spring.SpringUtil; -import cn.van333.mt2ql.wxMessage.enums.EventType; +import cn.van333.mt2ql.wxMessage.model.Setting; import cn.van333.mt2ql.wxMessage.model.WxMessage; -import cn.van333.mt2ql.wxMessage.model.WxMessageDataForChat; -import cn.van333.mt2ql.wxMessage.model.WxMessageDataForTransfer; import cn.van333.mt2ql.wxMessage.model.WxUser; +import cn.van333.mt2ql.wxMessage.service.SettingService; import cn.van333.mt2ql.wxMessage.service.WxMessageDataForChatService; import cn.van333.mt2ql.wxMessage.service.WxUserService; -import com.alibaba.fastjson2.JSONObject; +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONArray; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.jd.open.api.sdk.DefaultJdClient; +import com.jd.open.api.sdk.JdClient; +import com.jd.open.api.sdk.domain.kplunion.promotioncommon.PromotionService.request.get.PromotionCodeReq; +import com.jd.open.api.sdk.request.kplunion.UnionOpenPromotionCommonGetRequest; +import com.jd.open.api.sdk.response.kplunion.UnionOpenPromotionCommonGetResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -17,9 +23,10 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.math.BigDecimal; -import java.util.Arrays; import java.util.HashMap; -import java.util.Iterator; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + /** * @author Leo @@ -30,7 +37,17 @@ import java.util.Iterator; @Component public class WxMessageConsumer { - public static final String meituanCookie = "meituanCookie"; + private static final String meituanCookie = "meituanCookie"; + /** + * key开头的为 setting 的 key + */ + private static final String key_caiDan_user = "用户菜单"; + private static final String key_caiDan_admin = "管理员菜单"; + /** + * order 开头的是接受的指令 + */ + private static final String order_caiDan = "菜单"; + private static final String order_admin = "管理员"; /**/ private static final Logger logger = LoggerFactory.getLogger(WxMessageConsumer.class); private static final RedisCache redisCache = SpringUtil.getBean(RedisCache.class); @@ -39,19 +56,30 @@ public class WxMessageConsumer { * 每次扣费 */ private static final BigDecimal priceOfMT20 = new BigDecimal("0.2"); + private static final String fromGR = "1"; + private static final String SERVER_URL = "https://api.jd.com/routerjson"; + private static final String accessToken = ""; + private static final String appKey = "98e21c89ae5610240ec3f5f575f86a59"; + private static final String appSecret = "3dcb6b23a1104639ac433fd07adb6dfb"; + private final WXUtil wxUtil; + private final QLUtil qlUtil; private final WxMessageDataForChatService wxMessageDataForChatService; private final WxUserService wxUserService; + private final SettingService settingService; @Autowired - public WxMessageConsumer(@Lazy WxMessageDataForChatService wxMessageDataForChatService, @Lazy WxUserService wxUserService) { + public WxMessageConsumer(WXUtil wxUtil, QLUtil qlUtil, @Lazy WxMessageDataForChatService wxMessageDataForChatService, @Lazy WxUserService wxUserService, @Lazy SettingService settingService) { + this.wxUtil = wxUtil; + this.qlUtil = qlUtil; this.wxMessageDataForChatService = wxMessageDataForChatService; this.wxUserService = wxUserService; + this.settingService = settingService; } //@Async("threadPoolTaskExecutor") - public void consume(WxMessage wxMessage) { - logger.info("接收到消息 : {}", wxMessage); - if (wxMessage.getEvent() == null) { + public void consume(WxMessage wxMessage) throws Exception { + //logger.info("接收到消息 : {}", wxMessage); + if (wxMessage.getType() == null) { return; } /** @@ -61,89 +89,140 @@ public class WxMessageConsumer { * 转账需要对接会员系统 * * */ - Integer event = wxMessage.getEvent(); - if (event.equals(EventType.PRIVATE_MESSAGE.getKey())) { + Integer event = Integer.valueOf(wxMessage.getType()); + String fromType = wxMessage.getFromtype(); + if (fromType.equals(fromGR)) { handlePrivateMessage(wxMessage); + } else { + //handleGroupMessage(wxMessage); } - if (event.equals(EventType.GROUP_MESSAGE.getKey())) { - handleGroupMessage(wxMessage); - } - if (event.equals(EventType.TRANSFER_EVENT.getKey())) { - handleTransferEvent(wxMessage); - } + //if (event.equals(EventType.TRANSFER_EVENT.getKey())) { + // handleTransferEvent(wxMessage); + //} } private Boolean heiMingDan(String wxid) { - Boolean flag = false; + // 0 正常 1 黑名单 + // + boolean flag = false; WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); if (Util.isNotEmpty(wxUser)) { - if (wxUser.getStatus().equals(2)) { + if (wxUser.getStatus().equals(1)) { flag = true; } } return flag; } + private String JD_Transfer(String url) throws Exception { + JdClient client = new DefaultJdClient(SERVER_URL, accessToken, appKey, appSecret); + UnionOpenPromotionCommonGetRequest request = new UnionOpenPromotionCommonGetRequest(); + request.setVersion("1.0"); + request.setSignmethod("md5"); + + PromotionCodeReq promotionCodeReq = new PromotionCodeReq(); + promotionCodeReq.setMaterialId(url); + promotionCodeReq.setSiteId("4101253066"); + promotionCodeReq.setSceneId(2); + promotionCodeReq.setCommand(1); + + + request.setPromotionCodeReq(promotionCodeReq); + UnionOpenPromotionCommonGetResponse response = client.execute(request); + + + System.out.println(request.getAppJsonParams()); + System.out.println(request.getPromotionCodeReq()); + + System.out.println("--------"); + System.out.println(response.getGetResult().getCode()); + System.out.println(response.getGetResult().getMessage()); + System.out.println(response.getGetResult().getData().getClickURL()); + System.out.println(response.getGetResult().getData().getJCommand()); + return response.getGetResult().getData().getClickURL(); + } + + private Boolean isNew(String wxid) { + // 0 是 1 不是 + boolean flag = false; + WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); + if (Util.isNotEmpty(wxUser)) { + if (wxUser.getIsnew().equals(0)) { + flag = true; + } + } + return flag; + } + + private Boolean isNew(Integer isNew) { + // 0 是 1 不是 + boolean flag = false; + if (isNew.equals(0)) { + flag = true; + } + return flag; + } + /** * @param wxMessage * @return * @throws * @description */ - private void handleTransferEvent(WxMessage wxMessage) { - Integer msgType = 1; - - /** - * { - * "fromWxid": "wxid_ytpc72mdoskt22", 对方wxid - * "msgSource": 1, 1|收到转账 2|对方接收转账 3|发出转账 4|自己接收转账 5|对方退还 6|自己退还 - * "transType": 1, 1|即时到账 2|延时到账 - * "money": "2.00", 金额,单位元 - * "memo": "", 转账备注 - * "transferid": "1000050001202312250424037787039", 转账ID - * "invalidtime": "1703577220" 10位时间戳 - * }*/ - JSONObject data = wxMessage.getData().getJSONObject("data"); - if (data == null) { - return; - } - WxMessageDataForTransfer wxMessageDataForTransfer = data.to(WxMessageDataForTransfer.class); - - String result = null; - String wxid = wxMessageDataForTransfer.getFromwxid(); - - WXUtil wxUtil = new WXUtil(); - - if (heiMingDan(wxid)) { - result = "您已被拉黑,请联系客服!"; - } else { - if (wxMessageDataForTransfer.getTranstype().equals(2)) { - result = "请勿使用延时到账功能。累计三次将永久拉黑!"; - } else { - - JSONObject shouKuanResult = wxUtil.queRenShouKuan(wxid, wxMessageDataForTransfer.getTransferid()); - if (shouKuanResult == null) { - result = "查询转账失败,请稍后再试。"; - } - if (shouKuanResult != null && shouKuanResult.getInteger("code") == 200) { - BigDecimal money = wxMessageDataForTransfer.getMoney(); - if (money.compareTo(BigDecimal.ZERO) > 0) { - WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); - wxUser.setMoneyLeiji(wxUser.getMoneyLeiji().add(money)); - wxUser.setMoneyShengyu(wxUser.getMoneyShengyu().add(money)); - wxUser.setCountChongzhi(wxUser.getCountChongzhi().add(BigDecimal.ONE)); - wxUserService.updateById(wxUser); - result = "收到转账" + money + "元,已成功存入账户。感谢您的使用。"; - } - } - - } - - } - wxUtil.sendTextMessage(wxid, result, msgType, null); - - } + //private void handleTransferEvent(WxMessage wxMessage) { + // Integer msgType = 1; + // + // /** + // * { + // * "fromWxid": "wxid_ytpc72mdoskt22", 对方wxid + // * "msgSource": 1, 1|收到转账 2|对方接收转账 3|发出转账 4|自己接收转账 5|对方退还 6|自己退还 + // * "transType": 1, 1|即时到账 2|延时到账 + // * "money": "2.00", 金额,单位元 + // * "memo": "", 转账备注 + // * "transferid": "1000050001202312250424037787039", 转账ID + // * "invalidtime": "1703577220" 10位时间戳 + // * }*/ + // JSONObject data = wxMessage.getData().getJSONObject("data"); + // if (data == null) { + // return; + // } + // WxMessageDataForTransfer wxMessageDataForTransfer = data.to(WxMessageDataForTransfer.class); + // + // String result = null; + // String wxid = wxMessageDataForTransfer.getFromwxid(); + // + // + // + // if (heiMingDan(wxid)) { + // result = "您已被拉黑,请联系客服!"; + // } else { + // if (wxMessageDataForTransfer.getTranstype().equals(2)) { + // result = "请勿使用延时到账功能。累计三次将永久拉黑!"; + // } else { + // + // JSONObject shouKuanResult = wxUtil.queRenShouKuan(wxid, wxMessageDataForTransfer.getTransferid()); + // if (shouKuanResult == null) { + // result = "查询转账失败,请稍后再试。"; + // } + // if (shouKuanResult != null && shouKuanResult.getInteger("code") == 200) { + // BigDecimal money = wxMessageDataForTransfer.getMoney(); + // if (money.compareTo(BigDecimal.ZERO) > 0) { + // WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); + // wxUser.setMoneyLeiji(wxUser.getMoneyLeiji().add(money)); + // wxUser.setMoneyShengyu(wxUser.getMoneyShengyu().add(money)); + // wxUser.setCountChongzhi(wxUser.getCountChongzhi().add(BigDecimal.ONE)); + // wxUserService.updateById(wxUser); + // result = "收到转账" + money + "元,已成功存入账户。感谢您的使用。"; + // } + // } + // + // } + // + // } + // wxUtil.sendTextMessage(wxid, result, msgType, null); + // + //} /** @@ -151,22 +230,22 @@ public class WxMessageConsumer { * * @param wxMessage */ - private void handlePrivateMessage(WxMessage wxMessage) { + private void handlePrivateMessage(WxMessage wxMessage) throws Exception { Integer msgType = 1; /** * 接收到消息 : WxMessage(event=10009, wxid=wxid_kr145nk7l0an31, data={"type":"D0003","des":"收到消息","data":{"timeStamp":"1703128368100","fromType":1,"msgT两次ype":1,"msgSource":0,"fromWxid":"wxid_ytpc72mdoskt22","finalFromWxid":"","atWxidList":[],"silence":0,"membercount":0,"signature":"v1_vXrWK/iB","msg":"嗨鲁个迷紫123","msgBase64":"5Zeo6bKB5Liq6L+357SrMTIz"},"timestamp":"1703128368112","wxid":"wxid_kr145nk7l0an31","port":16888,"pid":10468,"flag":"7777"}) * 需要get 两次 data 字段*/ - JSONObject data = wxMessage.getData().getJSONObject("data"); - if (data == null) { - return; - } + //JSONObject data = wxMessage.getData().getJSONObject("data"); + //if (data == null) { + // return; + //} /**{"type":"D0003","des":"收到消息","data":{"timeStamp":"1702957325031","fromType":1,"msgType":1,"msgSource":0,"fromWxid":"wxid_ytpc72mdoskt22","finalFromWxid":"","atWxidList":[],"silence":0,"membercount":0,"signature":"v1_OJXJYpvM","msg":"在不","msgBase64":"5Zyo5LiN"},"timestamp":"1702957325041","wxid":"wxid_kr145nk7l0an31","port":16888,"pid":10468,"flag":"7777"} * */ - WxMessageDataForChat wxMessageDataForChat = data.to(WxMessageDataForChat.class); + //WxMessageDataForChat wxMessageDataForChat = data.to(WxMessageDataForChat.class); // 做业务处理 - logger.info("处理消息: {}", wxMessageDataForChat.toString()); + logger.info("处理消息: {}", JSON.toJSONString(wxMessage)); /** * timeStamp 收到这条消息的13位现行时间戳 @@ -182,59 +261,131 @@ public class WxMessageConsumer { * msg 消息内容 * msgBase64 消息内容的Base64 * */ - if (Util.isAnyEmpty(wxMessageDataForChat.getMsg(), wxMessageDataForChat.getFromwxid(), wxMessageDataForChat.getFromtype())) { + if (Util.isAnyEmpty(wxMessage.getMsg(), wxMessage.getFromid())) { logger.info("消息内容为空,不处理"); return; } - String msg = wxMessageDataForChat.getMsg(); + String msg = wxMessage.getMsg(); //美团 20-7 + https://i.meituan.com/mttouch/page/account?userId=3822095266&token=AgHdIkm2tAGHc9SQSiG7M8xCx1LbTue9D2HPOAun2eYl3ou7BeEw1uGrGZH-DxmEiUgsbA1v9SM4DQAAAAC6HAAAz0rTXmkB_CIHin08hCu68mFv5k6nUc2q6_CfZqEdBcngRK_xD8Sx5fE4rfdq-yAJ, msgbase64=576O5ZuiIDIwLTcgKyBodHRwczovL2kubWVpdHVhbi5jb20vbXR0b3VjaC9wYWdlL2FjY291bnQ/dXNlcklkPTM4MjIwOTUyNjYmdG9rZW49QWdIZElrbTJ0QUdIYzlTUVNpRzdNOHhDeDFMYlR1ZTlEMkhQT0F1bjJlWWwzb3U3QmVFdzF1R3JHWkgtRHhtRWlVZ3NiQTF2OVNNNERRQUFBQUM2SEFBQXowclRYbWtCX0NJSGluMDhoQ3U2OG1GdjVrNm5VYzJxNl9DZlpxRWRCY25nUktfeEQ4U3g1ZkU0cmZkcS15QUo= - if (msg.startsWith("美团 20-7 ")) { - logger.info("处理美团的消息"); - msg = msg.substring(msg.indexOf("https://i.meituan.com/mttouch/page/account")); - String[] all = msg.split("\\?"); - - if (all.length == 2) { - String wxid = null; - if (wxMessageDataForChat.getFromtype() == 1) { - wxid = wxMessageDataForChat.getFromwxid(); - } else if (wxMessageDataForChat.getFromtype() == 2) { - wxid = wxMessageDataForChat.getFinalfromwxid(); - } - String httpData = all[1]; - String[] httpDataArr = httpData.split("&"); - if (httpDataArr.length == 2) { - String result = mt20(wxid, httpDataArr[0].split("=")[1], httpDataArr[1].split("=")[1]); - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxid, result, msgType, null); - } else { - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxid, "请检查提交的数据格式是否正确。", msgType, null); - } - } - } else if ("余额".equals(msg)) { - String wxid = null; - if (wxMessageDataForChat.getFromtype() == 1) { - wxid = wxMessageDataForChat.getFromwxid(); - } else if (wxMessageDataForChat.getFromtype() == 2) { - wxid = wxMessageDataForChat.getFinalfromwxid(); - } - WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); - String result = ""; - if (Util.isNotEmpty(wxUser)) { - result = "您的余额为:" + wxUser.getMoneyLeiji() + "元\r"; - result = result + " 您的消费次数为:" + wxUser.getCountXiaofei() + "次\r"; - result = result + " 您的充值次数为:" + wxUser.getCountChongzhi() + "次\r"; - result = result + " 您的累计充值为:" + wxUser.getMoneyLeiji() + "元"; + if (msg.startsWith("【京东】")) { + String wxid; + if (wxMessage.getFromtype().equals(fromGR)) { + wxid = wxMessage.getFromid(); } else { - result = "暂未查询到充值记录。\r"; + wxid = wxMessage.getFromgid(); } - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxid, result, msgType, null); - } - wxMessageDataForChatService.save(wxMessageDataForChat); + // 使用正则表达式匹配URL + String urlPattern = "https?://[\\w-\\.]+(\\.[a-z]{2,})?(/[\\w-./?%&=]*)?"; + Pattern pattern = Pattern.compile(urlPattern); + Matcher matcher = pattern.matcher(msg); + // 检查是否存在URL,如果存在则打印出来 + String finallyUrl = null; + if (matcher.find()) { + finallyUrl = matcher.group(); + System.out.println("Extracted URL: " + finallyUrl); + } else { + System.out.println("No URL found in the given text."); + } + if (Util.isNotEmpty(finallyUrl)) { + String transferResultUrl = JD_Transfer(finallyUrl); + wxUtil.sendTextMessage(wxid, transferResultUrl, msgType, null); + } + + } + //else if (msg.startsWith("美团 ")) { + // logger.info("处理美团的消息"); + // msg = msg.substring(msg.indexOf("https://i.meituan.com/mttouch/page/account")); + // String[] all = msg.split("\\?"); + // + // if (all.length == 2) { + // String wxid = null; + // if (wxMessage.getFromtype().equals(fromGR)) { + // wxid = wxMessage.getFromid(); + // } else { + // wxid = wxMessage.getFromgid(); + // } + // String httpData = all[1]; + // String[] httpDataArr = httpData.split("&"); + // if (httpDataArr.length == 2) { + // // 调用美团 + // //String result = mt20(wxid, httpDataArr[0].split("=")[1], httpDataArr[1].split("=")[1]); + // + // //wxUtil.sendTextMessage(wxid, result, msgType, null); + // } else { + // + // wxUtil.sendTextMessage(wxid, "请检查提交的数据格式是否正确。", msgType, null); + // } + // } + //} else if ("余额".equals(msg)) { + // String wxid = null; + // if (wxMessageDataForChat.getFromtype() == 1) { + // wxid = wxMessageDataForChat.getFromwxid(); + // } else if (wxMessageDataForChat.getFromtype() == 2) { + // wxid = wxMessageDataForChat.getFinalfromwxid(); + // } + // WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); + // String result = ""; + // if (Util.isNotEmpty(wxUser)) { + // result = "您的余额为:" + wxUser.getMoneyLeiji() + "元\r"; + // result = result + " 您的消费次数为:" + wxUser.getCountXiaofei() + "次\r"; + // result = result + " 您的充值次数为:" + wxUser.getCountChongzhi() + "次\r"; + // result = result + " 您的累计充值为:" + wxUser.getMoneyLeiji() + "元"; + // } else { + // result = "暂未查询到充值记录。\r"; + // } + // + // + // wxUtil.sendTextMessage(wxid, result, msgType, null); + //} else if ("体验".equals(msg)) { + // String wxid = null; + // if (wxMessageDataForChat.getFromtype() == 1) { + // wxid = wxMessageDataForChat.getFromwxid(); + // } else if (wxMessageDataForChat.getFromtype() == 2) { + // wxid = wxMessageDataForChat.getFinalfromwxid(); + // } + // String result = ""; + // if (heiMingDan(wxid)) { + // result = "黑名单!"; + // } else { + // WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); + // if (isNew(wxUser.getIsnew())) { + // wxUser.setMoneyLeiji(wxUser.getMoneyLeiji().add(new BigDecimal(1))); + // wxUser.setMoneyShengyu(wxUser.getMoneyShengyu().add(new BigDecimal(1))); + // wxUser.setCountChongzhi(wxUser.getCountChongzhi().add(BigDecimal.ONE)); + // wxUser.setIsnew(1); + // wxUserService.updateById(wxUser); + // result = "体验成功,您已成功充值" + 1.00 + "元,已成功存入账户。感谢您的使用。"; + // } else { + // result = "您已体验过,请勿重复体验。"; + // } + // + // } + // + // wxUtil.sendTextMessage(wxid, result, msgType, null); + // + //}// 用户返回用户菜单 + //else if (order_caiDan.equals(msg)) { + // String wxid = null; + // if (wxMessageDataForChat.getFromtype() == 1) { + // wxid = wxMessageDataForChat.getFromwxid(); + // } else if (wxMessageDataForChat.getFromtype() == 2) { + // wxid = wxMessageDataForChat.getFinalfromwxid(); + // } + // String result = ""; + // String puTong = getSetting(key_caiDan_user); + // String chaoJi = getSetting(key_caiDan_admin); + // if (isSuperAdminUser(wxid)) { + // result = "用户菜单:" + puTong + " 管理员菜单:" + chaoJi; + // } else { + // result = "用户菜单:" + puTong; + // } + // + // wxUtil.sendTextMessage(wxid, result, msgType, wxMessageDataForChat.getFromwxid()); + //} + // wxMessageDataForChatService.save(wxMessageDataForChat); } /** @@ -243,119 +394,250 @@ public class WxMessageConsumer { * @throws * @description 处理群聊消息 */ - private void handleGroupMessage(WxMessage wxMessage) { - Integer msgType = 2; - /** - * 接收到消息 : WxMessage(event=10009, wxid=wxid_kr145nk7l0an31, data={"type":"D0003","des":"收到消息","data":{"timeStamp":"1703128368100","fromType":1,"msgT两次ype":1,"msgSource":0,"fromWxid":"wxid_ytpc72mdoskt22","finalFromWxid":"","atWxidList":[],"silence":0,"membercount":0,"signature":"v1_vXrWK/iB","msg":"嗨鲁个迷紫123","msgBase64":"5Zeo6bKB5Liq6L+357SrMTIz"},"timestamp":"1703128368112","wxid":"wxid_kr145nk7l0an31","port":16888,"pid":10468,"flag":"7777"}) - * 需要get 两次 data 字段*/ - JSONObject data = wxMessage.getData().getJSONObject("data"); - if (data == null) { - return; +// private void handleGroupMessage (WxMessage wxMessage){ +// Integer msgType = 2; +// /** +// * 接收到消息 : WxMessage(event=10009, wxid=wxid_kr145nk7l0an31, data={"type":"D0003","des":"收到消息","data":{"timeStamp":"1703128368100","fromType":1,"msgT两次ype":1,"msgSource":0,"fromWxid":"wxid_ytpc72mdoskt22","finalFromWxid":"","atWxidList":[],"silence":0,"membercount":0,"signature":"v1_vXrWK/iB","msg":"嗨鲁个迷紫123","msgBase64":"5Zeo6bKB5Liq6L+357SrMTIz"},"timestamp":"1703128368112","wxid":"wxid_kr145nk7l0an31","port":16888,"pid":10468,"flag":"7777"}) +// * 需要get 两次 data 字段*/ +// JSONObject data = wxMessage.getData().getJSONObject("data"); +// if (data == null) { +// return; +// } +// +// +// /**{"type":"D0003","des":"收到消息","data":{"timeStamp":"1702957325031","fromType":1,"msgType":1,"msgSource":0,"fromWxid":"wxid_ytpc72mdoskt22","finalFromWxid":"","atWxidList":[],"silence":0,"membercount":0,"signature":"v1_OJXJYpvM","msg":"在不","msgBase64":"5Zyo5LiN"},"timestamp":"1702957325041","wxid":"wxid_kr145nk7l0an31","port":16888,"pid":10468,"flag":"7777"} +// * */ +// WxMessageDataForChat wxMessageDataForChat = data.to(WxMessageDataForChat.class); +// +// // 做业务处理 +// logger.info("处理消息: {}", wxMessageDataForChat.toString()); +// +// /** +// * timeStamp 收到这条消息的13位现行时间戳 +// * fromType 来源类型:1|私聊 2|群聊 3|公众号 +// * msgType 消息类型:1|文本 3|图片 34|语音 42|名片 43|视频 47|动态表情 48|地理位置 49|分享链接或附件 2001|红包 2002|小程序 2003|群邀请 10000|系统消息 +// * msgSource 消息来源:0|别人发送 1|自己手机发送 +// * fromWxid fromType=1时为好友wxid,fromType=2时为群wxid,fromType=3时公众号wxid +// * finalFromWxid 仅fromType=2时有效,为群内发言人wxid +// * atWxidList 仅fromType=2,且msgSource=0时有效,为消息中艾特人wxid列表 +// * silence 仅fromType=2时有效,0 +// * membercount 仅fromType=2时有效,群成员数量 +// * signature 消息签名 +// * msg 消息内容 +// * msgBase64 消息内容的Base64 +// * */ +// if (Util.isAnyEmpty(wxMessageDataForChat.getMsg(), wxMessageDataForChat.getFromwxid(), wxMessageDataForChat.getFromtype())) { +// logger.info("消息内容为空,不处理"); +// return; +// } +// String atwxidlist = wxMessageDataForChat.getAtwxidlist(); +// if (Util.isNotEmpty((atwxidlist))) { +// JSONObject wxList = wxUtil.getWxList(); +// JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0); +// String botWxid = wxBotInfo.getString("wxid"); +// +// if (atwxidlist.contains(botWxid)) { +// String[] split = wxMessageDataForChat.getMsg().split(" "); +// String msg; +// if (split.length == 2) { +// msg = split[1]; +// } else { +// String[] newArray = new String[split.length - 1]; +// System.arraycopy(split, 1, newArray, 0, newArray.length); +// StringBuilder stringBuilder = new StringBuilder(); +// Iterator iterator = Arrays.stream(newArray).iterator(); +// while (iterator.hasNext()) { +// String s = iterator.next(); +// stringBuilder.append(s).append(" "); +// } +// msg = stringBuilder.toString(); +// } +// +////美团 20-7 + https://i.meituan.com/mttouch/page/account?userId=3822095266&token=AgHdIkm2tAGHc9SQSiG7M8xCx1LbTue9D2HPOAun2eYl3ou7BeEw1uGrGZH-DxmEiUgsbA1v9SM4DQAAAAC6HAAAz0rTXmkB_CIHin08hCu68mFv5k6nUc2q6_CfZqEdBcngRK_xD8Sx5fE4rfdq-yAJ, msgbase64=576O5ZuiIDIwLTcgKyBodHRwczovL2kubWVpdHVhbi5jb20vbXR0b3VjaC9wYWdlL2FjY291bnQ/dXNlcklkPTM4MjIwOTUyNjYmdG9rZW49QWdIZElrbTJ0QUdIYzlTUVNpRzdNOHhDeDFMYlR1ZTlEMkhQT0F1bjJlWWwzb3U3QmVFdzF1R3JHWkgtRHhtRWlVZ3NiQTF2OVNNNERRQUFBQUM2SEFBQXowclRYbWtCX0NJSGluMDhoQ3U2OG1GdjVrNm5VYzJxNl9DZlpxRWRCY25nUktfeEQ4U3g1ZkU0cmZkcS15QUo= +// if (msg.startsWith("美团 20-7 ")) { +// logger.info("处理美团的消息"); +// msg = msg.substring(msg.indexOf("https://i.meituan.com/mttouch/page/account")); +// String[] all = msg.split("\\?"); +// +// if (all.length == 2) { +// String wxid = null; +// if (wxMessageDataForChat.getFromtype() == 1) { +// wxid = wxMessageDataForChat.getFromwxid(); +// } else if (wxMessageDataForChat.getFromtype() == 2) { +// wxid = wxMessageDataForChat.getFinalfromwxid(); +// } +// String httpData = all[1]; +// String[] httpDataArr = httpData.split("&"); +// if (httpDataArr.length == 2) { +// String result = mt20(wxMessageDataForChat.getFinalfromwxid(), httpDataArr[0].split("=")[1], httpDataArr[1].split("=")[1]); +// +// wxUtil.sendTextMessage(wxMessageDataForChat.getFinalfromwxid(), result, msgType, wxMessageDataForChat.getFromwxid()); +// } else { +// +// wxUtil.sendTextMessage(wxMessageDataForChat.getFinalfromwxid(), "请检查提交的数据格式是否正确。", msgType, wxMessageDataForChat.getFromwxid()); +// } +// +// } +// } else if ("[转账待你接收,可在手机上查看]".equals(msg)) { +// +// wxUtil.sendTextMessage(wxMessageDataForChat.getFinalfromwxid(), "暂不支持群内转账功能,请私聊进行转账充值。", msgType, wxMessageDataForChat.getFromwxid()); +// } else if ("余额".equals(msg)) { +// String wxid = null; +// if (wxMessageDataForChat.getFromtype() == 1) { +// wxid = wxMessageDataForChat.getFromwxid(); +// } else if (wxMessageDataForChat.getFromtype() == 2) { +// wxid = wxMessageDataForChat.getFinalfromwxid(); +// } +// WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); +// String result = ""; +// if (Util.isNotEmpty(wxUser)) { +// result = "您的余额为:" + wxUser.getMoneyLeiji() + "元\r"; +// result = result + " 您的消费次数为:" + wxUser.getCountXiaofei() + "次\r"; +// result = result + " 您的充值次数为:" + wxUser.getCountChongzhi() + "次\r"; +// result = result + " 您的累计充值为:" + wxUser.getMoneyLeiji() + "元"; +// } else { +// result = "暂未查询到充值记录。\r"; +// } +// +// +// wxUtil.sendTextMessage(wxid, result, msgType, wxMessageDataForChat.getFromwxid()); +// } else if ("体验".equals(msg)) { +// String wxid = null; +// if (wxMessageDataForChat.getFromtype() == 1) { +// wxid = wxMessageDataForChat.getFromwxid(); +// } else if (wxMessageDataForChat.getFromtype() == 2) { +// wxid = wxMessageDataForChat.getFinalfromwxid(); +// } +// String result = ""; +// if (heiMingDan(wxid)) { +// result = "黑名单!"; +// } else { +// WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); +// if (isNew(wxUser.getIsnew())) { +// wxUser.setMoneyLeiji(wxUser.getMoneyLeiji().add(new BigDecimal(1))); +// wxUser.setMoneyShengyu(wxUser.getMoneyShengyu().add(new BigDecimal(1))); +// wxUser.setCountChongzhi(wxUser.getCountChongzhi().add(BigDecimal.ONE)); +// wxUser.setIsnew(1); +// wxUserService.updateById(wxUser); +// result = "体验成功,您已成功充值" + 1.00 + "元,已成功存入账户。感谢您的使用。"; +// } else { +// result = "您已体验过,请勿重复体验。"; +// } +// +// } +// +// wxUtil.sendTextMessage(wxid, result, msgType, wxMessageDataForChat.getFromwxid()); +// +// } else if (msg.startsWith("S")) { +// logger.info("处理超级管理员的消息"); +// String wxid = null; +// if (wxMessageDataForChat.getFromtype() == 1) { +// wxid = wxMessageDataForChat.getFromwxid(); +// } else if (wxMessageDataForChat.getFromtype() == 2) { +// wxid = wxMessageDataForChat.getFinalfromwxid(); +// } +// if (!isSuperAdminUser(wxid)) { +// return; +// } +// +// String result = ""; +// if (heiMingDan(wxid)) { +// result = "黑名单!"; +// } else { +// String[] split1 = msg.split("\\+"); +// String superAdminOrder = split1[1]; +// if ("设置普通菜单".equals(superAdminOrder)) { +// if (split1.length == 3) { +// String value = split1[2]; +// Setting setting = settingService.getOne(new QueryWrapper().eq("setting_key", key_caiDan_admin)); +// setting.setSettingValue(value); +// settingService.saveOrUpdate(setting); +// result = "设置成功!"; +// } else { +// result = "设置失败!"; +// } +// } else if ("设置超级菜单".equals(superAdminOrder)) { +// if (split1.length == 3) { +// String value = split1[2]; +// Setting setting = settingService.getOne(new QueryWrapper().eq("setting_key", key_caiDan_admin)); +// setting.setSettingValue(value); +// settingService.saveOrUpdate(setting); +// result = "设置成功!"; +// } else { +// result = "设置失败!"; +// } +// } else if ("查询管理员".equals(superAdminOrder)) { +// result = getSetting(order_admin); +// } else if ("添加管理员".equals(superAdminOrder)) { +// if (split1.length == 3) { +// String value = split1[2]; +// Setting setting = settingService.getOne(new QueryWrapper().eq("setting_key", order_admin)); +// setting.setSettingValue(value.concat(",").concat(setting.getSettingValue())); +// settingService.saveOrUpdate(setting); +// result = "设置成功!"; +// } else { +// result = "设置失败!"; +// } +// } else if ("删除管理员".equals(superAdminOrder)) { +// if (split1.length == 3) { +// String value = split1[2]; +// Setting setting = settingService.getOne(new QueryWrapper().eq("setting_key", order_admin)); +// setting.setSettingValue(setting.getSettingValue().replace(value, "")); +// settingService.saveOrUpdate(setting); +// result = "设置成功!"; +// } else { +// result = "设置失败!"; +// } +// } +// // +// //if () +// +// wxUtil.sendTextMessage(wxid, result, msgType, wxMessageDataForChat.getFromwxid()); +// } +// } +// // 管理员返回两种菜单 +// else if (order_caiDan.equals(msg)) { +// String wxid = null; +// if (wxMessageDataForChat.getFromtype() == 1) { +// wxid = wxMessageDataForChat.getFromwxid(); +// } else if (wxMessageDataForChat.getFromtype() == 2) { +// wxid = wxMessageDataForChat.getFinalfromwxid(); +// } +// String result = ""; +// String puTong = getSetting(key_caiDan_user); +// String chaoJi = getSetting(key_caiDan_admin); +// if (isSuperAdminUser(wxid)) { +// result = "用户菜单:" + puTong + " 管理员菜单:" + chaoJi; +// } else { +// result = "用户菜单:" + puTong; +// } +// +// wxUtil.sendTextMessage(wxid, result, msgType, wxMessageDataForChat.getFromwxid()); +// } +// } +// wxMessageDataForChatService.save(wxMessageDataForChat); +// +// } +// +// } + private String getSetting(String key) { + if (Util.isNotEmpty(key)) { + Setting value = settingService.getOne(new QueryWrapper().eq("setting_key", key)); + return value.getSettingValue(); + } else { + return null; } + } - - /**{"type":"D0003","des":"收到消息","data":{"timeStamp":"1702957325031","fromType":1,"msgType":1,"msgSource":0,"fromWxid":"wxid_ytpc72mdoskt22","finalFromWxid":"","atWxidList":[],"silence":0,"membercount":0,"signature":"v1_OJXJYpvM","msg":"在不","msgBase64":"5Zyo5LiN"},"timestamp":"1702957325041","wxid":"wxid_kr145nk7l0an31","port":16888,"pid":10468,"flag":"7777"} - * */ - WxMessageDataForChat wxMessageDataForChat = data.to(WxMessageDataForChat.class); - - // 做业务处理 - logger.info("处理消息: {}", wxMessageDataForChat.toString()); - - /** - * timeStamp 收到这条消息的13位现行时间戳 - * fromType 来源类型:1|私聊 2|群聊 3|公众号 - * msgType 消息类型:1|文本 3|图片 34|语音 42|名片 43|视频 47|动态表情 48|地理位置 49|分享链接或附件 2001|红包 2002|小程序 2003|群邀请 10000|系统消息 - * msgSource 消息来源:0|别人发送 1|自己手机发送 - * fromWxid fromType=1时为好友wxid,fromType=2时为群wxid,fromType=3时公众号wxid - * finalFromWxid 仅fromType=2时有效,为群内发言人wxid - * atWxidList 仅fromType=2,且msgSource=0时有效,为消息中艾特人wxid列表 - * silence 仅fromType=2时有效,0 - * membercount 仅fromType=2时有效,群成员数量 - * signature 消息签名 - * msg 消息内容 - * msgBase64 消息内容的Base64 - * */ - if (Util.isAnyEmpty(wxMessageDataForChat.getMsg(), wxMessageDataForChat.getFromwxid(), wxMessageDataForChat.getFromtype())) { - logger.info("消息内容为空,不处理"); - return; - } - String atwxidlist = wxMessageDataForChat.getAtwxidlist(); - if (Util.isNotEmpty((atwxidlist))) { - JSONObject wxList = new WXUtil().getWxList(); - JSONObject wxBotInfo = (JSONObject) wxList.getJSONArray("result").get(0); - String botWxid = wxBotInfo.getString("wxid"); - - if (atwxidlist.contains(botWxid)) { - String[] split = wxMessageDataForChat.getMsg().split(" "); - String msg; - if (split.length == 2){ - msg = split[1]; - }else { - String[] newArray = new String[split.length - 1]; - System.arraycopy(split, 1, newArray, 0, newArray.length); - StringBuilder stringBuilder = new StringBuilder(); - Iterator iterator = Arrays.stream(newArray).iterator(); - while (iterator.hasNext()) { - String s = iterator.next(); - stringBuilder.append(s).append(" "); - } - msg = stringBuilder.toString(); - } - -//美团 20-7 + https://i.meituan.com/mttouch/page/account?userId=3822095266&token=AgHdIkm2tAGHc9SQSiG7M8xCx1LbTue9D2HPOAun2eYl3ou7BeEw1uGrGZH-DxmEiUgsbA1v9SM4DQAAAAC6HAAAz0rTXmkB_CIHin08hCu68mFv5k6nUc2q6_CfZqEdBcngRK_xD8Sx5fE4rfdq-yAJ, msgbase64=576O5ZuiIDIwLTcgKyBodHRwczovL2kubWVpdHVhbi5jb20vbXR0b3VjaC9wYWdlL2FjY291bnQ/dXNlcklkPTM4MjIwOTUyNjYmdG9rZW49QWdIZElrbTJ0QUdIYzlTUVNpRzdNOHhDeDFMYlR1ZTlEMkhQT0F1bjJlWWwzb3U3QmVFdzF1R3JHWkgtRHhtRWlVZ3NiQTF2OVNNNERRQUFBQUM2SEFBQXowclRYbWtCX0NJSGluMDhoQ3U2OG1GdjVrNm5VYzJxNl9DZlpxRWRCY25nUktfeEQ4U3g1ZkU0cmZkcS15QUo= - if (msg.startsWith("美团 20-7 ")) { - logger.info("处理美团的消息"); - msg = msg.substring(msg.indexOf("https://i.meituan.com/mttouch/page/account")); - String[] all = msg.split("\\?"); - - if (all.length == 2) { - String wxid = null; - if (wxMessageDataForChat.getFromtype() == 1) { - wxid = wxMessageDataForChat.getFromwxid(); - } else if (wxMessageDataForChat.getFromtype() == 2) { - wxid = wxMessageDataForChat.getFinalfromwxid(); - } - String httpData = all[1]; - String[] httpDataArr = httpData.split("&"); - if (httpDataArr.length == 2) { - String result = mt20(wxMessageDataForChat.getFinalfromwxid(), httpDataArr[0].split("=")[1], httpDataArr[1].split("=")[1]); - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxMessageDataForChat.getFinalfromwxid(), result, msgType, wxMessageDataForChat.getFromwxid()); - } else { - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxMessageDataForChat.getFinalfromwxid(), "请检查提交的数据格式是否正确。", msgType, wxMessageDataForChat.getFromwxid()); - } - - } - } else if ("[转账待你接收,可在手机上查看]".equals(msg)) { - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxMessageDataForChat.getFinalfromwxid(), "暂不支持群内转账功能,请私聊进行转账充值。", msgType, wxMessageDataForChat.getFromwxid()); - } else if ("余额".equals(msg)) { - String wxid = null; - if (wxMessageDataForChat.getFromtype() == 1) { - wxid = wxMessageDataForChat.getFromwxid(); - } else if (wxMessageDataForChat.getFromtype() == 2) { - wxid = wxMessageDataForChat.getFinalfromwxid(); - } - WxUser wxUser = wxUserService.getOne(Wrappers.query(new WxUser()).eq("wxid", wxid)); - String result = ""; - if (Util.isNotEmpty(wxUser)) { - result = "您的余额为:" + wxUser.getMoneyLeiji() + "元\r"; - result = result + " 您的消费次数为:" + wxUser.getCountXiaofei() + "次\r"; - result = result + " 您的充值次数为:" + wxUser.getCountChongzhi() + "次\r"; - result = result + " 您的累计充值为:" + wxUser.getMoneyLeiji() + "元"; - } else { - result = "暂未查询到充值记录。\r"; - } - - WXUtil wxUtil = new WXUtil(); - wxUtil.sendTextMessage(wxid, result, msgType, wxMessageDataForChat.getFromwxid()); - } - wxMessageDataForChatService.save(wxMessageDataForChat); - + private boolean isSuperAdminUser(String wxid) { + boolean flag = false; + Setting setting = settingService.getOne(new QueryWrapper().eq("setting_key", "管理员")); + if (Util.isNotEmpty(setting)) { + if (setting.getSettingValue().contains(wxid)) { + flag = true; } } - + return flag; } /** @@ -429,8 +711,8 @@ public class WxMessageConsumer { } /** - * @param remark - * @param time 调用次数,后期可以改成包月还是一次 ,目前都是 1 + * @param wxid + * @param time 调用次数,后期可以改成包月还是一次 ,目前都是 1 * @param token * @return * @throws @@ -459,17 +741,33 @@ public class WxMessageConsumer { * 6.拿到青龙的结果 * */ //new QLUtil().getEnv(remark) - QLUtil qlUtil = new QLUtil(); - WXUtil wxUtil = new WXUtil(); HashMap loginedUserInfo = qlUtil.getLoginedUserInfo(token); if (Util.isNotEmpty(loginedUserInfo)) { String mobile = loginedUserInfo.get("mobile"); String nickName = loginedUserInfo.get("nickName"); - String remark = nickName + "+" + mobile; - return remark; - //qlUtil.addEnv(token, meituanCookie, remark); + String remark = wxid + "+" + mobile + "+" + nickName; + JSONArray env = qlUtil.getEnv(token); + logger.info("1 查询环境变量 env = " + env); + // 第一次用 token 查询 + if (env.size() == 0) { + env = qlUtil.getEnv(wxid + "+" + mobile); + } + // 第二次用 wxid + mobile 查询,如果不存在就直接创建 + if (env.size() == 0) { + Boolean addEnv = qlUtil.addEnv(token, meituanCookie, remark); + logger.info("2 使用token查询不存在环境变量,向青龙添加变量 addEnv = " + addEnv); + } else { + // 如果存在则说明 需要更新token + logger.info("3 环境变量已存在{}", env); + } + // 这时候已经有了环境变量,可以执行crons + qlUtil.getCron("美团"); + //logger.info("查询crons cron = " + cron); + + + return "runQL 调用成功"; } else { diff --git a/src/main/resources/application-dev.yaml b/src/main/resources/application-dev.yaml index 7c0f88a..3033d31 100644 --- a/src/main/resources/application-dev.yaml +++ b/src/main/resources/application-dev.yaml @@ -1,5 +1,5 @@ server: - port: 5700 + port: 6666 spring: application: name: MT2QL @@ -23,3 +23,6 @@ spring: max-idle: 5 min-idle: 0 password: jhkdjhkjdhsIUTYURTU_HQw7tC # 文件上传 +config: + WX_BASE_URL: http://134.175.126.60:30001 + QL_BASE_URL: http://134.175.126.60:35700 diff --git a/src/main/resources/application-prod.yaml b/src/main/resources/application-prod.yaml index 3b5f901..943b4a2 100644 --- a/src/main/resources/application-prod.yaml +++ b/src/main/resources/application-prod.yaml @@ -1,5 +1,5 @@ server: - port: 18080 + port: 6666 spring: application: name: MT2QL @@ -20,3 +20,6 @@ spring: max-idle: 5 min-idle: 0 password: jhkdjhkjdhsIUTYURTU_HQw7tC +config: + WX_BASE_URL: http://127.0.0.1:30001/DaenWxHook/httpapi/ + QL_BASE_URL: http://127.0.0.1:5700 diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index de01aca..10fd76b 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -3,3 +3,5 @@ spring: name: MT2QL profiles: active: dev + main: + allow-circular-references=true: