Bot Framework SDK for Javaで作ったWebアプリケーションとローカル環境で会話する

Botを開発できるBot Frameworkには現在4言語のSDKが用意されています。

![スクリーンショット 2021-05-03 12.53.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/ce1aa93d-e08e-8347-f653-704dc34bb382.png)

[Javaはまだプレビュー](https://github.com/microsoft/botbuilder-java/tree/4.6-preview6)ですが、[GitHubにサンプル](https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/java_springboot)があったので試してみました。

![スクリーンショット 2021-05-03 12.56.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/6c4a42a8-67ce-a1a9-d8f4-c9d5ce565be7.png)

# echo-botを起動する

試したのは入力したメッセージをオウム返しする「02.echo-bot」です。このサンプルはSpring Bootで実装されています。

https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/java_springboot/02.echo-bot

BotBuilder-Samplesをクローンして、「02.echo-bot」のフォルダを開きます。

```
git clone https://github.com/microsoft/BotBuilder-Samples.git
```

ビルドして

```
mvn clean package
```

実行します。

```java
java -jar /target/*.jar
```

すると以下の画面が表示されます。

![スクリーンショット 2021-05-03 14.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/615b8a8e-7c58-8127-e25f-50602818c929.png)

# Emulatorを準備する

今回はローカル環境で試すため、Emulatorをダウンロードします。

https://github.com/Microsoft/BotFramework-Emulator/releases/tag/v4.5.2
![スクリーンショット 2021-05-03 15.06.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/7064883c-7c83-e73a-d966-396ee5060e64.png)

実行すると以下のような画面が表示されます。

![スクリーンショット 2021-05-03 15.02.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/da6b1ddb-a875-24e1-a129-15ae78fe478f.png)

画面左下の設定（ギアマークのアイコン）をクリックします。

![スクリーンショット 2021-05-03 15.16.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/c1fd6942-692c-48e2-19ff-8783616316da.png)

[ngrok](https://ngrok.com/download)をダウンロードします。

![スクリーンショット 2021-05-03 15.06.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/48a44d60-09ca-5aea-4606-3cf0d33ec56b.png)

「Path to ngrok」にダウンロードしたngrokの実行ファイルのパスを指定します。

![スクリーンショット 2021-05-03 15.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/f9c343ab-5f8b-3ed4-d094-fba1ba52b7df.png)

Emulator起動後に表示された最初の画面を再度開いて、「Open Bot」ボタンでSpring BootのサンプルURLを設定します。

![スクリーンショット 2021-05-03 15.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/7351f0c6-307d-70c5-94ce-6535aa81b359.png)

設定は以上です。Emulatorにメッセージを入力するとオウム返しで同じメッセージが返ってきます。

![スクリーンショット 2021-05-03 15.14.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/47737/db6fce90-f007-8a71-0be0-01ee16395e1e.png)

# ハマったこと

最初ローカル環境で実行する際にはngrokは不要なのかなと（勝手に）思いこんでいて、「Path to ngrok」を空にしていました。そしてEmulatorでメッセージを入力すると以下のエラーが出て、原因がよくわからなくて困っていました。

```
POST 500 directline/conversations/<conversationId>/activities
```

Spring Bootでは以下のログが出ていて、ポート番号が異なるので、ngrokでトンネルしないだめなのかな？と試したところうまくいきました。

```
ERROR 11362 --- [          Bot-1] c.m.b.i.AdapterWithErrorHandler          : onTurnError

java.util.concurrent.CompletionException: java.net.ConnectException: Failed to connect to localhost/127.0.0.1:62833
        at java.base/java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:331) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:346) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture$UniApply.tryFire(CompletableFuture.java:632) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506) ~[na:na]
        at java.base/java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2088) ~[na:na]
        at retrofit2.CompletableFutureCallAdapterFactory$ResponseCallAdapter$2.onFailure(CompletableFutureCallAdapterFactory.java:123) ~[retrofit-2.5.0.jar!/:na]
```

以下のドキュメントをベースに進めていましたが、ngrok周りの設定が細かく出てこないのでハマってしまいました。

https://docs.microsoft.com/ja-jp/azure/bot-service/dotnet/bot-builder-dotnet-sdk-quickstart?view=azure-bot-service-4.0&tabs=vs

これをAzureのBot Serviceにデプロイしたいけど方法がわからない...と思っていたら以下に書いてありました。

https://github.com/microsoft/BotBuilder-Samples/tree/main/samples/java_springboot/02.echo-bot#deploy-the-bot-to-azure