【ハンズオン】賢いLINE Botをノンコーディングで開発する（Dialogflow＋Microsoft Flow）

※2019/3/23追記
Microsoft FlowのHTTP関係のコネクターが無料プランでは使えなくなってしまいました。
Microsoft FlowのPremiumアカウントかAzure Logic Appsを使えば作れますが、当初コンセプトにしていた「完全無料」ではできなくなってしまっています。
（現状、以下の記事は元のままになっています）


## はじめに
本記事では、ユーザーとの自然言語による対話が可能なLINE Botを完全無料＆ノンコーディングで作成する手順を紹介していきます。

ざっと読んでいただくだけでもいかに手軽に“賢い”LINE Botを作れるか知っていただけると思いますし、またこの記事にある手順通りに進めていただければ、プログラミングなしでのLINE Bot作成入門ハンズオンとしてお使いいただけます。

## LINE Botとその作り方について
LINE Botは、自分で用意したバックエンドの処理とMessaging APIを連携させて作ります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/fff59527-5934-71ad-cf60-141bd0b41f66.png" width="70%">

ユーザーと自由なテキストベースでの会話をさせるタイプのBotを作る場合、バックエンドでは主に

* ユーザーの入力を理解し適切な返答を行うための自然言語処理
* 返答に必要な処理（情報の検索や計算など）

を行います。
それぞれ、数多くのプラットフォーム/APIが登場しているため、さまざまな選択肢が存在します。
本記事では、それらの選択肢の中でも「完全無料」「ノンコーディング」にこだわった組み合わせとして、

* Googleが提供する「Dialogflow」
* Microsoftが提供する「Microsoft Flow」

の **“ダブルFlow構成”** による実装例を紹介します。
この組み合わせは完全無料なので、クレジットカードの登録だったり、一定利用以上での課金だったりが一切ありません。
しかも、ノンコーディングなのに結構なクオリティのBotが作れます。
この構成でいくつか罠があるので、順に説明していきます。

## Dialogflowとは
自然言語による対話サービスを作るためのプラットフォーム。
以前はapi.aiと呼ばれていたものですが、Googleによる買収後、現在の呼び名になりました。
最近ではスマートスピーカーGoogle Home向けのアプリを作る際にも使われます。

## Microsoft Flowとは
ノンコーディングでさまざまな処理フローを作成できるタスク自動化ツール。
豊富なトリガーやテンプレートでさまざまなサービスの連携を簡単に実現できます。
その実装はMicrosoft Azureのサービスである「Azure Logic Apps」と共通で、Azureがビジネス向けであるのに対してMicrosoft Flowは一般ユーザー向けのものとなっています。

## 作成するBotの仕様
今回作成するのは「BMIボット」です。
身長と体重を与え、BMIを算出してもらうというよくあるものです。
ユーザーの入力から必要な情報を抽出し、計算を行います。
BMIは身長と体重をもとに計算することができます。
情報が足りていない場合は、その入力をユーザーに促します。

## 用意するもの
* Webブラウザ
* LINEアプリの入ったスマホなど
* LINEアカウント
* Googleアカウント
* Microsoftアカウント

## チュートリアル（手順）
### 1. LINE DevelopersでのBotチャネル開設
#### 1-1. LINEアカウントでのログイン
まずは、[LINE Developers](https://developers.line.biz/ja/)のページから、LINEアカウントでログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/d669b675-db47-320f-67ee-c2281db63824.png)

#### 1-2. プロバイダーの作成
次に、プロバイダーを作成（またはすでに作成済みのプロバイダーを選択）します。
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/94a3eff2-15e1-0509-f4e8-fa93180d347e.png" width="80%">

プロバイダーは「サービス提供者（企業・個人）の名前」のことで、これから作成するBotの提供元となります。新規作成する場合は、お好きなプロバイダー名を入力してください。

<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/fb297ccc-4e6e-30ea-49a9-97b4a615e061.png" width="80%">
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/93b1c951-7ed6-8044-83f4-9ea4afbaddb3.png" width="80%">

#### 1-3. チャネル作成
続いて作成（選択）したプロバイダーに、これから作成するLINE Botのためのチャネルを作成します。
「Messaging API」の新規チャネル作成を行っていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/ccb9bce1-3995-cf63-76b6-46c3695995b5.png)

