Skip to content

Commit

Permalink
调整包结构
Browse files Browse the repository at this point in the history
  • Loading branch information
yaphone committed May 14, 2017
1 parent e893df7 commit d1b5835
Show file tree
Hide file tree
Showing 20 changed files with 271 additions and 909 deletions.
63 changes: 43 additions & 20 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D

## 消息格式

这里简要介绍一下`msg`各种消息,msg均为`json`格式的数据,可使用各自工具进行解析,在itchat4j中我通过alibaba的`fastjosn`工具库进行了解析,每种`msg`均为`fastjson`的标准`JSONObject`对象,后续处理起来非常方便,例如获取文本消息的消息内容:`msg.getString("Text")`,获取名片消息的被推荐人昵称:`msg.getJSONObject("RecommendInfo").getString("NickName")`。有时候可能不需要处理群消息,因此在构造`msg`消息体里我添加了一个判断是否群消息的字段`groupMsg`,可通过`msg.getBooleanValue("groupMsg")`获取字段的值,如果是群消息,返回true,如果非群消息,返回false。
这里简要介绍一下`msg`各种消息,msg均为`json`格式的数据,可使用各自工具进行解析,在itchat4j中我通过alibaba的`fastjosn`工具库进行了解析,每种`msg`均为`fastjson`的标准`JSONObject`对象,后续处理起来非常方便,例如获取文本消息的消息内容:`msg.getString("Text")`,获取名片消息的被推荐人昵称:`msg.getJSONObject("RecommendInfo").getString("NickName")`。有时候可能不需要处理群消息,因此在构造`msg`消息体里我添加了一个判断是否群消息的字段`groupMsg`,可通过`msg.getBoolean("groupMsg")`获取字段的值,如果是群消息,返回true,如果非群消息,返回false。

### 1.文本消息

Expand Down Expand Up @@ -458,43 +458,55 @@ public class MsgHandler implements IMsgHandlerFace {
* 简单示例程序,收到文本信息自动回复原信息,收到图片、语音、小视频后根据路径自动保存
*
* @author https://github.com/yaphone
* @date 创建时间:2017年4月28日 下午10:50:36
* @date 创建时间:2017年4月25日 上午12:18:09
* @version 1.0
*
*/
public class SimpleDemo implements IMsgHandlerFace {
Logger LOG = Logger.getLogger(SimpleDemo.class);

@Override
public String textMsgHandle(JSONObject msg) {
String text = msg.getString("Text");
return text;
String docFilePath = "D:/itchat4j/pic/test.docx"; // 这里是需要发送的文件的路径
if (!msg.getBoolean("groupMsg")) { // 群消息不处理
String userId = msg.getString("FromUserName");
MessageTools.sendFileMsgByUserId(userId, docFilePath); // 发送文件
String text = msg.getString("Text"); // 发送文本消息,也可调用MessageTools.sendFileMsgByUserId(userId,text);
return text;
}
return null;
}

@Override
public String picMsgHandle(JSONObject msg) {
String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".jpg"; // 这里使用收到图片的时间作为文件名
String picPath = "D://itchat4j/pic" + File.separator + fileName; // 保存图片的路径
DownloadTools.getDownloadFn(msg, MsgType.PIC, picPath); // 调用此方法来保存图片
String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());// 这里使用收到图片的时间作为文件名
String picPath = "D://itchat4j/pic" + File.separator + fileName + ".jpg"; // 调用此方法来保存图片
DownloadTools.getDownloadFn(msg, MsgTypeEnum.PIC.getType(), picPath); // 保存图片的路径
return "图片保存成功";
}

@Override
public String voiceMsgHandle(JSONObject msg) {
String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".mp3"; // 这里使用收到语音的时间作为文件名
String voicePath = "D://itchat4j/voice" + File.separator + fileName; // 保存语音的路径
DownloadTools.getDownloadFn(msg, MsgType.VOICE, voicePath); // 调用此方法来保存语音
String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
String voicePath = "D://itchat4j/voice" + File.separator + fileName + ".mp3";
DownloadTools.getDownloadFn(msg, MsgTypeEnum.VOICE.getType(), voicePath);
return "声音保存成功";
}

@Override
public String viedoMsgHandle(JSONObject msg) {
System.out.println(msg);
String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date()) + ".mp4"; // 这里使用收到小视频的时间作为文件名
String viedoPath = "D://itchat4j/viedo" + File.separator + fileName;// 保存小视频的路径
DownloadTools.getDownloadFn(msg, MsgType.VIEDO, viedoPath);// 调用此方法来保存小视频
String fileName = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss").format(new Date());
String viedoPath = "D://itchat4j/viedo" + File.separator + fileName + ".mp4";
DownloadTools.getDownloadFn(msg, MsgTypeEnum.VIEDO.getType(), viedoPath);
return "视频保存成功";
}

