概要
- api.aiでは単なるテキストだけではなく、Custom Payloadとして音声データや動画、ファイルなどのリッチメッセージを返すことができます。
- 参考)Rich Messages
- 全てのintegrationが対応しているわけではないっぽい
- facebookメッセンジャーでのwebhook時にどういったレスポンスを返せばいいかの備忘録です。
実装
- というほどのものではないですが、例えば音声データを返したいというときは以下のようなjsonを返す実装をしていきます。
fulfillment
"fulfillment": {
"messages": [
{
"payload": {
"facebook": {
"attachment": {
"payload": {
"url": "https://hogehoge/audio/description.mp3"
},
"type": "audio"
}
}
},
"type": 4
}
]
}
- Controllerです。何やらFulfillmetをそのまま返すとExceptionが発生してしまうので文字列で返してます。
MainController.java
@Controller
public class MainController {
private final MainService mainService;
public MainController(MainService mainService) {
this.mainService = mainService;
}
@ResponseBody
@PostMapping(value="/webhook")
public String webhook(HttpServletRequest request) {
return mainService.createFulfillmentJson();
}
}
- json作ります。
- リッチメッセージに合わせて、
ResponseMessage
を継承したResponseSpeech
、ResponseImage
、ResponsePayload
などがそれぞれ用意されています。
MainService.java
@Slf4j
@Service
public class MainService {
private final Gson gson = GsonFactory.getDefaultFactory().getGson();
public String createFulfillmentJson() {
JsonObject urlJson = new JsonObject();
urlJson.addProperty("url", "https://hogehoge/audio/description.mp3");
JsonObject payloadJson = new JsonObject();
payloadJson.add("payload", urlJson);
payloadJson.addProperty("type", "audio");
JsonObject attachmentJson = new JsonObject();
attachmentJson.add("attachment", payloadJson);
JsonObject facebookJson = new JsonObject();
facebookJson.add("facebook", attachmentJson);
ResponsePayload responsePayload = new ResponsePayload();
responsePayload.setPayload(facebookJson);
List<ResponseMessage> messages = Collections.singletonList(responsePayload);
Fulfillment fulfillment = new Fulfillment();
fulfillment.setMessages(messages);
return gson.toJson(fulfillment);
}
}
参考
- いいサンプルがなかったのでSDKのテストコードを参考にしました。
FulfillmentTest.java - facebook側のAPIリファレンス
送信APIリファレンス