Skip to content

Commit 52b1689

Browse files
authored
Merge pull request #9 from yaphone/itchat4j-dev
Itchat4j dev
2 parents 904e671 + d1b5835 commit 52b1689

38 files changed

+1541
-1243
lines changed

README.md

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小D
128128

129129
## 消息格式
130130

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

133133
### 1.文本消息
134134

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

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

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

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

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

505+
@Override
506+
public String nameCardMsgHandle(JSONObject msg) {
507+
return "收到名片消息";
508+
}
509+
498510
}
499511
```
500512

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

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

529542
```Java
543+
530544
/**
531545
* 图灵机器人示例
532546
*
@@ -536,8 +550,7 @@ public class Mytest {
536550
*
537551
*/
538552
public class TulingRobot implements IMsgHandlerFace {
539-
540-
MyHttpClient myHttpClient = new MyHttpClient();
553+
MyHttpClient myHttpClient = Core.getInstance().getMyHttpClient();
541554
String apiKey = "597b34bea4ec4c85a775c469c84b6817"; // 这里是我申请的图灵机器人API接口,每天只能5000次调用,建议自己去申请一个,免费的:)
542555
Logger logger = Logger.getLogger("TulingRobot");
543556

@@ -568,29 +581,39 @@ public class TulingRobot implements IMsgHandlerFace {
568581

569582
@Override
570583
public String picMsgHandle(JSONObject msg) {
571-
572584
return "收到图片";
573585
}
574586

575587
@Override
576588
public String voiceMsgHandle(JSONObject msg) {
577-
589+
String fileName = String.valueOf(new Date().getTime());
590+
String voicePath = "D://itchat4j/voice" + File.separator + fileName + ".mp3";
591+
DownloadTools.getDownloadFn(msg, MsgTypeEnum.VOICE.getType(), voicePath);
578592
return "收到语音";
579593
}
580594

581595
@Override
582596
public String viedoMsgHandle(JSONObject msg) {
583-
597+
String fileName = String.valueOf(new Date().getTime());
598+
String viedoPath = "D://itchat4j/viedo" + File.separator + fileName + ".mp4";
599+
DownloadTools.getDownloadFn(msg, MsgTypeEnum.VIEDO.getType(), viedoPath);
584600
return "收到视频";
585601
}
586602

587603
public static void main(String[] args) {
588604
IMsgHandlerFace msgHandler = new TulingRobot();
589-
Wechat wechat = new Wechat(msgHandler, "/home/itchat4j/demo/itchat4j/login");
605+
Wechat wechat = new Wechat(msgHandler, "D://itchat4j/login");
590606
wechat.start();
591607
}
592608

609+
@Override
610+
public String nameCardMsgHandle(JSONObject msg) {
611+
// TODO Auto-generated method stub
612+
return null;
613+
}
614+
593615
}
616+
594617
```
595618

596619
### Demo3 itchat4j集成在SpringMVC应用中

logContentFile.log

Whitespace-only changes.

pom.xml

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,7 @@
1616
</properties>
1717

1818
<dependencies>
19-
<dependency>
20-
<groupId>junit</groupId>
21-
<artifactId>junit</artifactId>
22-
<version>3.8.1</version>
23-
<scope>test</scope>
24-
</dependency>
25-
19+
2620
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
2721
<dependency>
2822
<groupId>org.apache.httpcomponents</groupId>
@@ -64,6 +58,31 @@
6458
<version>1.1.1</version>
6559
</dependency>
6660

61+
<!-- https://mvnrepository.com/artifact/junit/junit -->
62+
<dependency>
63+
<groupId>junit</groupId>
64+
<artifactId>junit</artifactId>
65+
<version>4.12</version>
66+
</dependency>
67+
68+
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
69+
<dependency>
70+
<groupId>org.slf4j</groupId>
71+
<artifactId>slf4j-api</artifactId>
72+
<version>1.6.6</version>
73+
</dependency>
74+
<dependency>
75+
<groupId>org.slf4j</groupId>
76+
<artifactId>slf4j-log4j12</artifactId>
77+
<version>1.6.6</version>
78+
</dependency>
79+
<dependency>
80+
<groupId>log4j</groupId>
81+
<artifactId>log4j</artifactId>
82+
<version>1.2.16</version>
83+
</dependency>
84+
85+
6786

6887
</dependencies>
6988

src/main/java/cn/zhouyafeng/itchat4j/Wechat.java

Lines changed: 11 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,31 @@
11
package cn.zhouyafeng.itchat4j;
22

3-
import java.util.concurrent.TimeUnit;
4-
import java.util.logging.Logger;
3+
import org.slf4j.Logger;
4+
import org.slf4j.LoggerFactory;
55

6-
import com.alibaba.fastjson.JSONObject;
7-
8-
import cn.zhouyafeng.itchat4j.api.MessageTools;
9-
import cn.zhouyafeng.itchat4j.components.Login;
6+
import cn.zhouyafeng.itchat4j.controller.LoginController;
7+
import cn.zhouyafeng.itchat4j.core.MsgCenter;
108
import cn.zhouyafeng.itchat4j.face.IMsgHandlerFace;
11-
import cn.zhouyafeng.itchat4j.utils.Core;
12-
import cn.zhouyafeng.itchat4j.utils.MsgType;
139

14-
/**
15-
* 主类,初始化工作
16-
*
17-
* @author https://github.com/yaphone
18-
* @date 创建时间:2017年4月25日 上午12:42:54
19-
* @version 1.0
20-
*
21-
*/
2210
public class Wechat {
23-
private static Logger logger = Logger.getLogger("Wechat");
24-
private static Core core = Core.getInstance();
25-
11+
private static final Logger LOG = LoggerFactory.getLogger(Wechat.class);
2612
private IMsgHandlerFace msgHandler;
2713

2814
public Wechat(IMsgHandlerFace msgHandler, String qrPath) {
2915
System.setProperty("jsse.enableSNIExtension", "false"); // 防止SSL错误
30-
3116
this.msgHandler = msgHandler;
32-
Login login = new Login();
33-
login.login(qrPath);
3417

35-
};
18+
// 登陆
19+
LoginController login = new LoginController();
20+
login.login(qrPath);
21+
}
3622

3723
public void start() {
24+
LOG.info("+++++++++++++++++++开始消息处理+++++++++++++++++++++");
3825
new Thread(new Runnable() {
39-
4026
@Override
4127
public void run() {
42-
while (true) {
43-
if (core.getMsgList().size() > 0 && core.getMsgList().get(0).getString("Content") != null) {
44-
// System.out.println(core.getMsgList().get(0));
45-
if (core.getMsgList().get(0).getString("Content").length() > 0) {
46-
JSONObject msg = core.getMsgList().get(0);
47-
if (msg.getString("Type") != null) {
48-
if (msg.getString("Type").equals(MsgType.TEXT)) {
49-
String result = msgHandler.textMsgHandle(msg);
50-
MessageTools.send(result, core.getMsgList().get(0).getString("FromUserName"), "");
51-
} else if (msg.getString("Type").equals(MsgType.PIC)) {
52-
String result = msgHandler.picMsgHandle(msg);
53-
MessageTools.send(result, core.getMsgList().get(0).getString("FromUserName"), "");
54-
} else if (msg.getString("Type").equals(MsgType.VOICE)) {
55-
String result = msgHandler.voiceMsgHandle(msg);
56-
MessageTools.send(result, core.getMsgList().get(0).getString("FromUserName"), "");
57-
} else if (msg.getString("Type").equals(MsgType.VIEDO)) {
58-
String result = msgHandler.viedoMsgHandle(msg);
59-
MessageTools.send(result, core.getMsgList().get(0).getString("FromUserName"), "");
60-
} else if (msg.getString("Type").equals(MsgType.NAMECARD)) {
61-
String result = msgHandler.nameCardMsgHandle(msg);
62-
MessageTools.send(result, core.getMsgList().get(0).getString("FromUserName"), "");
63-
}
64-
}
65-
}
66-
core.getMsgList().remove(0);
67-
}
68-
try {
69-
TimeUnit.MILLISECONDS.sleep(1000);
70-
} catch (InterruptedException e) {
71-
e.printStackTrace();
72-
}
73-
}
28+
MsgCenter.handleMsg(msgHandler);
7429
}
7530
}).start();
7631
}

0 commit comments

Comments
 (0)