itchat4j -- 用Java擴充套件個人微訊號的能力
## 專案地址:itchat4j,該專案長期維護更新,歡迎star、fork、 pull requests、 issue。
來源
itchat是一個非常優秀的開源微信個人號介面,使用Python語言開發,提供了簡單易用的API,可以很方便地對個人微訊號進行擴充套件,實現自動回覆,微信掛機機器人等,一直在關注這個專案,基於itchat開發過一個小專案,用來控制我的樹莓派來播放音樂,效果還不錯。
一直想實現一個java版本的itchat,由於工作太忙導致一拖再拖,這段時間稍微空閒了一些,仔細閱讀了itchat的原始碼,終於完成了一個基礎版本,由於主要靈感來源於itchat專案,所以這個專案的就暫時定名為itchat4j吧。
專案介紹
itchat是一個開源的微信個人號介面,使用Java呼叫微信從未如此簡單。使用短短的幾十行程式碼,你就可以完成一個能夠處理所有資訊的微信機器人。當然,itchat的使用遠不止一個機器人,更多的功能等著你來發現,如今微信已經成為了個人社交的很大一部分,希望這個專案能夠幫助你擴充套件你的個人的微訊號、方便自己的生活。(引自itchat專案)
你可以輕鬆將itchat4j其整合在你個人的Java應用中,無論是SpringMVC、桌面程式還是嵌入式程式,只要使用的JDK是1.5以上的版本,都可以輕鬆接入。玩法很多,請開啟你的腦洞,比如這些:
Just for fun,把個人微訊號擴充套件為”公眾號”,在朋友面前裝個X吧。
整合在你的個人應用(SpringMVC、Serverlet、GUI)中,為應用提供更強的服務能力。
部署在你的伺服器上,將監控資訊、日誌傳送到你的微訊號。
微信機器人,專業陪聊工具
控制智慧家居、智慧硬體等具有開放介面的裝置
Anything you want …
如何使用
itchat4j是一個Maven專案,下載原始碼後,可以以Maven專案的形式匯入,匯入後的專案結構如下圖:
src/main/java是itchat4j的專案原始碼,在src/test/java目錄下有兩個小Demo:一個是基本功能的小示例,當前,itchat4j可以處理四類基本資訊,文字、語音、圖片和小視訊,該示例在收到文字資訊後自動回覆,回覆內容為收到的文字,當收到圖片、語音、小視訊時可以儲存到指定的目錄;一個是微信接入圖靈機器人的小例子,讓你的個人微訊號搖身一變,成為一個小小的”公眾號”,百聞不如一見,我把這個圖靈機器人的小Demo部署到了我的阿里雲伺服器上,現在就掃碼體驗一下吧。
微信機器人使用截圖
簡單入門教程
接下來,通過兩個小Demo來演示一下如何使用itchat4j來擴充套件你的個人微訊號,入門教程的專案原始碼可以從此處下載。
Demo1: SimpleDemo
這個小Demo將會將收到的文字訊息傳送給發件人,如果是圖片、語音或者小視訊訊息,將會儲存在我們指定的路徑下。
首先需要新建一個類來實現IMsgHandlerFace這個介面,這個類要做的就是我們需要完成的邏輯,該介面有四個方法需要實現,textMsgHandle用於處理文字資訊,picMsgHandle用於處理圖片資訊,viedoMsgHandle用於處理小視訊資訊,voiceMsgHandle用於處理語音資訊,程式碼如下:
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型別,這個其實不用關心,我們只需要知道如何來獲取需要的訊息就可以了,下面的Demo中有示例。然後我們來寫處理邏輯。
在textMsgHandler中,通過msg.getString("Text")就可以獲取收到的文字資訊,然後作進一步處理,比如接入圖靈機器人、訊息自動回覆等,我們需要在這個方法中返回一個字串,即是需要回復給好友的訊息,在SimpleDemo這個示例中,我們直接回復收到的原文字訊息。
在picMsgHandle、voiceMsgHandle、viedoMsgHandle這三個方法中,我們需要將這些訊息下載下來,然後再作進一步處理,所以需要為每種型別的訊息提供一個儲存路徑,然後呼叫DownloadTools.getDownloadFn方法可以將這三種類型的訊息下載下來。DownloadTools.getDownloadFn方法提供下載圖片、語音、小視訊的功能,需要三個引數,第一個引數為我們收到的msg,第二個引數為MsgType,也就是訊息型別,圖片、語音、小視訊分別對應MsgType.PIC、MsgType.VOICE、MsgType.VOICE,然後第三個引數就是儲存這些訊息的路徑了。
就不多說了,讓程式碼和註釋君自述吧,有不明白的地方,可以在Issue中提出來。
/**
* 簡單示例程式,收到文字資訊自動回覆原資訊,收到圖片、語音、小視訊後根據路徑自動儲存
*
* @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 "視訊儲存成功";
}
}
之後我們需要將實現IMsgHandlerFace介面的類【注入】到Wechat中來啟動服務,Wechat是服務的主入口,其建構函式接受兩個引數,一個是我們剛才實現IMsgHandlerFace介面的類,另一個是儲存登陸二維碼圖片的路徑。之後在Wechat物件上呼叫start()方法來啟動服務,會在我們剛才傳入的路徑下生成一個QR.jpg檔案,即是登陸二維碼,通過手機微信掃描後即可登陸,服務啟動,處理邏輯開始工作。這裡有一點需要注意:二維碼圖片如果超過一定時間未掃描會過期,過期時會自動更新,所以你可能需要重新開啟圖片。
額,文字還是太蒼白,讓程式碼和註釋君自述吧。
/**
*
* @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 = "D://itchat4j//login"; // 儲存登陸二維碼圖片的路徑
IMsgHandlerFace msgHandler = new SimpleDemo(); // 實現IMsgHandlerFace介面的類
Wechat wechat = new Wechat(msgHandler, qrPath); // 【注入】
wechat.start(); // 啟動服務,會在qrPath下生成一張二維碼圖片,掃描即可登陸,注意,二維碼圖片如果超過一定時間未掃描會過期,過期時會自動更新,所以你可能需要重新開啟圖片
}
}
Demo2 圖靈機器人
圖靈機器人大腦具備強大的中文語義分析能力,可準確理解中文含義並作出迴應,是最擅長聊中文的機器人大腦,賦予軟硬體產品自然流暢的人機對話能力。(引自百度百科)
這個示例中我們接入圖靈機器人的API,將收到的好友的文字資訊傳送給圖靈機器人,並將機器人回覆的訊息傳送給好友,接下來還是把舞臺交程式碼和註釋君吧。
/**
* 圖靈機器人示例
*
* @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();
}
}
Demo3 itchat4j整合在SpringMVC應用中
這個示例要講起來就比較困難了,因為SpringMVC本身就是一個複雜的東西,先在這裡挖個坑吧。其實在SpringMVC中整合與上面兩個示例並沒有太大的不同,我的個人部落格是基於SpringMVC的,我已經將整合在這個專案裡了,這樣我就可以通過微信來更新我的部落格了。詳細的就不多說了,大家先看看這個專案結構吧。
其中MsgHandler就是我處理微信訊息的邏輯,略複雜,就不貼程式碼了。WechatService就是將MsgHandler“注入”到Wechat類中,與上面兩個示例的作用是一樣的,貼一下WechatService的程式碼:
/**
* Wechat服務實現類
*
* @author https://github.com/yaphone
* @date 建立時間:2017年4月29日 下午7:44:01
* @version 1.0
*
*/
@Service("wechatService")
public class WechatService implements IWechatServiceFace {
@Value("${qrPath}")
private String qrPath;
@Override
public void login() {
MsgHandler msgHandler = new MsgHandler();
Wechat wechat = new Wechat(msgHandler, qrPath);
wechat.start();
}
}
類似專案
itchat :優秀的、基於Python的微信個人號API,同時也是本專案的靈感之源。
問題和建議
本專案長期更新、維護,功能不斷擴充套件與完善中,歡迎star。
專案使用過程中遇到問題,歡迎隨時反饋。
任何問題或者建議都可以在Issue中提出來,也可以加入QQ群討論:636365179
原文:https://blog.csdn.net/u012225151/article/details/70991873
版權宣告:本文為博主原創文章,轉載請附上博文連結!