以下のように、必要な情報を入力してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e8e88271-c039-2244-5cc1-2ab17308db95.png)
プランについては、「Developer Trial」か「フリー」を選択できますが、今回はPush API（Botからユーザーに対してメッセージを送る機能で、有料プランかDeveloper Trialのみ利用可能）は使わず、Reply API（ユーザーからBotへのメッセージに対する返信をする機能で、フリープランでも利用可能）のみを使うので、どちらを選択しても構いません。

入力後、「入力内容を確認する」→情報利用について「同意する」→規約についてチェックを入れ「作成」と進みます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/062bd983-de20-717e-0904-78491473956f.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/30a818f8-0131-f999-152b-0e0534d9087f.png)

次に、Messaging API側でBotとして利用するための設定を行っていきます。
チャネル基本設定を開き、メッセージ送受信設定を変更していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/7f08394f-f4d2-0ec2-4757-d0fe04ad1c30.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/97e5d6a5-c102-69aa-c8c4-f74a24694aed.png)
まずはアクセストークンを発行します。「再発行」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/5f7dfdc1-b6f4-e3d8-4049-b200e51b7f53.png)

ダイアログが表示されるので、失効までの時間を「0」のままで（無期限となります）、「再発行」をクリックします。
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/2e368186-744b-c44f-3577-6514675bcc1b.png" width="300px">

続いて、LINE@機能についての設定を行います。
まず、「自動応答メッセージ」を「利用しない」にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/787b3155-f803-2a81-7385-9ee25ba6fecb.png)
この設定をしておかないと、Botにメッセージをユーザーが送ると、自動で定型メッセージが返ってきてしまいます。今回はユーザーの入力に合わせた返答をさせたいので、この機能は不要です。

次に「友だち追加時あいさつ」の設定です。こちらも無効化してもよいのですが、今回は “「BMIを教えて」「身長170cm、体重55kgのBMIは？」などのように話しかけてね！” というメッセージを設定しておきたいと思います。これにより、ユーザーがBotを友だち追加した際に、ユーザーはBotの使い方を知ることができるようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/6a3e0a63-100f-ffaa-01e7-cf34f486b297.png)
「設定はこちら」をクリックすると、LINE@ MANAGERの画面が開くので、認証をし、以下のように入力・保存してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e9386d88-c2a9-9fb2-c84b-a32ad9367c56.png)

LINE側の作業はいったんここで終わりです。
（LINE Developersのブラウザタブは閉じずにそのままにしておきます）

### 2. Dialogflowでのエージェント作成
続いて、自然言語処理を任せるDialogflowのエージェント作成を行います。
ここで作るエージェントを、いま作ったLINE BotのMessaging APIチャネルに接続することで、Botと自然言語での対話ができるようになります。

#### 2-1. Googleアカウントでのログイン
まずは、[Dialogflowのページ](https://dialogflow.com/)にアクセスし、Googleアカウントでログインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/d5447fd4-66ea-88bd-4e46-76e776ea17e7.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/1980557f-6d64-eb8b-7d04-c697bcdcf8a2.png)
アカウントのメールアドレスを入力し、
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e0161e8d-5597-5cf9-7bd0-bd17fadc15d8.png)
パスワードを入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/a5ad016e-ade9-540e-1412-41aa69da4e8d.png)
Dialogflowの利用にあたっての許可設定などを求められるので、以下のように進めます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/604773a2-ae6e-02b7-32ac-ec6cf799554a.png)

成功すると、Dialogflowの画面へ遷移するので、「CREATE AGENT」をクリックしてエージェント作成に進みます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/64ef7b58-fe1a-b0e1-5cdf-7df20555f945.png)

#### 2-2. エージェントの作成
エージェント作成では、エージェント名（ここでは「bmi-agent」）の入力と言語設定を行います。
その他の内容も確認し、「CREATE」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/6ed5629d-7397-0593-2b33-96f169124237.png)

