Workato：1つのアクティブレシピで対話型ボット（Workbot）を動かす

# はじめに
Workatoを利用して対話型のSlack Botを構築する場合、通常は3つのアクティブレシピ（課金対象レシピ）必要となります。

https://docs.workato.com/workbot/using-dialogs-with-workbot.html#using-dialogs-with-workbot

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/405d89e7-f8ed-cad6-08f3-3130a4a9619a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e928205e-0cc6-c169-7a7d-91ba266ad799.png)

しかし、Recipe functionsを利用することで、1つのアクティブレシピで対話型のSlack Botを実現することが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3f6a737d-3b47-717c-3498-70b139063c06.png)

# 手順
※過去にまとめたメモからの書き下ろしであるため、一部Callable Recipeに関する内容となっている場合があります。Callable RecipeはRecipe functionsへ読み替えてご対応ください。

## １．アクティブレシピの用意
以下のように、Slackコマンドをトリガーとするレシピを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e3dbc459-f395-4f41-5fa0-241d1f987302.png)

## ポイント
### １）ボットの一連の処理で利用するパラメータを全て定義する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/302a1d86-dfe6-787e-bb71-b201ba560d1a.png)

### ２）各パラメータの条件にOptionalは「Yes」、Prompt users for this input?は「No」を必ず含める
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/e0a350a6-24cc-3a6e-8f36-26cfe2d8aae6.png)

### ３）ボットの処理条件を定義する
３）ボットの処理条件を定義する

### ４）呼び出し先となるRecipe functionsに対して、条件に応じたトリガーおよびアクションの値を渡す
※Recipe functions側にはInput Schemaをあらかじめ定義しておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/dbaa43fb-fc10-2bec-96f2-b345297034e8.png)

呼び出し先のRecipe functionsで条件ごとに異なる処理をさせたい場合は、条件フラグとなるパラメータをCallable Recipeで定義し、本レシピで値をセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/64475bbc-6f45-5cab-d5b6-2822328148d0.png)

ボットからチャンネル（あるいはWorkbotアプリ）に対してメッセージを送信する必要がある場合は、Callable Recipeにチャンネルをセットするためのパラメータが必要です。

Workbotアプリにメッセージを送信する場合は、トリガーの「Channel/DM」をここにセットします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/c5092de3-2835-1256-dcd8-a9332b566d8d.png)

ダイアログを利用する場合は、TriggerIDとCallback IDをCallable Recipeに渡す必要があります。また、Recipe functionsにもこれらのパラメータを定義しておく必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/8960e036-ef34-8f05-c7d8-b3889ec055c3.png)

## ２．Recipe functionsの作成
以下のようなRecipe functionsを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/1fe2454a-62b7-3fbb-a907-89063b30a181.png)

### ポイント
#### １）レシピ内の処理で必要となるパラメータを全て定義しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f634a9b7-3091-ddba-e664-4cb099216751.png)

なお、各パラメータはmodeやchannelのような条件にかかわらず共通で参照されるものを除き、Optionalは「Yes」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a8b1115c-bd53-8b18-30ed-89530ebde6cc.png)

#### ２）１つのRecipe functionsで条件別に処理を分岐させたい場合は次のように対応する
modeの値は、上位のレシピ（アクティブレシピ）で用意しておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/3a818a57-ec7f-20b3-0b4a-ccadd12390c8.png)

#### ３）メッセージ送信は、「Post message」を使用する
Recipe functionsではPost command reply は使用できないため、Post messageで対応します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/a1e47148-d8ae-e9d5-5640-4746e4f8f303.png)

なお、Post messageではチャンネルを指定する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/f8f24caa-4696-a49e-aed9-af94b72e73c4.png)

#### ４）Workbotコマンドの送信先は、１で作成したアクティブレシピを指定する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/602a3cc0-f5bb-f84b-572f-b7e982e92e88.png)

なお、パラメータに対して値を渡したい場合は、「Command input values」で指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/becfc0f9-eb68-8010-e7b7-f304e6ad63a2.png)

# 補足
以上の手順をご覧になった方の中には、再帰的に自分自身を呼び出せば良いのでは？と思われた方もいるかもしれませんが、Workatoでは再帰的に自分自身を呼び出すことはできません。（再帰的に自分自身を呼び出そうとすると、エラーが発生します）

しかし、Recipe functionsを介して自分自身を呼び出すことは可能なため（Recipe functionsを間に挟むことで再帰的に自分自身を呼び出すことが可能になるため）、本ページではRecipe functionsを利用した手順を紹介しました。

Workbotを活用しようとすると、レシピの消費数が多くなりがちですが、この方法を用いることでレシピを大幅に節約することができます。レシピの消費数に悩まれている方は是非この方法をお試しください。