@Override
public String nameCardMsgHandle(JSONObject msg) {
return "收到名片消息";
}

}
```

Expand All @@ -510,14 +522,15 @@ public class SimpleDemo implements IMsgHandlerFace {
* @version 1.0
*
*/
public class Mytest {
public class MyTest {
public static void main(String[] args) {
String qrPath = "D://itchat4j//login"; // 保存登陆二维码图片的路径
IMsgHandlerFace msgHandler = new SimpleDemo(); // 实现IMsgHandlerFace接口的类
Wechat wechat = new Wechat(msgHandler, qrPath); // 【注入】
wechat.start(); // 启动服务,会在qrPath下生成一张二维码图片,扫描即可登陆,注意,二维码图片如果超过一定时间未扫描会过期,过期时会自动更新,所以你可能需要重新打开图片
}
}

```

### Demo2 图灵机器人
Expand All @@ -527,6 +540,7 @@ public class Mytest {
这个示例中我们接入图灵机器人的API,将收到的好友的文本信息发送给图灵机器人,并将机器人回复的消息发送给好友,接下来还是把舞台交代码和注释君吧。

```Java

/**
* 图灵机器人示例
*
Expand All @@ -536,8 +550,7 @@ public class Mytest {
*
*/
public class TulingRobot implements IMsgHandlerFace {

MyHttpClient myHttpClient = new MyHttpClient();
MyHttpClient myHttpClient = Core.getInstance().getMyHttpClient();
String apiKey = "597b34bea4ec4c85a775c469c84b6817"; // 这里是我申请的图灵机器人API接口,每天只能5000次调用,建议自己去申请一个,免费的:)
Logger logger = Logger.getLogger("TulingRobot");

Expand Down Expand Up @@ -568,29 +581,39 @@ public class TulingRobot implements IMsgHandlerFace {

@Override
public String picMsgHandle(JSONObject msg) {

return "收到图片";
}

@Override
public String voiceMsgHandle(JSONObject msg) {

String fileName = String.valueOf(new Date().getTime());
String voicePath = "D://itchat4j/voice" + File.separator + fileName + ".mp3";
DownloadTools.getDownloadFn(msg, MsgTypeEnum.VOICE.getType(), voicePath);
return "收到语音";
}

@Override
public String viedoMsgHandle(JSONObject msg) {

String fileName = String.valueOf(new Date().getTime());
String viedoPath = "D://itchat4j/viedo" + File.separator + fileName + ".mp4";
DownloadTools.getDownloadFn(msg, MsgTypeEnum.VIEDO.getType(), viedoPath);
return "收到视频";
}

public static void main(String[] args) {
IMsgHandlerFace msgHandler = new TulingRobot();
Wechat wechat = new Wechat(msgHandler, "/home/itchat4j/demo/itchat4j/login");
Wechat wechat = new Wechat(msgHandler, "D://itchat4j/login");
wechat.start();
}

@Override
public String nameCardMsgHandle(JSONObject msg) {
// TODO Auto-generated method stub
return null;
}

}

```

### Demo3 itchat4j集成在SpringMVC应用中
Expand Down
75 changes: 12 additions & 63 deletions src/main/java/cn/zhouyafeng/itchat4j/Wechat.java
Original file line number Diff line number Diff line change
@@ -1,82 +1,31 @@
package cn.zhouyafeng.itchat4j;

import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSONObject;

import cn.zhouyafeng.itchat4j.api.MessageTools;
import cn.zhouyafeng.itchat4j.controller.LoginController;
import cn.zhouyafeng.itchat4j.core.MsgCenter;
import cn.zhouyafeng.itchat4j.face.IMsgHandlerFace;
import cn.zhouyafeng.itchat4j.service.ILoginService;
import cn.zhouyafeng.itchat4j.service.impl.LoginServiceImpl;
import cn.zhouyafeng.itchat4j.utils.Core;
import cn.zhouyafeng.itchat4j.utils.enums.MsgTypeEnum;

/**
* 主类,初始化工作
*
* @author https://github.com/yaphone
* @date 创建时间:2017年4月25日 上午12:42:54
* @version 1.0
*
*/
public class Wechat {
private static Logger logger = Logger.getLogger("Wechat");
private static Core core = Core.getInstance();

private static final Logger LOG = LoggerFactory.getLogger(Wechat.class);
private IMsgHandlerFace msgHandler;

public Wechat(IMsgHandlerFace msgHandler, String qrPath) {
System.setProperty("jsse.enableSNIExtension", "false"); // 防止SSL错误

this.msgHandler = msgHandler;
// Login login = new Login();
ILoginService login = new LoginServiceImpl();
login.login();
};

// 登陆
LoginController login = new LoginController();
login.login(qrPath);
}

public void start() {
LOG.info("+++++++++++++++++++开始消息处理+++++++++++++++++++++");
new Thread(new Runnable() {

@Override
public void run() {
while (true) {
if (core.getMsgList().size() > 0 && core.getMsgList().get(0).getString("Content") != null) {
// System.out.println(core.getMsgList().get(0));
if (core.getMsgList().get(0).getString("Content").length() > 0) {
JSONObject msg = core.getMsgList().get(0);
if (msg.getString("Type") != null) {
if (msg.getString("Type").equals(MsgTypeEnum.TEXT.getType())) {
String result = msgHandler.textMsgHandle(msg);
MessageTools.sendMsgById(result,
core.getMsgList().get(0).getString("FromUserName"));
} else if (msg.getString("Type").equals(MsgTypeEnum.PIC.getType())) {
String result = msgHandler.picMsgHandle(msg);
MessageTools.sendMsgById(result,
core.getMsgList().get(0).getString("FromUserName"));
} else if (msg.getString("Type").equals(MsgTypeEnum.VOICE.getType())) {
String result = msgHandler.voiceMsgHandle(msg);
MessageTools.sendMsgById(result,
core.getMsgList().get(0).getString("FromUserName"));
} else if (msg.getString("Type").equals(MsgTypeEnum.VIEDO.getType())) {
String result = msgHandler.viedoMsgHandle(msg);
MessageTools.sendMsgById(result,
core.getMsgList().get(0).getString("FromUserName"));
} else if (msg.getString("Type").equals(MsgTypeEnum.NAMECARD.getType())) {
String result = msgHandler.nameCardMsgHandle(msg);
MessageTools.sendMsgById(result,
core.getMsgList().get(0).getString("FromUserName"));
}
}
}
core.getMsgList().remove(0);
}
try {
TimeUnit.MILLISECONDS.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
MsgCenter.handleMsg(msgHandler);
}
}).start();
}
Expand Down
33 changes: 0 additions & 33 deletions src/main/java/cn/zhouyafeng/itchat4j/Wechat2.java

This file was deleted.

23 changes: 12 additions & 11 deletions src/main/java/cn/zhouyafeng/itchat4j/api/MessageTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.logging.Logger;

import javax.activation.MimetypesFileTypeMap;

Expand All @@ -16,12 +15,14 @@
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.util.EntityUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;

import cn.zhouyafeng.itchat4j.core.Core;
import cn.zhouyafeng.itchat4j.utils.Config;
import cn.zhouyafeng.itchat4j.utils.Core;
import cn.zhouyafeng.itchat4j.utils.MyHttpClient;
import cn.zhouyafeng.itchat4j.utils.enums.URLEnum;

Expand All @@ -34,7 +35,7 @@
*
*/
public class MessageTools {
private static Logger logger = Logger.getLogger("Message");
private static Logger LOG = LoggerFactory.getLogger(MessageTools.class);
private static Core core = Core.getInstance();
private static MyHttpClient myHttpClient = core.getMyHttpClient();

Expand All @@ -47,7 +48,7 @@ public class MessageTools {
* @param toUserName
*/
private static void sendMsg(String text, String toUserName) {
logger.info(String.format("Request to send a text message to %s: %s", toUserName, text));
LOG.info(String.format("发送消息 %s: %s", toUserName, text));
webWxSendMsg(1, text, toUserName);
}

Expand Down Expand Up @@ -109,7 +110,7 @@ public static void webWxSendMsg(int msgType, String content, String toUserName)
HttpEntity entity = myHttpClient.doPost(url, paramStr);
EntityUtils.toString(entity, Consts.UTF_8);
} catch (Exception e) {
logger.info(e.getMessage());
LOG.error("webWxSendMsg", e);
}
}

Expand All @@ -133,7 +134,7 @@ public static void webWxSendMsg(int msgType, String content, String toUserName)
private static JSONObject webWxUploadMedia(String filePath) {
File f = new File(filePath);
if (!f.exists() && f.isFile()) {
logger.info("file is not exist");
LOG.info("file is not exist");
return null;
}
String url = String.format(URLEnum.WEB_WX_UPLOAD_MEDIA.getUrl(), core.getLoginInfo().get("fileUrl"));
Expand All @@ -151,7 +152,7 @@ private static JSONObject webWxUploadMedia(String filePath) {
+ String.valueOf(new Random().nextLong()).substring(0, 4);
String webwxDataTicket = MyHttpClient.getCookie("webwx_data_ticket");
if (webwxDataTicket == null) {
logger.info("get cookie webwx_data_ticket error");
LOG.error("get cookie webwx_data_ticket error");
return null;
}

Expand Down Expand Up @@ -183,7 +184,7 @@ private static JSONObject webWxUploadMedia(String filePath) {
String result = EntityUtils.toString(entity, Consts.UTF_8);
return JSON.parseObject(result);
} catch (Exception e) {
logger.info(e.getMessage());
LOG.error("webWxUploadMedia 错误: ", e);
}

}
Expand Down Expand Up @@ -258,7 +259,7 @@ private static boolean webWxSendMsgImg(String userId, String mediaId) {
String result = EntityUtils.toString(entity, Consts.UTF_8);
return JSON.parseObject(result).getJSONObject("BaseResponse").getInteger("Ret") == 0;
} catch (Exception e) {
logger.info(e.getMessage());
LOG.error("webWxSendMsgImg 错误: ", e);
}
}
return false;
Expand Down Expand Up @@ -288,7 +289,7 @@ public static boolean sendFileMsgByUserId(String userId, String filePath) {
data.put("totallen", responseObj.getString("StartPos"));
data.put("attachid", responseObj.getString("MediaId"));
} else {
logger.info("sednFileMsgByUserId error");
LOG.error("sednFileMsgByUserId 错误: ", data);
}
return webWxSendAppMsg(userId, data);
}
Expand Down Expand Up @@ -354,7 +355,7 @@ private static boolean webWxSendAppMsg(String userId, Map<String, String> data)
String result = EntityUtils.toString(entity, Consts.UTF_8);
return JSON.parseObject(result).getJSONObject("BaseResponse").getInteger("Ret") == 0;
} catch (Exception e) {
logger.info(e.getMessage());
LOG.error("错误: ", e);
}
}
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/cn/zhouyafeng/itchat4j/api/WechatTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

import com.alibaba.fastjson.JSONObject;

import cn.zhouyafeng.itchat4j.utils.Core;
import cn.zhouyafeng.itchat4j.core.Core;

/**
* 微信小工具,如获好友列表等
Expand Down
Loading

0 comments on commit d1b5835

Please sign in to comment.