#### 2-3. LINE Botとの接続
作成したエージェントを、さきほど作成したMessaging APIのチャネルとDialogflowを接続させます。
Dialogflowには、LINEのMessaging APIと接続するためのコネクターが用意されています。
「Integrations」からLINEのトグルスイッチをONにします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/5c2e7c71-70fe-22ca-7cd1-b888a353194a.png)

するとLINEとの接続をするための設定ダイアログが開くので、LINE Developersの画面に戻り、「Channel ID」「Channel Secret」「アクセストークン」のそれぞれの値をコピーしてきてDialogflow側の設定項目に貼り付けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/7245f054-194f-16e4-5b9b-52fc184bc721.png)
反対に、Dialogflow側のURLをコピーし（上記の「Webhook URL」のクリップボードアイコンをクリックすることでコピーできます）、LINE Developersのチャネル設定の「Webhook URL」へ貼り付けて「更新」します。このとき、テキストボックスからは「https://」を消すのを忘れないでください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/d0494ec6-dd01-29c6-d29f-d39bcd2a3f0e.png)

次にWebhook送信を「利用する」に変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/70b76917-0d17-ea57-ef83-9468180cffab.png)
これはLINE Botに必須の設定で、ユーザーからBotに送られたメッセージなどの各種イベントの情報を開発者が用意したサーバー（今回はDialogflowがそれにあたります）に送るためのものです。
※2019/2/18追記：Webhook URLを設定する前に変更しようとしても「利用しない」に戻ってしまうので、必ずWebhook URLを設定してから変更してください

Dialogflow側で「START」をクリックしたら、接続完了です。

#### 2-4. 動作確認
LINE Developersにある「LINEアプリへのQRコード」をスマホで読み取り、自分のLINEアカウントへBot友だち追加します。
ここまでの設定が問題なくできていれば、設定した友だち追加時のメッセージが送信され、あいさつや「わかりませんでした」といったやりとりをDialogflowがもつ会話機能で行うことができます（BMI計算はまだやってくれません）。

<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/5e7791b7-2cda-8897-6916-1257d112cd94.png" width="300px">

もしこのように応答してくれなければ、ここまでの設定をもう一度確認してみてください。

#### 2-5. BMI計算インテントの設定
それでは、ユーザーからのBMI計算指示を理解してくれるようDialogflowに設定をしていきます。
Dialogflowでは自然言語を処理するために、エージェントに対してあらかじめ「インテント」と「エンティティ」を登録して学習させることで、ユーザーの自然言語の入力を適切に解釈してくれるようになります。

「インテント」とは「意図」のことで、エージェントに行わせたいこと（指示内容）を意味します。
今回はBMI計算を行わせたいので、ユーザーの発言が「BMI計算」の意図であるかどうかを判定する必要があるため、「BMI計算」というインテントを登録します。
「エンティティ」はユーザーの発言のうち、インテント解釈に意味のある単語のことです。BMI計算においては、計算に必要な「身長」と「体重」の数値が重要な要素となるので、エンティティとして認識してもらう必要があります。これらは単純な数値なので、独自のエンティティを登録せずともDialogflowに初めから用意されている数値エンティティ（@sys.number）が使えます（よく例に挙げられるピザ注文のBotなどを作る場合には、注文可能なピザやトッピングの種類などを独自のエンティティとして登録してあげる必要があります）。

「Intents」から「CREATE INTENT」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/77b1a9f7-6ae6-692b-5415-6711a24c66af.png)

「Intent name」に「calc-bmi」と入力し、「ADD TRAINING PHRASE」をクリックし、BMI計算指示として認識してほしいフレーズ（ユーザーからの入力内容）をエージェントに学習させていきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/bdd6e994-6d61-9214-c25e-fb96545c5df2.png)

