Skip to content

Commit

Permalink
第一次提交
Browse files Browse the repository at this point in the history
  • Loading branch information
yaphone committed Apr 29, 2017
0 parents commit 4e02f4a
Show file tree
Hide file tree
Showing 6 changed files with 324 additions and 0 deletions.
9 changes: 9 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
/target
/.project
/.settings
/.classpath
/.idea
/.DS_Store
*.iml

/bin/
160 changes: 160 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
# itchat4j -- 让个人微信号拥有公众号的能力


### 项目地址:[itchat4j](https://github.com/yaphone/itchat4j),该项目长期维护更新,欢迎start, fork, pull/request, issue。

## 来源

[itchat](https://github.com/littlecodersh/ItChat)是一个非常优秀的开源微信个人号接口,使用Python语言开发,提供了简单易用的API,可以很方便地对个人微信号进行扩展,实现自动回复,微信挂机机器人等,一直在关注这个项目,基于itchat开发过[一个小项目](https://github.com/yaphone/RasWxNeteaseMusic),用来控制我的树莓派来播放音乐,效果还不错。

一直想实现一个java版本的itchat,由于工作太忙导致一拖再拖,这段时间稍微空闲了一些,仔细阅读了itchat的源码,终于完成了一个基础版本,由于主要灵感来源于原项目,所以这个项目的就暂时定名为[itchat4j](https://github.com/yaphone/itchat4j)吧。



## 项目介绍

[itchat4j](https://github.com/yaphone/itchat4j)是一个开源的微信个人号接口,使用Java调用微信从未如此简单。使用不到三十行的代码,你就可以完成一个能够处理所有信息的微信机器人。当然,[itchat4j](https://github.com/yaphone/itchat4j)的使用远不止一个机器人,更多的功能等着你来发现,你可以轻松将其集成在你个人的Java应用中,无论是SpringMVC、桌面程序还是嵌入式程序,只要使用的JDK是1.5以上的版本,都可以轻松接入。

如今微信已经成为了个人社交的很大一部分,希望这个项目能够帮助你扩展你的个人的微信号、方便自己的生活。

玩法很多,请打开你的脑洞,比如这些:

- Just for fun,把个人微信号扩展为"公众号",在朋友面前装个X吧。
- 集成在你的个人应用(SpringMVC、Serverlet、GUI)中,为应用提供更强的能力。
- 部署在你的服务器上,将监控信息、日志发送到你的微信号。
- 微信机器人,专业陪聊工具
- 控制智能家居、智能硬件等具有开放接口的设备
- Anything you want ...



## 如何使用

itchat4j是一个Maven项目,下载源码后,可以以Maven项目的形式导入,导入后的项目结构如下图:

![itchat4j项目结构](http://oj5vdtyuu.bkt.clouddn.com/itchat4j%E9%A1%B9%E7%9B%AE.png)

src/main/java是itchat4j的项目源码,在src/test/java目录下有两个小Demo:一个是基本功能的小示例,当前,itchat4j可以处理四类基本信息,文本、语音、图片和小视频,该示例在收到文本信息后自动回复,回复内容为收到的文本,当收到图片、语音、小视频时可以保存到指定的目录;一个是微信接入图灵机器人的小例子,让你的个人微信号摇身一变,成为一个小小的公众号,百闻不如一见,我把这个图灵机器人的小Demo部署到了我的阿里云服务器上,现在就扫码体验一下吧。

![二维码](http://oj5vdtyuu.bkt.clouddn.com/%E5%8A%A0%E6%88%91%E5%A5%BD%E5%8F%8B.png)



## 简单入门教程

接下来,通过两个小Demo来演示一下如何使用itchat4j来扩展你的个人微信号。

### Demo1: SimpleDemo

这个小Demo将会将收到的文本消息发送给发件人,如果是图片、语音或者小视频消息,将会保存在我们指定的路径下。

然后我们需要新建一个类来实现`IMsgHandlerFace`这个接口,该接口有四个方法需要实现,`textMsgHandle`用于处理文本信息,`picMsgHandle`用于处理图片信息,`viedoMsgHandle`用于处理小视频信息,`voiceMsgHandle`用于处理语音信息,代码如下:

```java
public class MsgHandler implements IMsgHandlerFace {

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

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

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

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

}
```

由于没有关联源码,所以接口中的参数都变成了`arg0`这种,建议关联一下源码,源码可在release中下载,当然不关联也不会有啥影响,`arg0`其实是我们需要处理的消息,为了更直观,我们把`arg0`修改为`msg`,msg是fastjson的JSONObject类型,这个其实我们不用关心。在我们这个类中,需要实现我们处理消息的逻辑。

`textMsgHandler`中,我们通过`msg.getString("Text")`就可以获取收到的文本信息,然后作进一步处理,比如接入图灵机器人、消息自动回复等,在这个方法中,我们需要返回一个字符串,即是需要回复的消息,在SimpleDemo这个示例中,我们直接回复收到的原消息。

`picMsgHandle``voiceMsgHandle``viedoMsgHandle`这三个方法中,我们需要将这些消息下载下来,然后再作进一步处理,所以需要为每种类型的消息提供一个保存路径,然后调用`DownloadTools.getDownloadFn`方法可以将这三种类型的消息下载下来。

就不多说了,让代码和注释君自述吧,有不明白的地方,可以在Issue中提出来。

```java
/**
* 简单示例程序,收到文本信息自动回复原信息,收到图片、语音、小视频后根据路径自动保存
*
* @author https://github.com/yaphone
* @date 创建时间:2017年4月28日 下午10:50:36
* @version 1.0
*
*/
public class SimpleDemo implements IMsgHandlerFace {

@Override
public String textMsgHandle(JSONObject msg) {
String text = msg.getString("Text");
return text;
}

@Override
public String picMsgHandle(JSONObject msg) {
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, MsgType.PIC, picPath);
return "图片保存成功";
}

@Override
public String voiceMsgHandle(JSONObject msg) {
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, MsgType.VOICE, 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());
String viedoPath = "D://itchat4j/viedo" + File.separator + fileName + ".mp4";
DownloadTools.getDownloadFn(msg, MsgType.VIEDO, viedoPath);
return "视频保存成功";
}

}

```

实现这个消息处理的Handle之后,我们需要将其注入到`Wechat`中来启动服务,`Wechat`是服务的主入口,其构造函数接受两个参数,一个是我们刚才实现的`MsgHandler`类,另一个是保存登陆二维码的路径。然后在`Wechat`对象上调用`start()`方法来启动服务,之后会在我们刚才传入的路径下生成一个`QR.jpg`文件,即是我们的登陆二维码,通过手机微信扫描后即可登陆,实现`IMsgHandlerFace`的类即会实现我们的逻辑,额,说的有点乱,还是让代码君自述吧。

```Java
/**
*
* @author https://github.com/yaphone
* @date 创建时间:2017年4月28日 上午12:44:10
* @version 1.0
*
*/
public class Mytest {
public static void main(String[] args) {
String qrPath = "E://itchat4j";
IMsgHandlerFace msgHandler = new SimpleDemo();
Wechat wechat = new Wechat(msgHandler, qrPath);
wechat.start();
}

}
```

### Demo2 图灵机器人

图灵机器人
Binary file added lib/itchat4j.jar
Binary file not shown.
21 changes: 21 additions & 0 deletions src/itchat4jtest/demo/demo1/Mytest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package itchat4jtest.demo.demo1;

import cn.zhouyafeng.itchat4j.Wechat;
import cn.zhouyafeng.itchat4j.face.IMsgHandlerFace;

/**
*
* @author https://github.com/yaphone
* @date ´´½¨Ê±¼ä£º2017Äê4ÔÂ28ÈÕ ÉÏÎç12:44:10
* @version 1.0
*
*/
public class Mytest {
public static void main(String[] args) {
String qrPath = "E://itchat4j";
IMsgHandlerFace msgHandler = new SimpleDemo();
Wechat wechat = new Wechat(msgHandler, qrPath);
wechat.start();
}

}
54 changes: 54 additions & 0 deletions src/itchat4jtest/demo/demo1/SimpleDemo.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package itchat4jtest.demo.demo1;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

import com.alibaba.fastjson.JSONObject;

import cn.zhouyafeng.itchat4j.face.IMsgHandlerFace;
import cn.zhouyafeng.itchat4j.utils.DownloadTools;
import cn.zhouyafeng.itchat4j.utils.MsgType;

/**
* 简单示例程序,收到文本信息自动回复原信息,收到图片、语音、小视频后根据路径自动保存
*
* @author https://github.com/yaphone
* @date 创建时间:2017年4月28日 下午10:50:36
* @version 1.0
*
*/
public class SimpleDemo implements IMsgHandlerFace {

@Override
public String textMsgHandle(JSONObject msg) {
String text = msg.getString("Text");
return text;
}

@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); // 调用此方法来保存图片
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); // 调用此方法来保存语音
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);// 调用此方法来保存小视频
return "视频保存成功";
}

}
80 changes: 80 additions & 0 deletions src/itchat4jtest/demo/demo2/TulingRobot.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
package itchat4jtest.demo.demo2;

import java.util.HashMap;
import java.util.Map;
import java.util.logging.Logger;

import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;

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

import cn.zhouyafeng.itchat4j.Wechat;
import cn.zhouyafeng.itchat4j.face.IMsgHandlerFace;
import cn.zhouyafeng.itchat4j.utils.MyHttpClient;

/**
* 图灵机器人示例
*
* @author https://github.com/yaphone
* @date 创建时间:2017年4月24日 上午12:13:26
* @version 1.0
*
*/
public class TulingRobot implements IMsgHandlerFace {

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

@Override
public String textMsgHandle(JSONObject msg) {
String result = "";
String text = msg.getString("Text");
String url = "http://www.tuling123.com/openapi/api";
Map<String, String> paramMap = new HashMap<String, String>();
paramMap.put("key", apiKey);
paramMap.put("info", text);
paramMap.put("userid", "123456");
String paramStr = JSON.toJSONString(paramMap);
try {
HttpEntity entity = myHttpClient.doPost(url, paramStr);
result = EntityUtils.toString(entity, "UTF-8");
JSONObject obj = JSON.parseObject(result);
if (obj.getString("code").equals("100000")) {
result = obj.getString("text");
} else {
result = "处理有误";
}
} catch (Exception e) {
logger.info(e.getMessage());
}
return result;
}

@Override
public String picMsgHandle(JSONObject msg) {

return "收到图片";
}

@Override
public String voiceMsgHandle(JSONObject msg) {

return "收到语音";
}

@Override
public String viedoMsgHandle(JSONObject msg) {

return "收到视频";
}

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

}

0 comments on commit 4e02f4a

Please sign in to comment.