Line Robot ( 四 ) - Reply Message API (Include reply message object)
前言:
接著在修改第三章的MessageHandler,其中作者額外寫了Message object的封裝物件以及做了Line Reply API的接口物件,相關資訊可以參考 https://github.com/JINHOUNGHUANG/lineRobot/tree/master/message-object
在上一章有提到如何回應使用者訊息,故本文就來探討Line回應訊息及主動發送訊息的功能。
Line提供了各網路接口(API)提供開發者去使用其服務,其中有Reply Message API以及Push Message API與Send Multicast Message API。
Reply Message API | |||
---|---|---|---|
網址 | https://api.line.me/v2/bot/message/reply | ||
請求方法 | POST |
Request headers | |||
---|---|---|---|
Content-Type | application/json | ||
Authorization | Bearer {channel access token} |
channel access token在Line機器人設定中有Channel access token選項,按下右方按鈕即可產生channel access token。
Request body | |||
---|---|---|---|
屬性名稱 | 資料型別 | 註解 | |
replyToken | String | Reply token received via webhook | |
messages | Array of message objects | Messages Max: 5 |
Line官方提供了數個Message Object供使用者任意搭配使用,要注意的是每次傳送的Message Object數量最大為五個,接下來開始介紹基本的Message Object
Text message | |||
---|---|---|---|
Property | Type | Description | |
type | String | text | |
text | String | Message text. You can include the following emoji: Unicode emojiLINE original emoji |
exmaple for text message object
{ "type": "text", "text": "Hello, world" }
Sticker message | |||
---|---|---|---|
Property | Type | Description | |
type | String | sticker | |
packageId | String | For information on package IDs, see the Sticker list | |
stickerId | String | For a list of sticker IDs for stickers that can be sent with the Messaging API |
exmaple for sticker message object
{ "type": "sticker", "packageId": "1", "stickerId": "1" }
目前的範例皆以這兩個Message object去介紹,詳細的請參考官方文件的-Message objects,為了測試API是否能正確使用,我們先以Postman進行API測試,如下圖所示
實測的過程中,由於replyToken的有效時間極短,作者為了要邊截圖邊測試所以失敗了一次(所以在問話中打了兩次"你好"),但在成功後就不要注意這小細節,接著我們就來實作Java code。
首先作者做了一接口用來區分Mesaage Event內的訊息內容
public interface MessageListener{ public void text(String replyToken, String text); public void image(String replyToken, String id); public void video(String replyToken, String id); public void audio(String replyToken, String id, long duration); public void file(String replyToken, String id, String fileName, long fileSize); public void location(String replyToken, String title, String address, double latitude, double longitude); public void sticker(String replyToken, String packageId, String stickerId); }
接著在修改第三章的MessageHandler,其中作者額外寫了Message object的封裝物件以及做了Line Reply API的接口物件,相關資訊可以參考 https://github.com/JINHOUNGHUANG/lineRobot/tree/master/message-object
@Component public class MessageHandler { @Value("${line.user.channel.token}") private String LINE_TOKEN; public void doAction(JSONObject event) { doAction(this.messageListener, event); } public void doAction(MessageListener messageListener, JSONObject event) { switch (event.getJSONObject("message").getString("type")) { case "text": messageListener.text(event.getString("replyToken"), event.getJSONObject("message").getString("text")); break; case "image": messageListener.image(event.getString("replyToken"), event.getJSONObject("message").getString("id")); break; case "video": messageListener.video(event.getString("replyToken"), event.getJSONObject("message").getString("id")); break; case "audio": messageListener.audio(event.getString("replyToken"), event.getJSONObject("message").getString("id"), event.getJSONObject("message").getLong("duration")); break; case "file": messageListener.file(event.getString("replyToken"), event.getJSONObject("message").getString("id"), event.getJSONObject("message").getString("fileName"), event.getJSONObject("message").getLong("fileSize")); break; case "location": messageListener.location(event.getString("replyToken"), event.getJSONObject("message").getString("title"), event.getJSONObject("message").getString("address"), event.getJSONObject("message").getDouble("latitude"), event.getJSONObject("message").getDouble("longitude")); break; case "sticker": messageListener.sticker(event.getString("replyToken"), event.getJSONObject("message").getString("packageId"), event.getJSONObject("message").getString("stickerId")); break; } } private MessageListener messageListener = new MessageListener() { @Override public void video(String replyToken, String id) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "video"); } @Override public void text(String replyToken, String text) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "text"); LineConnector.getInstance().replyMessage(LINE_TOKEN, new ReplyMessage(replyToken, new BaseMessage[] {new TextMessage("看不懂~請在跟我說一次"), new StickerMessage("11538", "51626532")})); } @Override public void sticker(String replyToken, String packageId, String stickerId) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "sticker"); LineConnector.getInstance().replyMessage(LINE_TOKEN, new ReplyMessage(replyToken, new BaseMessage[] {new TextMessage("看不懂~請在跟我說一次"), new StickerMessage("11538", "51626532")})); } @Override public void location(String replyToken, String title, String address, double latitude, double longitude) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "location"); } @Override public void image(String replyToken, String id) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "image"); } @Override public void file(String replyToken, String id, String fileName, long fileSize) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "file"); } @Override public void audio(String replyToken, String id, long duration) { // TODO Auto-generated method stub System.out.printf("%s\t%s\n", replyToken, "file"); } }; }
作者在class中實作了MessageListener介面並在方法中解析JSON封包並依序排入介面內,然後實際運行後觀測其結果:
留言
張貼留言