学習させたいフレーズとして、まず「身長170cm、体重70kgのBMIを教えて」と入力します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/3da9b6b7-5b74-c23f-c592-b22a0f739e51.png)
Enterを押すと、以下のように「170cm」と「70kg」がハイライトされます。これは、Dialogflowが自動で「この部分がパラメータである」ことを識別してくれていることを示します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/37595f17-844f-b027-090c-3b473b161eaf.png)
しかし今回は単位の部分はcmとkgで固定として処理させたいので、単位を除いた数字の部分だけをパラメータとして認識するよう、範囲をマウスで調整します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/9bbbe8d2-25ff-9d84-30b7-59277055df9c.png)

次にその下の「MANAGE PARAMETERS AND ACTION」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/1111212b-e212-dd9e-f48e-f336ab6c467d.png)

するとこのようにさきほどの身長・体重のパラメータに対応した項目が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e286d7de-098a-c7c2-576a-a6a30513db9d.png)

ここで、以下のような入力・設定を行います。

* 「action name」として「calc-action」と入力
* パラメータ名を変更（入力したフレーズと対応するよう色を確認して身長は「height」、体重は「weight」とする）
* どちらも「REQUIRED（必須）」にチェックを入れる
* 「PROMPTS」が設定できるようになるので「身長を教えてください。」「体重を教えてください。」と設定
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/1dc3fa06-1d54-d28c-f50e-d7f185fe57c8.png)
ここで設定する「PROMPTS」は、ユーザーからのBMI計算指示に身長や体重の情報が含まれなかったときにエージェントが情報を聞き返すときのメッセージになります。つまり、これを設定しておけばエージェントは何往復かの会話のなかで必要な情報を集めてBMIを計算してくれるようになります。
なので、単純に「BMIを教えて」とユーザーが発言した際には「身長を教えてください。」と不足する情報を追加で聞いてくる動きをしてくれます。
これを踏まえ、「Training phrases」に数パターンのフレーズを追加しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e31f8bbf-6ad2-6187-2051-3bfb820ef4a5.png)
数値や単位の有無、日本語の表現などを変えて登録します。
このとき、入力した数値が身長・体重どちらのパラメータとして認識してほしいかが正しいかどうか確認してください。もし違うほうに認識されていたら、フレーズ内の数値をクリックし、正しいパラメータを選択しなおします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/510f872b-f9a1-7d49-49e2-c64840a17a0f.png)

ある程度フレーズが登録できたら、いったんここで右上の「SAVE」をクリックします。
インテントが保存され、自動で学習が始まります。右下に「Agent training completed」と表示されたら完了です。
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/8b3af12c-f8f5-de24-61b7-d53e0e447d55.png" width="300px">

#### 2-6. Fulfillmentの設定
Dialogflowでは、自然言語による会話に外部のAPIなどのサービスを連携させる「Fulfillment」という機能が用意されています。
今回はBMIの実計算処理を外部サービス（Microsoft Flow）に任せるので、このBMI計算インテントでFulfilmentをONにしておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/a5fb4897-36ad-3fce-c221-ad903673a3f4.png)

#### 2-7. 会話の確認
では、狙った通りに会話してくれるかどうかを確認します。
LINEが接続済みなのでLINEでも会話確認できますが、Dialogflowのテストコンソールで確認していきます（このあとのBMI計算ロジックとの接続エラーなどはこちらからでないとできない）。

画面右上の「Try it now」に想定される内容を入れ、応答が正しく返ってくるかみてみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/b93c7f0d-b09f-6ead-0603-b2a9832857f7.png)

さまざまな表現で入力を行っていき、もし想定通りの応答にならなければそのフレーズをIntentsのTraining Phrasesに追加し学習させることで認識精度を上げていくことができるので、どんどんエージェントを賢くしていくことができます。

ある程度の精度が確認できたら、Dialogflowでの作業はいったん終了です。
最後の会話確認では、BMIを計算させる段階、つまり身長と体重を伝えた状態のままにしておいてください（この結果をあとで使います）。

