From 111e70b42f9268fd5e697667876e250e030acd32 Mon Sep 17 00:00:00 2001 From: shanhaizhang Date: Sat, 29 Jul 2017 01:41:42 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E4=BA=8C=E7=BB=B4=E7=A0=81=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?idea=EF=BC=8Cubuntu,=20mac=20=EF=BC=8Ccentos=20=EF=BC=9B?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81win=20=E5=92=8C=20eclipse=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 接收公众号消息。 --- pom.xml | 43 +++++++++++++++ .../zhouyafeng/itchat4j/core/MsgCenter.java | 13 ++--- .../service/impl/LoginServiceImpl.java | 52 +++++++++++------- .../zhouyafeng/itchat4j/utils/QRterminal.java | 55 +++++++++++++++++++ .../itchat4j/utils/enums/URLEnum.java | 1 + .../itchat4j/utils/tools/CommonTools.java | 6 +- 6 files changed, 140 insertions(+), 30 deletions(-) create mode 100644 src/main/java/cn/zhouyafeng/itchat4j/utils/QRterminal.java diff --git a/pom.xml b/pom.xml index 6f90c99..0d9b79f 100644 --- a/pom.xml +++ b/pom.xml @@ -18,6 +18,49 @@ + + + jaxen + jaxen + 1.1.6 + + + + javax.websocket + javax.websocket-api + 1.1 + + + org.glassfish.tyrus.bundles + tyrus-standalone-client + 1.13 + + + com.github.seratch + jslack + 1.0.11 + + + + net.dongliu + requests + 4.9.1 + + + dom4j + dom4j + 1.6.1 + + + com.google.code.gson + gson + 2.8.0 + + + com.google.zxing + core + 3.3.0 + org.apache.httpcomponents httpclient diff --git a/src/main/java/cn/zhouyafeng/itchat4j/core/MsgCenter.java b/src/main/java/cn/zhouyafeng/itchat4j/core/MsgCenter.java index 6482406..db94fcf 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/core/MsgCenter.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/core/MsgCenter.java @@ -51,15 +51,12 @@ public static JSONArray produceMsg(JSONArray msgList) { && !core.getGroupIdList().contains(m.getString("ToUserName"))) { core.getGroupIdList().add((m.getString("ToUserName"))); } - // 群消息与普通消息不同的是在其消息体(Content)中会包含发送者id及":
"消息,这里需要处理一下,去掉多余信息,只保留消息内容 - if (m.getString("Content").contains("
")) { - String content = m.getString("Content").substring(m.getString("Content").indexOf("
") + 5); - m.put("Content", content); - m.put("groupMsg", true); - } - } else { - CommonTools.msgFormatter(m, "Content"); + + m.put("groupMsg", true); } + CommonTools.msgFormatter(m, "Content"); + + if (m.getInteger("MsgType").equals(MsgCodeEnum.MSGTYPE_TEXT.getCode())) { // words // 文本消息 if (m.getString("Url").length() != 0) { diff --git a/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java b/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java index fdc3a86..2023779 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java @@ -21,16 +21,13 @@ import org.slf4j.LoggerFactory; import org.w3c.dom.Document; -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - import cn.zhouyafeng.itchat4j.beans.BaseMsg; import cn.zhouyafeng.itchat4j.core.Core; import cn.zhouyafeng.itchat4j.core.MsgCenter; import cn.zhouyafeng.itchat4j.service.ILoginService; import cn.zhouyafeng.itchat4j.utils.Config; import cn.zhouyafeng.itchat4j.utils.MyHttpClient; +import cn.zhouyafeng.itchat4j.utils.QRterminal; import cn.zhouyafeng.itchat4j.utils.SleepUtils; import cn.zhouyafeng.itchat4j.utils.enums.ResultEnum; import cn.zhouyafeng.itchat4j.utils.enums.RetCodeEnum; @@ -42,6 +39,10 @@ import cn.zhouyafeng.itchat4j.utils.enums.parameters.UUIDParaEnum; import cn.zhouyafeng.itchat4j.utils.tools.CommonTools; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; + /** * 登陆服务实现类 * @@ -130,26 +131,28 @@ public String getUuid() { @Override public boolean getQR(String qrPath) { - qrPath = qrPath + File.separator + "QR.jpg"; - String qrUrl = URLEnum.QRCODE_URL.getUrl() + core.getUuid(); - HttpEntity entity = myHttpClient.doGet(qrUrl, null, true, null); + + // qrPath = qrPath + File.separator + "QR.jpg"; + // String qrUrl = URLEnum.QRCODE_URL.getUrl() + core.getUuid(); + // HttpEntity entity = myHttpClient.doGet(qrUrl, null, true, null); try { - OutputStream out = new FileOutputStream(qrPath); - byte[] bytes = EntityUtils.toByteArray(entity); - out.write(bytes); - out.flush(); - out.close(); - try { - CommonTools.printQr(qrPath); // 打开登陆二维码图片 - } catch (Exception e) { - LOG.info(e.getMessage()); - } - +// OutputStream out = new FileOutputStream(qrPath); +// byte[] bytes = EntityUtils.toByteArray(entity); +// out.write(bytes); +// out.flush(); +// out.close(); +// try { +// CommonTools.printQr(qrPath); // 打开登陆二维码图片 +// } catch (Exception e) { +// LOG.info(e.getMessage()); +// } + String qrUrl2 = URLEnum.cAPI_qrcode.getUrl() + core.getUuid(); + String qrString=QRterminal.getQr(qrUrl2); + LOG.error(qrString); } catch (Exception e) { LOG.info(e.getMessage()); return false; } - return true; } @@ -251,7 +254,7 @@ public void run() { while (core.isAlive()) { try { Map resultMap = syncCheck(); - LOG.info(JSONObject.toJSONString(resultMap)); + LOG.info("startReceiving()--->" +JSONObject.toJSONString(resultMap)); String retcode = resultMap.get("retcode"); String selector = resultMap.get("selector"); if (retcode.equals(RetCodeEnum.UNKOWN.getCode())) { @@ -282,6 +285,7 @@ public void run() { } } catch (Exception e) { LOG.info(e.getMessage()); + e.printStackTrace(); } } } else if (selector.equals("7")) { @@ -304,6 +308,7 @@ public void run() { } } catch (Exception e) { LOG.info(e.getMessage()); + e.printStackTrace(); } } @@ -312,6 +317,7 @@ public void run() { JSONObject obj = webWxSync(); } } catch (Exception e) { + e.printStackTrace(); LOG.info(e.getMessage()); retryCount += 1; if (core.getReceivingRetryCount() < retryCount) { @@ -321,6 +327,7 @@ public void run() { Thread.sleep(1000); } catch (InterruptedException e1) { LOG.info(e.getMessage()); + e.printStackTrace(); } } } @@ -393,6 +400,7 @@ public void webWxGetContact() { } return; } catch (Exception e) { + e.printStackTrace(); LOG.error(e.getMessage(), e); } return; @@ -427,6 +435,7 @@ public void WebWxBatchGetContact() { } } } catch (Exception e) { + e.printStackTrace(); LOG.info(e.getMessage()); } } @@ -451,7 +460,6 @@ public String checklogin(String result) { * * @author https://github.com/yaphone * @date 2017年4月9日 下午12:16:26 - * @param result */ private void processLoginInfo(String loginContent) { String regEx = "window.redirect_uri=\"(\\S+)\";"; @@ -611,8 +619,10 @@ private JSONObject webWxSync() { core.getLoginInfo().put(StorageLoginInfoEnum.synckey.getKey(), synckey.substring(0, synckey.length() - 1));// 1_656161336|2_656161626|3_656161313|11_656159955|13_656120033|201_1492273724|1000_1492265953|1001_1492250432|1004_1491805192 } + LOG.info("webWxSync()-----》"+text); } catch (Exception e) { LOG.info(e.getMessage()); + e.printStackTrace(); } return result; diff --git a/src/main/java/cn/zhouyafeng/itchat4j/utils/QRterminal.java b/src/main/java/cn/zhouyafeng/itchat4j/utils/QRterminal.java new file mode 100644 index 0000000..277b50e --- /dev/null +++ b/src/main/java/cn/zhouyafeng/itchat4j/utils/QRterminal.java @@ -0,0 +1,55 @@ +package cn.zhouyafeng.itchat4j.utils; + +import java.util.Hashtable; + +import com.google.zxing.BarcodeFormat; +import com.google.zxing.EncodeHintType; +import com.google.zxing.MultiFormatWriter; +import com.google.zxing.WriterException; +import com.google.zxing.common.BitMatrix; +import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel; + +public class QRterminal { + + public static String getQr(String text) { + String s = "生成二维码失败"; + int width = 40; + int height = 40; + // 用于设置QR二维码参数 + Hashtable qrParam = new Hashtable(); + // 设置QR二维码的纠错级别——这里选择最高H级别 + qrParam.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M); + qrParam.put(EncodeHintType.CHARACTER_SET, "utf-8"); + try { + BitMatrix bitMatrix = new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, width, height, qrParam); + s = toAscii(bitMatrix); + } catch (WriterException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + return s; + } + + public static String toAscii(BitMatrix bitMatrix) { + StringBuilder sb = new StringBuilder(); + for (int rows = 0; rows < bitMatrix.getHeight(); rows++) { + for (int cols = 0; cols < bitMatrix.getWidth(); cols++) { + boolean x = bitMatrix.get(rows, cols); + if (!x) { + // white + sb.append("\033[47m \033[0m"); + } else { + sb.append("\033[40m \033[0m"); + } + } + sb.append("\n"); + } + return sb.toString(); + } + + public static void main(String[] args) throws Exception { + String text = "https://github.com/zhangshanhai/java-qrcode-terminal "; + + System.out.println(getQr(text)); + } +} diff --git a/src/main/java/cn/zhouyafeng/itchat4j/utils/enums/URLEnum.java b/src/main/java/cn/zhouyafeng/itchat4j/utils/enums/URLEnum.java index 93ab332..784f2ed 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/utils/enums/URLEnum.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/utils/enums/URLEnum.java @@ -9,6 +9,7 @@ public enum URLEnum { BASE_URL("https://login.weixin.qq.com","基本的URL"), + cAPI_qrcode("https://login.weixin.qq.com/l/", "API_qrcode"), UUID_URL(BASE_URL.url+"/jslogin","UUIDLURL"), QRCODE_URL(BASE_URL.url+"/qrcode/","初始化URL"), STATUS_NOTIFY_URL(BASE_URL.url+"/webwxstatusnotify?lang=zh_CN&pass_ticket=%s","微信状态通知"), diff --git a/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java b/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java index 8e2672f..0971b2e 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java @@ -233,7 +233,11 @@ public static void emojiFormatter(JSONObject d, String k) { * @param k */ public static void msgFormatter(JSONObject d, String k) { - d.put(k, d.getString(k).replace("
", "\n")); + String content =d.getString(k); + if(content.startsWith("@")){ + content=content.substring(66); + } + d.put(k, content.replace("
", "\n")); emojiFormatter(d, k); // TODO 与emoji表情有部分兼容问题,目前暂未处理解码处理 d.put(k, // StringEscapeUtils.unescapeHtml4(d.getString(k))); From 52b72b86b70807d6a360b8d5e6df71cba47e8982 Mon Sep 17 00:00:00 2001 From: shanhaizhang Date: Sat, 29 Jul 2017 01:54:00 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=8F=B0=E6=89=93?= =?UTF-8?q?=E5=8D=B0=E4=BA=8C=E7=BB=B4=E7=A0=81=EF=BC=8C=E6=94=AF=E6=8C=81?= =?UTF-8?q?idea=EF=BC=8Cubuntu,=20mac=20=EF=BC=8Ccentos=20=EF=BC=9B?= =?UTF-8?q?=E4=B8=8D=E6=94=AF=E6=8C=81win=20=E5=92=8C=20eclipse=E3=80=82?= =?UTF-8?q?=EF=BC=88=E5=8F=AF=E7=94=A8=EF=BC=89=20=E6=8E=A5=E6=94=B6?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E6=B6=88=E6=81=AF=E3=80=82=EF=BC=88?= =?UTF-8?q?=E6=9C=AA=E6=B5=8B=E8=AF=95=EF=BC=89=20=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E6=B2=A1=E7=94=A8=E7=9A=84=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 38 +------------------ .../service/impl/LoginServiceImpl.java | 1 - .../itchat4j/demo/demo1/MyTest.java | 2 +- 3 files changed, 2 insertions(+), 39 deletions(-) diff --git a/pom.xml b/pom.xml index 0d9b79f..0e44539 100644 --- a/pom.xml +++ b/pom.xml @@ -19,43 +19,7 @@ - - jaxen - jaxen - 1.1.6 - - - - javax.websocket - javax.websocket-api - 1.1 - - - org.glassfish.tyrus.bundles - tyrus-standalone-client - 1.13 - - - com.github.seratch - jslack - 1.0.11 - - - - net.dongliu - requests - 4.9.1 - - - dom4j - dom4j - 1.6.1 - - - com.google.code.gson - gson - 2.8.0 - + com.google.zxing core diff --git a/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java b/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java index 2023779..8bd1500 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java @@ -619,7 +619,6 @@ private JSONObject webWxSync() { core.getLoginInfo().put(StorageLoginInfoEnum.synckey.getKey(), synckey.substring(0, synckey.length() - 1));// 1_656161336|2_656161626|3_656161313|11_656159955|13_656120033|201_1492273724|1000_1492265953|1001_1492250432|1004_1491805192 } - LOG.info("webWxSync()-----》"+text); } catch (Exception e) { LOG.info(e.getMessage()); e.printStackTrace(); diff --git a/src/test/java/cn/zhouyafeng/itchat4j/demo/demo1/MyTest.java b/src/test/java/cn/zhouyafeng/itchat4j/demo/demo1/MyTest.java index d587969..70a4538 100644 --- a/src/test/java/cn/zhouyafeng/itchat4j/demo/demo1/MyTest.java +++ b/src/test/java/cn/zhouyafeng/itchat4j/demo/demo1/MyTest.java @@ -12,7 +12,7 @@ */ public class MyTest { public static void main(String[] args) { - String qrPath = "D://itchat4j//login"; // 保存登陆二维码图片的路径,这里需要在本地新建目录 + String qrPath = "./"; // 保存登陆二维码图片的路径,这里需要在本地新建目录 IMsgHandlerFace msgHandler = new SimpleDemo(); // 实现IMsgHandlerFace接口的类 Wechat wechat = new Wechat(msgHandler, qrPath); // 【注入】 wechat.start(); // 启动服务,会在qrPath下生成一张二维码图片,扫描即可登陆,注意,二维码图片如果超过一定时间未扫描会过期,过期时会自动更新,所以你可能需要重新打开图片 From 560bdfc26330593ba8f71934e6b0789e34a1624a Mon Sep 17 00:00:00 2001 From: shanhaizhang Date: Sat, 29 Jul 2017 01:57:43 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E5=8E=BB=E6=8E=89=20e.printStackTrace();?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java b/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java index 8bd1500..eda52e8 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/service/impl/LoginServiceImpl.java @@ -285,7 +285,6 @@ public void run() { } } catch (Exception e) { LOG.info(e.getMessage()); - e.printStackTrace(); } } } else if (selector.equals("7")) { @@ -308,7 +307,6 @@ public void run() { } } catch (Exception e) { LOG.info(e.getMessage()); - e.printStackTrace(); } } @@ -327,7 +325,6 @@ public void run() { Thread.sleep(1000); } catch (InterruptedException e1) { LOG.info(e.getMessage()); - e.printStackTrace(); } } } @@ -400,7 +397,6 @@ public void webWxGetContact() { } return; } catch (Exception e) { - e.printStackTrace(); LOG.error(e.getMessage(), e); } return; @@ -435,7 +431,6 @@ public void WebWxBatchGetContact() { } } } catch (Exception e) { - e.printStackTrace(); LOG.info(e.getMessage()); } } @@ -621,7 +616,6 @@ private JSONObject webWxSync() { } } catch (Exception e) { LOG.info(e.getMessage()); - e.printStackTrace(); } return result; From 38f5687b12d1ccce84e17e6fe51de1a5066ba68c Mon Sep 17 00:00:00 2001 From: shanhaizhang Date: Sat, 29 Jul 2017 02:24:53 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E7=BE=A4=E8=81=8A=20=E5=8F=9149=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java b/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java index 0971b2e..8a40d4a 100644 --- a/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java +++ b/src/main/java/cn/zhouyafeng/itchat4j/utils/tools/CommonTools.java @@ -233,9 +233,9 @@ public static void emojiFormatter(JSONObject d, String k) { * @param k */ public static void msgFormatter(JSONObject d, String k) { - String content =d.getString(k); + String content = d.getString(k); if(content.startsWith("@")){ - content=content.substring(66); + content=content.substring(content.indexOf(":")+1); } d.put(k, content.replace("
", "\n")); emojiFormatter(d, k);