Botから確認画面を表示して、ユーザ側の返答に対応する。
pushクラスに確認画面をpush送信するメソッドを作成する。
package com.example.linebot;
import com.linecorp.bot.client.LineMessagingClient;
import com.linecorp.bot.model.PushMessage;
import com.linecorp.bot.model.action.PostbackAction;
import com.linecorp.bot.model.message.Message;
import com.linecorp.bot.model.message.TemplateMessage;
import com.linecorp.bot.model.message.TextMessage;
import com.linecorp.bot.model.message.template.ConfirmTemplate;
import com.linecorp.bot.model.response.BotApiResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutionException;
@RestController
public class Push {
// ------------ 中略・変更なし ------------
// 確認メッセージをpush
@GetMapping("confirm")
public String pushConfirm() {
String text = "質問だよ";
try {
Message msg = new TemplateMessage(text,
new ConfirmTemplate("いいかんじ?",
new PostbackAction("おけまる", "CY"),
new PostbackAction("やばたん", "CN")));
PushMessage pMsg = new PushMessage(userId, msg);
BotApiResponse resp = client.pushMessage(pMsg).get();
log.info("Sent messages: {}", resp);
} catch (InterruptedException | ExecutionException e) {
throw new RuntimeException(e);
}
return text;
}
}
LineBotApplication を一度停止して、再起動する。
http://localhost:8080/confirm にブラウザでアクセスし、ブラウザに質問だよ
と表示されることを確認する。同時に、LINEBotが「いいかんじ?」と質問を発言していることを確認する。
いまはこれに回答しても何もおこらない。回答するための処理を、今度はCallbackクラスに追加する。
package com.example.linebot.replier;
import com.linecorp.bot.model.event.PostbackEvent;
import com.linecorp.bot.model.message.Message;
import com.linecorp.bot.model.message.TextMessage;
public class DialogAnswer implements Replier {
private PostbackEvent event;
public DialogAnswer(PostbackEvent event) {
this.event = event;
}
@Override
public Message reply() {
String actionLabel = this.event.getPostbackContent().getData();
switch (actionLabel) {
case "CY":
return new TextMessage("イイね!");
case "CN":
return new TextMessage("つらたん");
}
return new TextMessage("?");
}
}
import com.linecorp.bot.model.event.PostbackEvent;
import com.example.linebot.replier.DialogAnswer;
Callbackクラスに、ユーザが回答した内容に対応して動作を変える handlePostBack メソッドを追加する。
@LineMessageHandler
public class Callback {
// ------------ 中略・変更なし ------------
// PostBackEventに対応する
@EventMapping
public Message handlePostBack(PostbackEvent event) {
DialogAnswer dialogAnswer = new DialogAnswer(event);
return dialogAnswer.reply();
}
}
LinebotApplication を一度停止して、再起動する。
[http://localhost:8080/confirm](http://localhost:8080/confirm にブラウザでアクセスし、ブラウザに質問だよ
と表示されることを確認する。同時に、LINEBotが「いいかんじ?」と質問を発言していることを確認する。
ユーザが選択肢を選んで回答すると、Botがその選択肢に対応して異なる返答をする。
- 確認ダイアログのような、ユーザーが回答や操作できるものはテンプレートメッセージ(
TemplateMessage
)として構成される(公式のドキュメント:テンプレートメッセージ)。 - ユーザが回答に使える選択肢には ポストバックアクション(
PostBackAction
) を利用する。これにより、表示される文字列とは別に、何を押されたかが判断できるパラメータ(data
)を送信できる。 - ユーザが選択肢を回答すると、Callback クラスに ポストバックイベント(
PostBackEvent
) が送信される。
Callbackクラスではこれに対応するメソッドを用意して、何を押されたかが判断できるパラメータの値で、Botの動作(回答内容)を変えている。
他にも、ユーザにWebサイトを表示させるURIAction
、日付を入力させるDateTimePickerAction
が存在する。
詳細はリッチメニューの項で解説している。 - TemplateMessageは、Callback クラスでのユーザからの返答時に表示することもできる。
(ユーザが何かメッセージを送り、その返答に確認ウィンドウを出す)
その場合、Callback クラスのフィールド変数としてLineMessageClient
とそのインジェクション(@Autowired
)が必要になる @GetMapping("confirm")
は、ブラウザから実行するためのテスト用なので、実際に開発するときには削除してもよい(スケジュール機能などで実行する)