### 3. Microsoft Flowでのフロー作成
仕上げとして、今回のBotでやりたいことであった「BMI計算」の処理を作成します。
Dialogflowには簡易のスクリプトを記述してこういった処理を登録する機能がありますが、そこではプログラミング言語（JavaScript/Node.js）を用いる必要があるため、非プログラマーの方には少々ハードルが上がってしまいます。
そこで今回はノンコーディングできる手段として、視覚的にブロックを組み合わせてフローを作成するサービス「Microsoft Flow」を組み合わせてみます。

#### 3-1. Microsoftアカウントでのログイン
[Microsoft Flowのページ](https://flow.microsoft.com/ja-jp/)より、Microsoftアカウントでログインします（過去にMicrosoft Flowを使ったことがあれば「サインイン」、初めてであれば「サインアップ 無料」からMicrosoftアカウントで使用しているメールアドレスを入力してください）。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/f744db4a-8e04-87b6-381d-9e296878f3bd.png)
初めての場合以下の画面が表示されるので、「開始する」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/d57774d5-a3b2-ed37-9248-46817039484c.png)

#### 3-2. HTTPリクエスト/レスポンスのフロー作成
Microsoft Flowに入れたら、「マイフロー」に遷移します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/a0ba7c35-4e3f-d6ce-6d49-608ed2cd1a3b.png)

「新規」→「一から作成」をクリック、次の画面でもう一度「一から作成」をクリックし、フロー作成に入ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/dc64666c-d51d-5739-64a2-99835b03b9c0.png)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/8a8a37fc-27b0-1767-37a0-022e1c54aedb.png)

HTTPトリガーを作成します。これによりWeb APIのようにURLアクセスでフローを使用することができるようになります。
検索欄に「HTTP」と入力し、トリガーの「HTTP要求の受信時」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/eeccf8d5-3a17-597d-d594-84180359c8e6.png)

するとこのようになります。
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/2dc56a21-f78a-b7a7-56b2-0ffd83ddca4f.png" width="480px">

ここで作るフローはDialogflowからのJSON出力を受け取り、以降の処理に使います。
Microsoft FlowではWeb APIの入出力フォーマットとして主流のJSON形式の入出力を簡単に扱うことができるようになっています。

まず、DialogflowからどのようなJSONが引き渡されるのか、出力結果を取得します。
さきほどの会話確認の画面で、BMI計算をする段階（パラメータがすべてそろった状態）まで会話をし「DIAGNOSTIC INFO」をクリックします。
すると以下のようにJSONが表示されるので、「COPY RAW RESPONSE」をクリックしコピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/e70c8f0e-c4c8-46b6-215e-3ae52d1ccd95.png)
※このJSONの中に、計算に使う身長と体重の数値が含まれていることを確認しておいてください

コピーしたJSONを、Microsoft Flowでさきほど作成したHTTPトリガーのブロックにある「サンプルのペイロードを使用してスキーマを生成する」をクリックして出てきた入力欄に貼り付け、「完了」をクリックします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/dd500511-edef-6e41-3fcf-aec84a96b9f1.png)

これにより、Microsoft FlowがDialogflowからどのようなデータを受け取るかを理解し、このあとのフローでそのデータに含まれる項目を細かい単位で使っていくことができるようになります。

#### 3-3. Dialogflowへのレスポンス処理の作成と接続
HTTPトリガーのブロックの下にある「新しいステップ」をクリックし、「組み込み」の下のほうにある「応答」アクションを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/3b15a505-a23d-d940-7ade-09174ca64ddc.png)

このアクションではDialogflowから受け取ったリクエストに対するHTTPレスポンスを定義します。
DialogflowにはここでBMIの計算結果を返したいので、このレスポンスの本文で、計算処理を行います。
状態コードは `200` のままで、ヘッダーには キー: `Content-Type` 、値: `application/json; charset=utf-8` を入力します（これを入れないと文字化けする）。
本文には、

```
{
  "fulfillmentText": "あなたのBMIは です。"
}
```

と入力しておきます。いったん、この状態で保存しましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/07ff0aaf-0627-0c76-efd0-796630a76917.png)

すると一番上のブロックの中にこのフローを呼び出すためのURLが生成されているので、これをコピーします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/3190722c-b378-e9d6-e36f-df237962048f.png)

