-
Notifications
You must be signed in to change notification settings - Fork 63
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 4e02f4a
Showing
6 changed files
with
324 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
/target | ||
/.project | ||
/.settings | ||
/.classpath | ||
/.idea | ||
/.DS_Store | ||
*.iml | ||
|
||
/bin/ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 not shown.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 "视频保存成功"; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
|
||
} |