diff --git a/clients/java/wcferry-mvn/pom.xml b/clients/java/wcferry-mvn/pom.xml index e4d8458..c1d3ab0 100644 --- a/clients/java/wcferry-mvn/pom.xml +++ b/clients/java/wcferry-mvn/pom.xml @@ -48,6 +48,17 @@ springfox-boot-starter 3.0.0 + + + com.alibaba.fastjson2 + fastjson2 + 2.0.52 + + + org.dom4j + dom4j + 2.1.3 + com.google.protobuf diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/Client.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/Client.java index e228b00..039aaf0 100644 --- a/clients/java/wcferry-mvn/src/main/java/com/iamteer/Client.java +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/Client.java @@ -8,10 +8,10 @@ import java.util.Map; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; -import com.iamteer.service.SDK; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.alibaba.fastjson2.JSONObject; import com.iamteer.entity.Wcf; import com.iamteer.entity.Wcf.DbQuery; import com.iamteer.entity.Wcf.DbRow; @@ -25,11 +25,15 @@ import com.iamteer.entity.Wcf.RpcContact; import com.iamteer.entity.Wcf.UserInfo; import com.iamteer.entity.Wcf.Verification; import com.iamteer.entity.Wcf.WxMsg; +import com.iamteer.entity.vo.response.WxMsgResp; +import com.iamteer.service.SDK; import com.sun.jna.Native; import io.sisu.nng.Socket; import io.sisu.nng.pair.Pair1Socket; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class Client { private static final Logger logger = LoggerFactory.getLogger(Client.class); @@ -78,7 +82,8 @@ public class Client { cmdSocket = new Pair1Socket(); cmdSocket.dial(url); // logger.info("请点击登录微信"); - while (!isLogin()) { // 直到登录成功 + while (!isLogin()) { + // 直到登录成功 waitMs(1000); } } catch (Exception e) { @@ -514,8 +519,22 @@ public class Client { } public void printWxMsg(WxMsg msg) { - logger.info("{}[{}]:{}:{}:{}\n{}", msg.getSender(), msg.getRoomid(), msg.getId(), msg.getType(), - msg.getXml().replace("\n", "").replace("\t", ""), msg.getContent()); + WxMsgResp wxMsgResp = new WxMsgResp(); + wxMsgResp.setIsSelf(msg.getIsSelf()); + wxMsgResp.setIsGroup(msg.getIsGroup()); + wxMsgResp.setId(msg.getId()); + wxMsgResp.setType(msg.getType()); + wxMsgResp.setTs(msg.getTs()); + wxMsgResp.setRoomId(msg.getRoomid()); + wxMsgResp.setContent(msg.getContent()); + wxMsgResp.setSender(msg.getSender()); + wxMsgResp.setSign(msg.getSign()); + wxMsgResp.setThumb(msg.getThumb()); + wxMsgResp.setExtra(msg.getExtra()); + wxMsgResp.setXml(msg.getXml().replace("\n", "").replace("\t", "")); + + String jsonString = JSONObject.toJSONString(wxMsgResp); + log.info("收到消息: {}", jsonString); } private String bytesToHex(byte[] bytes) { diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/entity/dto/.gitkeep b/clients/java/wcferry-mvn/src/main/java/com/iamteer/entity/dto/.gitkeep new file mode 100644 index 0000000..a10d4fe --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/entity/dto/.gitkeep @@ -0,0 +1,3 @@ +# Ignore everything in this directory +* +# Except this file !.gitkeep \ No newline at end of file diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/entity/vo/response/WxMsgResp.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/entity/vo/response/WxMsgResp.java new file mode 100644 index 0000000..9c536df --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/entity/vo/response/WxMsgResp.java @@ -0,0 +1,87 @@ +package com.iamteer.entity.vo.response; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * DTO-微信消息 + * + * @author chandler + * @date 2024-09-26 19:56 + */ +@Data +public class WxMsgResp { + + /** + * 是否自己发送的 + */ + @ApiModelProperty(value = "是否自己发送的") + private Boolean isSelf; + + /** + * 是否群消息 + */ + @ApiModelProperty(value = "是否群消息") + private Boolean isGroup; + + /** + * 消息id + */ + @ApiModelProperty(value = "消息id") + private Long id; + + /** + * 消息类型 + */ + @ApiModelProperty(value = "消息类型") + private Integer type; + + /** + * 消息类型 + */ + @ApiModelProperty(value = "消息类型") + private Integer ts; + + /** + * 群id(如果是群消息的话) + */ + @ApiModelProperty(value = "群id(如果是群消息的话)") + private String roomId; + + /** + * 消息内容 + */ + @ApiModelProperty(value = "消息内容") + private String content; + + /** + * 消息发送者 + */ + @ApiModelProperty(value = "消息发送者") + private String sender; + + /** + * 签名 + */ + @ApiModelProperty(value = "签名") + private String sign; + + /** + * 缩略图 + */ + @ApiModelProperty(value = "缩略图") + private String thumb; + + /** + * 附加内容 + */ + @ApiModelProperty(value = "附加内容") + private String extra; + + /** + * 消息xml + */ + @ApiModelProperty(value = "消息xml") + private String xml; + +} diff --git a/clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/XmlJsonConvertUtil.java b/clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/XmlJsonConvertUtil.java new file mode 100644 index 0000000..6e19c37 --- /dev/null +++ b/clients/java/wcferry-mvn/src/main/java/com/iamteer/utils/XmlJsonConvertUtil.java @@ -0,0 +1,130 @@ +package com.iamteer.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; +import java.util.List; + +import org.dom4j.Attribute; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import com.alibaba.fastjson2.JSONArray; +import com.alibaba.fastjson2.JSONObject; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class XmlJsonConvertUtil { + + public static String readFile(String path) { + String str = ""; + try { + File file = new File(path); + FileInputStream fis = new FileInputStream(file); + FileChannel fc = fis.getChannel(); + ByteBuffer bb = ByteBuffer.allocate(new Long(file.length()).intValue()); + // fc向buffer中读入数据 + fc.read(bb); + bb.flip(); + str = new String(bb.array(), "UTF8"); + fc.close(); + fis.close(); + } catch (Exception e) { + log.error("异常:{} ", e.getMessage()); + } + return str; + } + + /** + * xml转json + * + * @param xmlStr + * @return + */ + public static JSONObject xml2Json(String xmlStr) { + JSONObject json = new JSONObject(); + try { + xmlStr = xmlStr.replace("\\n", ""); + Document doc = DocumentHelper.parseText(xmlStr); + dom4j2Json(doc.getRootElement(), json); + } catch (DocumentException e) { + log.error("异常:{} ", e.getMessage()); + } + return json; + } + + /** + * xml转json + * + * @param element + * @param json + */ + public static void dom4j2Json(Element element, JSONObject json) { + // 如果是属性 + for (Object o : element.attributes()) { + Attribute attr = (Attribute)o; + if (!isEmpty(attr.getValue())) { + json.put("@" + attr.getName(), attr.getValue()); + } + } + List chdEl = element.elements(); + if (chdEl.isEmpty() && !isEmpty(element.getText())) { + // 如果没有子元素,只有一个值 + json.put(element.getName(), element.getText()); + } + + for (Element e : chdEl) { + // 有子元素 + if (!e.elements().isEmpty()) { + // 子元素也有子元素 + JSONObject chdjson = new JSONObject(); + dom4j2Json(e, chdjson); + Object o = json.get(e.getName()); + if (o != null) { + JSONArray jsona = null; + if (o instanceof JSONObject) { + // 如果此元素已存在,则转为jsonArray + JSONObject jsono = (JSONObject)o; + json.remove(e.getName()); + jsona = new JSONArray(); + jsona.add(jsono); + jsona.add(chdjson); + } + if (o instanceof JSONArray) { + jsona = (JSONArray)o; + jsona.add(chdjson); + } + json.put(e.getName(), jsona); + } else { + if (!chdjson.isEmpty()) { + json.put(e.getName(), chdjson); + } + } + + } else { + // 子元素没有子元素 + for (Object o : element.attributes()) { + Attribute attr = (Attribute)o; + if (!isEmpty(attr.getValue())) { + json.put("@" + attr.getName(), attr.getValue()); + } + } + if (!e.getText().isEmpty()) { + json.put(e.getName(), e.getText()); + } + } + } + } + + public static boolean isEmpty(String str) { + if (str == null || str.trim().isEmpty() || "null".equals(str)) { + return true; + } + return false; + } + +}