これをDialogflow側に設定します。
このとき、URLの中にある「%2F」→「/」に変更してあげます。
※参考：[DialogflowからMicrosoft Flow（Azure Logic Apps）を呼ぶ際の注意点](https://qiita.com/himarin269/items/3e521b3685e380605a44)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/8362adca-13ed-2328-fa7e-12f20b5f5cce.png)

設定ができたら、Dialogflowでテストを行います。
以下のように、設定したレスポンスが確認できればOKです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/5717c3cd-039b-3264-4a53-8c7ec1c3c96c.png)

#### 3-4. BMI計算処理の作成
では、計算処理を作っていきます。
Dialogflowから受け取ったJSONのデータを使うのですが、JSONを解析した結果を手軽に扱うことができるMicrosoft Flowの強みです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/34d91b04-148c-5384-f738-1ed3ab944feb.png)
このように、「動的なコンテンツ」としてJSONの解析結果を項目ごとにマウス操作だけで使うことができるので、コードで書くよりはるかに楽にJSONデータを扱えます。

今回はBMI計算なので、「height」「weight」を計算します。
BMIの計算式は **BMI＝体重（kg）÷ 身長（m）の2乗** ですが、Microsoft Flow上では四則演算を行う際に関数を使う必要があり、少し面倒です。

使える関数はたくさんあり、四則演算は「数学関数」のところにあります（掛け算割り算は「もっと見る」をクリックすると出てくる）。
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/d1cf68ef-a43e-6e63-e249-55d8711f6acb.png" width="300px">

掛け算は `mul(a, b)` 、割り算は `div(a, b)` です。

今回身長はcmで入力されるので、先に体重を10000倍し、身長(cm)を2回割り算してあげる、という形で計算します。

```python
div(div(mul(triggerBody()?['queryResult']?['parameters']?['weight'],10000),triggerBody()?['queryResult']?['parameters']?['height']),triggerBody()?['queryResult']?['parameters']?['height'])
```
複雑な式にはなってしまっていますが、関数と「動的なコンテンツ」内のJSON解析結果をクリックしていくだけで作ることはできます。Excelで式を作っていくときと同じ感覚ですね。
（もちろん、「式」のところに上記をコピペしてもOKです）

![image.png](https://qiita-image-store.s3.amazonaws.com/0/194664/bdfdb252-704d-3975-5997-2042e10b11a8.png)

式ができたら、「保存」を押して完成です！

### 4. 最終動作確認
いよいよ、最終動作確認です。

まずはDialogflow上でのテスト。
<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/6789c0ec-8203-aa81-0de6-fd5b5e047080.png" width="300px">

そしてLINEでの確認。

<img src="https://qiita-image-store.s3.amazonaws.com/0/194664/9ddcde39-5692-6127-8866-72349f898dae.png" width="300px">

ばっちり動きました！

### 5. 発展例
Microsoft Flowでは条件による分岐なども作ることができるので、BMIの計算結果によって「やせすぎ」「肥満」などのメッセージを付加することも簡単にできます。
この記事では紹介しませんが、より高度なBotを作ることも可能です。

また、DialogflowでもBMI計算のインテントしか作りませんでしたが、その他のインテント（BMI関連なら標準体重を知りたい、とか）を追加することもできます。新しくインテントを作成する場合は、Microsoft Flowのフローのはじめのほうにインテントによる分岐を追加して新しい処理を増やせばOKです。

## おわりに
“ダブルFlow構成”による完全無料・ノンコーディングのLINE Bot開発のチュートリアルは以上です。
DialogflowとMicrosoft Flowはそれぞれ非常に使い勝手がよく、プログラマーでなくとも使うことができてしまうサービスです。

DialogflowもMicrosoft Flowも外部のサービスとの連携ができるようにはなっているものの、それぞれ細かい部分で差が出て、連携させる際に苦労する部分が若干ありました（GCP内、Azure内のサービス同士ならもっとスムーズに連携できる）。

今回紹介した手順通りに進めればうまく連携できるはずなので、ぜひ本記事を参考にお手軽LINE Bot開発を試してみてください。