Azure Bot Service で LINEから事前登録＆顔パスシステムを作ろう！(2) Azure Bot Service 編

チャットボットで名前や顔写真を事前登録しておくことで、イベント会場で顔パス(顔認証)できたら、きっと便利！
今回は LINE × (Azure Bot Service + Azure Logic Apps + Azure Cognitive Services Face API) + PowerApp を使って、事前登録チャットボット & 顔認証アプリ を作ってみます。

- (1) [Azure Logic Apps 編](https://qiita.com/annie/items/8d0d2ed9d6b30278f7fc)
- **(2) Azure Bot Service 編** ←イマココ

# 準備

- Azure サブスクリプション & Face API
    - [**(1) Azure Logic Apps 編**](https://qiita.com/annie/items/8d0d2ed9d6b30278f7fc) で作成、利用したアカウント、サービスをそのまま使用します
- Bot Framework Composer
    - チャットボットを GUI で作成できるデスクトップアプリです
    - リンク ( [Win](https://aka.ms/bf-composer-download-win) | [Mac](https://aka.ms/bf-composer-download-mac) | [Linux](https://aka.ms/bf-composer-download-linux) ) からダウンロード、インストールしておきます
- [**(1) Azure Logic Apps 編**](https://qiita.com/annie/items/8d0d2ed9d6b30278f7fc) で作成した、チャットボットから起動するワークフロー。**HTTP Post URL** をローカルに保存しておきます
- LINE Messaging API の利用準備を行った LINE チャンネル 

# 手順

## 1. Bot Framework Composer から新規チャットボットを作成する

Bot Framework Composer を起動します。**+ Create New** をクリックして新規チャットボットを作成します。

![LINERegiBot202108_BotComposer_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ca89cbdf-a85e-daeb-ae02-1ef60a5ea745.png)

**Select a template** 画面で **#C** **Empty Bot** を選択して、**[+次へ]**をクリックします。

![LINERegiBot202108_BotComposer_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/233192b9-b7dc-6403-18da-cc227f31c00a.png)

**名前** は自分で識別しやすいもの (ここでは **LINERegiBot20210818**) を入力して **[作成]** をクリックして作成します。

![LINERegiBot202108_BotComposer_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d7c8cbd2-6a66-b440-5c06-de1bc5be63df.png)


新規チャットボットが作成されると、チャットボットのフローや動作を設定する画面が表示されます。
画面左側の ダイアログ一覧 から **案内** (Greeting) をクリックして選択します。

![LINERegiBot202108_BotComposer_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/044eaf9f-c58d-e581-9d5c-76402eca033f.png)

**Greeting** のダイアログで行われるフローや操作が表示されます。この Greeting ダイアログはチャットボットが起動したときにデフォルトで起動するダイアログになります。
画面中央のフローから **Send a response** をクリックします。

![LINERegiBot202108_BotComposer_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/123e32cb-6410-ad72-cef2-9e9317a4303c.png)


この **Send a response** は初めてユーザーがチャットボットに接続したときに動作するアクションで、ユーザーへメッセージを送信します。画面右列の **Send a response** ペインの *応答* の欄をクリックして、メッセージをお好みのものに変更します。入力が終わってポイントが外れると内容は自動保存されます。

![LINERegiBot202108_BotComposer_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ccc7797a-f614-f7a5-6731-570c9abea9d1.png)

## 2. チャットボットに新規ダイアログ、アクションを追加する

初期メッセージを表示した後、ユーザー名や顔写真を登録するダイアログを追加していきます。
案内(Greeting) ダイアログのフローの一番下にある **(+)** をクリックします。

![LINERegiBot202108_BotComposer_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/4e9ea1bd-58a8-9dff-7664-14fe17989e08.png)

表示されるメニューから **ダイアログの管理** > **新しいダイアログの開始** をクリックして選択します。

![LINERegiBot202108_BotComposer_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/66fa4fb8-2a33-43de-6641-e8277e935df8.png)

画面右側に表示される **新しいダイアログの開始** ペインにある **Dialog Name** の欄をクリックし **+新しいダイアログの作成** をクリックして選択します。

![LINERegiBot202108_BotComposer_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/3ad97f1c-f7d1-72bc-32b3-fb9ce942ec93.png)

**ダイアログの作成** 画面が表示されたら **名前** に **StartMenu** と入力、**[OK]** をクリックして作成します。

![LINERegiBot202108_BotComposer_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a906d119-0fe4-bd97-25fc-682c0b9d78c7.png)

作成した **StartMenu** ダイアログが画面に表示されます。画面左側のダイアログ一覧から **StartMenu** の下にある **BeginDialog** をクリックしてフロー画面を表示します。

![LINERegiBot202108_BotComposer_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/81565e0c-3e55-172d-46d1-6cc9b11048d6.png)

画面中央に表示されるフローにアクションを追加していきます。まずは登録者の名前を聞くためのプロンプトを作成します。フローに表示されている **(+)** をクリックします。

![LINERegiBot202108_BotComposer_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/546e9656-d4ff-52c5-be24-9de3fc1a561b.png)

表示されるメニューから **質問する** > **テキスト** をクリックして選択します。

![LINERegiBot202108_BotComposer_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/718f6cb6-0e0d-1953-761d-b88eec86b29c.png)

画面右側に表示される **Prompt for text** ペインで Bot Response - 応答 に入力を依頼するメッセージを入力します。**Add alternative** をクリックします。

![LINERegiBot202108_BotComposer_14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/c0d6c19a-d597-c6ce-0391-a18d435567d5.png)

ここでは **登録する人の名前を入力してください** という趣旨のメッセージを入力しておきます。

![LINERegiBot202108_BotComposer_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/586c159e-854f-7af5-630a-2d82ca6660fd.png)

**Prompt for text** ペインで **ユーザーによる入力** タブをクリックします。**Property** の欄に **user.name** と入力します。これによりユーザーの入力が user.name というオブジェクトに格納されます。

![LINERegiBot202108_BotComposer_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/3312b77d-fa1e-fbf8-1e1d-9d36fcbe5475.png)

同様に、画面中央のフロー にある **(+)** をクリックして、今度は **質問する** > **ファイルまたは添付ファイル** をクリックして選択します。

![LINERegiBot202108_BotComposer_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e36dfd84-bdf0-9fce-dfae-adcb6d223668.png)

**ファイルまたは添付ファイルの入力を求める...** ペインで、顔写真を送るよう依頼するメッセージを入力します。**登録する人の顔が良く分かる写真を送ってください** としておきます。

![LINERegiBot202108_BotComposer_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/598fd7ae-14fd-e6f2-e7e1-8b0301f6ce6f.png)

**ファイルまたは添付ファイルの入力を求める...** ペインで **ユーザーによる入力** タブをクリックして、**Property** の欄に **user.attachment** と入力します。これによりユーザーから送られてくるファイル(顔写真)情報が user.attachment に格納されます。

![LINERegiBot202108_BotComposer_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b0a564e4-ad41-e3d8-45f4-8cbfd9ba79e7.png)

画面中央のフロー にある **(+)** をクリックして、今度は **外部リソースに悪セ氏** > **HTTP 要求の送信** をクリックして選択します。

![LINERegiBot202108_BotComposer_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/c3015e44-d534-d50e-f341-dc001e25566e.png)

画面右側に表示される **HTTP 要求の送信** ペインで 以下の情報を入力します。

- HTTP method : **POST**
- URL : ローカルに保存しておいた Azure Logic App の URL
- Body : **= { 'userName': user.name, 'attachment': user.attachment}**

> HTTP リクエストに対するレスポンスは (デフォルト設定のままで) turn.results に保存されます。

![LINERegiBot202108_BotComposer_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7311cf61-35cb-5bcf-ee96-70057ab2472b.png)

フローの次の操作を **(+)** をクリックして追加します。**条件の作成** > **分岐: if/else** をクリックし、HTTP リクエストのレスポンス (ステータスコード) によって処理を分岐します。

![LINERegiBot202108_BotComposer_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/704932e8-43ec-8e45-326d-ee4ed976093d.png)

画面右側に表示される **分岐: if/else** ペイン の Condition の欄に **turn.result.statusCode == 200** と入力します。

![LINERegiBot202108_BotComposer_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/f67086fd-3db1-2327-042b-ce5a88f81bfe.png)

フロー分岐の **True** 側にある **(+)** をクリックして、**応答の送信** を選択し、レスポンスコード 200 (正常終了)の場合の応答メッセージを設定します。

![LINERegiBot202108_BotComposer_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/008baaa4-70cc-a10d-b421-57091bc8d9e8.png)

**Send a response** ペインの応答欄に **登録完了しました** という旨のメッセージを入力します。

![LINERegiBot202108_BotComposer_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d1a027de-9731-291d-1d79-c2bca3e70d5f.png)

同様に、フロー分岐の **False** 側の **(+)** をクリックして、**応答の送信** を選択し、**登録失敗しました** という旨のメッセージを設定します。

![LINERegiBot202108_BotComposer_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/3f1240ed-09ad-3b19-dc10-5c87e76e07c4.png)

データの処理が終わったら、user.name と user.attachment の情報を削除しておきます。
フロー上にある **(+)** をクリックして **プロパティの管理** > **プロパティの削除** を選択します。

![LINERegiBot202108_BotComposer_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/32c1504e-526d-a725-cf1c-67bc5b783bc4.png)

**プロパティの削除** ペインで Property の欄に **user.name** と入力します。

![LINERegiBot202108_BotComposer_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a438c179-29fa-196f-0a06-96ee7eb00192.png)

同様に再度フロー上にある **(+)** をクリックして **プロパティの管理** > **プロパティの削除** を選択、**user.attchment** のプロパティを削除します。

![LINERegiBot202108_BotComposer_29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b3fed858-3405-0060-1efc-7c10a6e62bb5.png)

最後に、再度ユーザーから話しかけられたときにこの StartMenu ダイアログを呼び出せるように設定しておきます。

画面左側のダイアログ一覧から **不明なインテント** をクリックします。
画面中央のフローにデフォルトで設定されている **Send a response** をクリックして、最初の応答メッセージを適切なものに書き換えます。
 
![LINERegiBot202108_BotComposer_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/2efdbd7d-55b6-fc21-b081-9400782758d1.png)

フロー上にある **(+)** をクリックして **ダイアログの管理** > **新しいダイアログの開始** を選択します。

![LINERegiBot202108_BotComposer_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/f297e6b7-64a2-b76b-8f5c-9ee1efe8fa60.png)

画面右側に表示される **新しいダイアログの開始** ペインにある **Dialog Name** に **StartMenu** を選択して設定します。

![LINERegiBot202108_BotComposer_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/87159128-36c2-d519-156b-8e2c5cde8233.png)


## 3. Bot Framework Composer でチャットボットの動作を確認

作成したチャットボットは Bot Framework Composer 内で動作を確認することができます。
Bot Framework Composer の上部バー右上にある **[▷ Start Bot]** をクリックして、ローカルでチャットボットを起動します。

![LINERegiBot202108_BotComposer_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7e6370ae-4f93-9129-0697-ee7d968edefa.png)



> チャットボットの通信がファイアウォールでブロックされているメッセージが出る場合は、適時アクセスを許可します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a5cb0fbf-e850-8eb9-e556-beb758992e88.png" width=50%>

ボットが起動してローカルランタイムマネージャーが表示されたら、**[Web チャットを...]** をクリックして チャット画面を表示します。

![LINERegiBot202108_BotComposer_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/e2c73975-93cd-7ba1-ee19-6d38b74d5abe.png)

画面右側に表示されるチャット画面で入力を行い、チャットボットの挙動を確認します。登録完了のメッセージが表示されたら完了です。

![LINERegiBot202108_BotComposer_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ba2a76b6-9199-dd7d-0a91-195539160b0c.png)

## 4. Bot Framework Composer から Azure Bot Service に発行

Bot Framework Composer で作成したチャットボットアプリを Azure Bot Service に直接発行 (デプロイ) します。

左列メニューの **公開** (クラウドアイコン)　をクリックします。**Publishing Profile** タブを選択、**新規追加** をクリックして 公開プロファイルを作成します。

![LINERegiBot202108_BotComposer_37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/751e9fc4-c98a-cc8f-b860-c07764a454f6.png)

**Creating a publishing profile** 画面で、以下を設定して **[次へ]** をクリックします。

- **名前** : お好みの分かりやすい名前をものを入力
- **発行先** : **Publish bot to Azure** を選択

![LINERegiBot202108_BotComposer_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/a6c072fb-5af9-7bea-4386-acf57570af91.png)

Azure へのサインインダイアログが表示されたら、お使いの Azure サブスクリプションを利用できるユーザーアカウントでサインインを行います。

**Creating a publishing profile** 画面(その2) で、**Create new resources** をクリックして、必要なリソースを新規作成します。**[Next]** をクリックして進みます。

![LINERegiBot202108_BotComposer_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/08ff220b-8ac7-0091-2fb3-ea55f3633bb7.png)

**Configure resources** 画面で、作成するリソースの情報を以下のように設定します。

- **Subscription** : ご利用中の Azure Subscription を選択
- **Resource Group** : (1)Azure Logic App 編で作成したリソースグループ、または新規作成してお好みの分かりやすい名前を入力します
- **App Service** : 今回のチャットボットのベースは C# なので **Windows** を選択(デフォルト)
- **Resource details**
    - **name** : Azure Bot Service の名前としてお好みの分かりやすい名前を入力 (ここでは **LINERegiBot20210818**)
    - **Region** : 東日本(japaneast)
    - **LUIS region** : 米国西部 (※今回は作成しませんので選択肢から適時選ぶのみでOK)

**[Next]** をクリックして次のステップに進みます。

![LINERegiBot202108_BotComposer_40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d91010c1-1982-a244-9159-7738efe966a0.png)

**Add resources** 画面で、追加で作成するリソースを選択します。
今回は最小セットで動かしますので、**外せるチェックボックスをすべて外します**。隠れているところも忘れずに。**[Next]** をクリックします。

![LINERegiBot202108_BotComposer_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/860c780e-677d-190f-812d-1aa0c1efc4e9.png)

**Review resources to be created** 画面で作成する Azure リソースの最終確認を行います。変更がなければ **[Create]** をクリックして作成します。

![LINERegiBot202108_BotComposer_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d74b923d-e0b6-6e4b-2b6a-41ef7db4326e.png)

しばらくして **[プロビジョニングの成功]** と表示されたらリソースの作成は終了です。
**[公開]** タブをクリックしてチャットボットアプリの公開に進みます。

![LINERegiBot202108_BotComposer_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/7707f989-888d-8bd1-f91a-a450fea768d7.png)

ボットの チェックボックス☑ をオンにして、ターゲットには前の手順で作成したプロファイルを選択します。**選択したボットを公開する** をクリックして、チャットボットアプリの公開手順に進みます。

![LINERegiBot202108_BotComposer_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/50988019-451b-6ece-5251-0ed5a133428c.png)

**[公開]** 画面で **[OK]** をクリックすると、チャットボットアプリが Azure リソース上に公開 (デプロイ) されます。

![LINERegiBot202108_BotComposer_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/fc67feed-f92f-277f-e381-dfb2ca8c901b.png)

**ボットの公開** 画面で 状態が **✓**, **Success** と表示されたら公開完了です。

![LINERegiBot202108_BotComposer_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/ce138296-3dc0-4384-228d-d09da2bc222c.png)

[Azure Portal](https://portal.azure.com) でリソースを作成、公開したリソースグループを開き、リソースが作成されていることを確認してください。

![LINERegiBot202108_BotComposer_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/be6ee1cf-6a48-af0a-8740-5b0d76817d12.png)

チャットボットを公開した Azure Bot Service を開きます。
左列メニューから **Web チャットでテスト** をクリックします。

![LINERegiBot202108_BotComposer_48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/54be3a10-832e-7404-b9a8-3d6c4246851b.png)

チャット画面で入力を行い、チャットボットが Bot Framework Composer 上と同じ動作になるのが確認できます。

![LINERegiBot202108_BotComposer_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/d5c8a971-3a84-f8ad-cd72-54eef10f3066.png)

今度は Face API を操作する Azure Function App (ここでは **LINERegiBot20210818Logic**) を開きます。チャットボット画面での入力が反映されてログが残っていることが確認できます。ログをクリックします。

![LINERegiBot202108_BotComposer_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/c0ffb4ec-b5bd-be36-6ccc-3b5e14e2455e.png)

正しく Logic App が稼働し、公開したチャットボットから ContentUrl (添付ファイルの画像URL) を正しく取得して Face API に登録できていることが確認できます。

![LINERegiBot202108_BotComposer_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/b059ad61-ef6a-f600-b9b0-98b81143486f.png)

## 5. Azure Bot Service と LINE Messaging API の接続

公開した Azure Bot Service を LINE Messaging API に接続し、LINE からチャットボットを呼び出しできるようにします。

LINE Developer Portal で　Azure Bot Service のチャットボットを接続するアカウントを表示し、チャンネルシークレット および チャンネルアクセストークンをコピーします。

![LINERegiBot202108_BotComposer_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/4a2ccaaf-ddc4-5683-8aba-6f2edc3afb5d.png)
![LINERegiBot202108_BotComposer_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/77003192-bc5a-1f4d-6de2-5a65b3b606ba.png)

Azure Portal からチャットボットを公開した Azure Bot Service (ここでは **LINERegiBot20210818** )を開き、左列メニューから **[チャンネル]** を選択、表示される **チャンネルに接続** 画面で LINEのアイコンをクリックします。

![LINERegiBot202108_BotComposer_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/f6ed546b-9273-aea1-92c8-e4585aa3ab88.png)

コピーしたチャンネルシークレットとチャンネルアクセストークンを貼り付けて *[保存]* をクリックして設定を保存します。**Webhool の URL** をコピーします。

![LINERegiBot202108_BotComposer_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/5afd432b-6ed8-502c-7d6e-791e405215f9.png)

LINE Developer Portal に戻り、**Messaging API 設定** にある **Webhook URL** に Azure Portal からコピーした URL を貼り付けて保存します。保存した後、**[検証]** をクリックして OK (200) と表示されたら設定は完了です。

![LINERegiBot202108_BotComposer_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/89507232-e0fb-d7e3-fbb2-e274c805d559.png)

LINE から アカウントを追加して、動作を確認します。Azure Bot Service 上と同じ動作となることが確認できます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117583/59da0247-8453-3332-6933-566f4bbfad4e.png" width=30%>