UiPathのチャットサービスを使ってSlackからワークフローを呼び出してみた(Slack手前まで)

この投稿は [[RPA] UiPath Friends 公式 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/uipathfriends) の13日目の投稿です。
この前の記事は[【RPA(UiPath)】RPA導入のリスク(開発・実行編)](https://syachiku-inu.hatenablog.com/entry/2020/12/12/%E3%80%90RPA%28UiPath%29%E3%80%91RPA%E5%B0%8E%E5%85%A5%E3%81%AE%E3%83%AA%E3%82%B9%E3%82%AF%28%E9%96%8B%E7%99%BA%E3%83%BB%E5%AE%9F%E8%A1%8C%E7%B7%A8%29) です。



こんにちは！UiPath Japan MVP 2019,2020 の @masatomix です。

今回は UiPath が提供する、チャットボットサービスを使ってみました。
このサービスを使うことで「**チャットボットと会話するかのように、UiPathのワークフローを呼び出す**」ことができるようになります。
おもしろいですね。


![ChatBot](https://imgur.com/7NdhOnG.png)

さて今回は「**Slack上のChatbot に話しかけることで、UiPathのワークフローを呼び出す**」ことをやってみます。


# 概要


## 対象読者

- ある程度は、UiPath / UiPath Orchestrator Community Cloud を触ったことがある
- ワークフローをUnattended Robotから呼び出すくらいはできる

くらいの知識をお持ちの方をイメージして記事を書きました。



## 登場人物

具体的には以下の処理フローとなります。

- ユーザがSlack上のChatbot (Slack App)に話しかける。
- SlackのChatbot がUiPath Chatbot serviceを介して文章解析サービスである Dialogflow を呼び出し、ユーザのやりたいことを分析する
- UiPath Chatbot serviceが、分析結果をもとに UiPath Orchestratorに登録されたワークフローを呼び出す
- ワークフロー実行結果がDialogflow経由でChatbotへ返却され、ユーザがワークフローの実行結果を得る

という感じです。

Dialogflow は Google Cloud Platform 上のサービスですので、Googleのアカウントがあれば利用可能です。また今回使用するOrchestrator Community Cloud もGoogleアカウントでのログインに対応しているので(別アカウントのOrchestratorにも接続可能です)、Googleアカウントを一つ準備しておきましょう。

### さて

ここまで説明しておいてアレなんですが、どうもいまのUiPath が推してるのは Dialogflow ではなく[Druid chatbots](https://www.uipath.com/product/chatbots-automation) ってヤツみたいなんですね。。
じつは UiPathが主催するHackathon [UiPath HyperHack](https://communityevents.uipath.com/events/details/uipath-hackathons-presents-participate-in-the-uipath-hyperhack-2010-product-release/#)  にチャットボットカテゴリで応募しようとこれらを調べ始めたんですが、途中で「Druidをつかうってシバリ」があることに気がついて、、。。

まあ **Hackathonに応募できなかったイイワケ**です、ハイ。。。



## つくるもの

今回はチャットサービスということで**Slackのチャットボットに「ライセンス一覧ください」というと、結果を返してくれるサービス** を作ってみます。

![chatbot](https://imgur.com/nZBLl93.png)


## うごかしてみる


動かしてみるとこんな感じ。画像をクリックすると動画が再生されます。

[![ChatbotサービスをつかってSlackからワークフローを呼び出してみたよ](http://img.youtube.com/vi/kTVttTEQLqY/0.jpg)](https://www.youtube.com/watch?v=kTVttTEQLqY)

# 事前準備(ワークフローや、各種サインアップ など)

## ワークフロー

イチからぜんぶ説明するのはシンドイので、あらかじめ UiPath Studio で

- 「target」というInパラメタ(string)をうけとり
- ライセンス一覧をAPIで取得して
- 結果を「resultStr」というOutパラメタ(string)で返す

という**ワークフローが作成済みで、UiPath Orchestratorに登録済み**であるとします。
(説明記事とか、いつか書こうと思います。。たぶん。) これを**Slack上のChatbotから呼び出すのがゴール**となります。

いちおうワークフローの引数を図示すると以下の通りです。

![i000](https://imgur.com/BxNMF8y.png)

コードはこちらから。
https://github.com/masatomix/UiPathChatbotServiceSample 
GitHubにありますので、[Studioのプロジェクトを作成します(Gitから取得します)](https://qiita.com/masatomix/items/cb9c265f1d8010bed50b#studio%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%9C%E6%88%90%E3%81%97%E3%81%BE%E3%81%99git%E3%81%8B%E3%82%89%E5%8F%96%E5%BE%97%E3%81%97%E3%81%BE%E3%81%99) などを参考に取得してみてください。

最初に示したとおり、登場人物はこんな感じです。

![ChatBot](https://imgur.com/7NdhOnG.png)


利用するサービスたちですが、[Google Cloud Platform](https://console.cloud.google.com )  / [Dialogflow](https://dialogflow.cloud.google.com/) / [UiPath Orchestrator Community  Cloud](https://cloud.uipath.com/) などです。

## Google Cloud Platform

[Firebase や Google Cloud Platformの初回のサインアップその他の備忘メモ](https://qiita.com/masatomix/items/791699b3de3486618dd7) にある 「[Google Cloud Platform (GCP)のサインアップ](https://qiita.com/masatomix/items/791699b3de3486618dd7#google-cloud-platform-gcp%E3%81%AE%E3%82%B5%E3%82%A4%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97)」を実施してください。

こんな感じで「My First Project」というプロジェクトができていればOKです。プロジェクトを一意に定める値はプロジェクトIDであり、今回は「natural-bus-297506 」となってるようです。後で使います。

![i001](https://imgur.com/68SZyLW.png)



## Dialogflow

つづいて Dialogflow です。https://dialogflow.cloud.google.com/ にアクセスして、先ほどのGoogle アカウントでログインします。

![i002](https://imgur.com/82Cal6c.png)


利用規約のチェックを入れて、Acceptします。

![i003](https://imgur.com/Vrqej9V.png)


準備ができたようです。
![i004](https://imgur.com/ulh74dt.png)




## UiPath Orchestrator Community Cloud

Studio/Unattended Robotが接続された「UiPath Orchestrator Community Cloud」 をつかいます。
https://cloud.uipath.com/ へアクセスすると、アカウントを作成してサインアップができると思います。Googleのアカウントでサインアップ可能です。
先のワークフローはココにPublishして、Unattended Robotから利用可能なようにしておきましょう。
(サインアップやワークフローのPublishは省略しますー)

![i005](https://imgur.com/f5pu9QD.png)

# やってみる

さて実際にやってみましょう。Dialogflowは、**Slackなどフロントエンドのサービスを経由してユーザの入力情報を受け取り、そこからユーザがやりたいことを抽出してくれるサービス**です。



## Dialogflowで処理フローを定義していく


まずはエージェントを作成します。左上のRegion が US であることを確認[^1]しつつ「CREATE AGENT」をクリック。

[^1]: Tokyo Japan とかがあるので選んだりすると、あとでOrchestratorとつながりませんのでご注意。

![createAgent000](https://imgur.com/ZQlbvXf.png)

名前は「UiPathChatServiceAgent」、Default Language を「Japanese-ja」、GoogleのProjectは先にでてきたプロジェクトIDである「natural-bus-297506 」を選びましょう。今回は一つしかないので多分迷うことはないかとおもいます。
さて「CREATE」をクリックします。

![createAgent001](https://imgur.com/YuHckHl.png)

エージェントがひとつ、できたようですね。

![createAgent002](https://imgur.com/UgC3tG6.png)




### Intent/Entityについて。

つづいてこのエージェントに「Entity」や「Intent」を追加していきます。
Intent は[公式の説明](https://cloud.google.com/dialogflow/es/docs/intents-overview?hl=ja)によると「**インテントは、どのユーザー リクエストを理解し、どのようなアクションを取るかを決定するもの**」だそうです。今回だと「ライセンス一覧ください」という入力に対して「UiPath のUiPathChatbotServiceSample  というワークフローを呼び出す」という処理を紐付けるモノと考えればよさそうです。

Entityは、Intent で文字列が解析された結果、**抽出される情報の定義**です。今回は「target」というEntityを定義し、その中にOrchestrator画面上の要素「ライセンス、マシン、ロボット」などを定義することにします。



### Entity を定義する

ではEntityから定義していきます。
Entities メニューより、「CREATE ENTITY」をクリック。

![createEntities000](https://imgur.com/2T1dU6G.png)

名前を「target」とします。
下に具体的な値を定義していけるので「license」と入れてみました。右側にはシノニム(別名)をつけられるので、日本語の「ライセンス」を入れてみました。**ユーザからの対話で「ライセンス」や「license」が入力されると「これはtargetというEntityの"license"だな」って、Intent側で抽出される**、ってかんじです。


![createEntities001](https://imgur.com/ugmD86d.png)

今回は使わないのですが、machines や robots も入れてみました。最後に「SAVE」をクリックすると、

![createEntities002](https://imgur.com/sa67GMh.png)


保存されたようですね。

![createEntities003](https://imgur.com/ouSEsQj.png)



### Intent を定義する

つづいて、Intentを作成していきます。左部の「Intents」をクリックして「CREATE INTENT」をクリック。
「show-info」と名前を入れてみました。つづいて「ADD TRADING PHRASES」をクリックしてください。

![createIntent000](https://imgur.com/0YzJc25.png)

ADD TRADING PHRASESでは、**このインテントで反応してもらいたい文章を入れて**いきます。
たとえば「ライセンス表示」といれてリターンしてください。
**Entityに登録された文字は下記の通り自動認識されて「この部分はEntityだよね?」みたいなかんじになっている**のがわかります。


![createIntent001](https://imgur.com/BPZZvZJ.png)

ほかにもいくつか入れてみて、また文章を下記の通り何通りか入れてみて、うまくEntityが認識されることを確認してみてください。

続いて「MANAGE PARAMETERS AND ACTION」をクリックします。

![createIntent002](https://imgur.com/cmuRxp5.png)

**先の文章たちから抽出されたEntityが、このIntentのパラメタとして自動で定義されている**ことが分かります。

![createIntent003](https://imgur.com/cFAnOAO.png)

パラメタの定義には、項目がいくつかありますが、詳細は[ココ](https://cloud.google.com/dialogflow/es/docs/intents-actions-parameters?hl=ja)に記載されています。
このtargetパラメタは必須のパラメタにしたいので「REQUIRED」にチェックを入れておきました。

また**「PARAMETER NAME」は、あとからひもづけるワークフロー側の変数名と自動でマッピングされる**ので「target」にしておきます(Entity名をそのようにしたので、あらかじめtargetになってるはずです。)

最後に「SAVE」をクリックして保存しておきましょう。



### Intent/Entity の疎通確認

さて、できたIntent/Entityをすこしテストしてみます。

右側に、なにやら**テストで入力できる領域がある**ので「ライセンスを一覧して」と入れてみましょう。すると、下の結果部分にINTENTが「show-info」、PARAMETERが 「target = license」となって、**文中のEntityがただしく抽出できていることや、ただしいIntentが選択されていること**が分かりました。

![createIntent004](https://imgur.com/16WejAX.png)


もう一つ例を。「表示して。License」と入れてみます。正しい結果が得られました。


![createIntent005](https://imgur.com/e2f30hZ.png)


このように (今回は一つしか作成しませんでしたが) **各Intentにある「Traning phrases 」にそれぞれ文章を与えていくことで、狙ったIntentにイイ感じに振り分けていくよう学習させる仕組み**になっています。

もう一つ。さきほどtargetパラメタは必須にしたのでその確認。「一覧表示」という文章を入れてみると、、

![createIntent006](https://imgur.com/Erk1sHy.png)

必須パラメタがないので「What is the target?」と聞かれました。

![createIntent007_0](https://imgur.com/rViNcBv.png)

上部の Try it now に「ライセンス」と入れてみると、PARAMETERが「target = license」となりました。

![createIntent007](https://imgur.com/y5vl2cd.png)


このように **Dialogflowは文章の解析・パラメタの抽出だけでなく、パラメタがない場合は聞き返す、などを自動でやってくれたり**します。また今回はセットしませんでしたが「もう一回表示して」などと言ったとき**前の入力値のパラメタを再利用してくれるfollow up Intent機能**とか、会話におけるロジックをいろいろお任せできちゃうわけですね。便利です。

### Intent の戻り値を定義する

そういえばIntent に対してパラメタまでは作成しましたが、ユーザに返す戻り値を作ってなかったので、これから作っていきます。
パラメタの下に、Responses 欄があるので、そこに

```console
実行結果です
<resultStr>
```

と入力します(改行は Shift + Enter)。SAVEをクリックすれば完了です。

コード中の ``<resultStr>`` は、UiPathのワークフローのOutパラメタにあわせてあります。お察しの通り、呼び出されたワークフローの ``resultStr`` 変数の値でココが置き換えられる仕組みです。

![createIntent008](https://imgur.com/WTebpPV.png)



ユーザ入力値を受け取って解析する箇所と、そのあとワークフローが実行されたのちに実行結果を受け取る箇所は以上です。
みんな大好きノーコードです。

Dialogflowの世界はまずは以上です。



## UiPath Chatbot service でOrchestratorとDialogflowを接続する

さて UiPath Orchestrator とワークフロー につづきDialogflow がセットアップできたので、**UiPath Chatbot service を用いてそれらをつないで**いきます。
https://chatbot.uipath.com/ へアクセスしConnectをクリック。

![conOC000](https://imgur.com/BZtVlTr.png)


名前はなんでもよいのですが「UiPathChatbotServiceDemo」としました。Saveをクリックして完了です。

![conOC001](https://imgur.com/C1uGoec.png)



### UiPath Orchestrator とつなぐ

接続するOrchestratorとDialogflowを設定する画面になります。まずはOrchestratorから。


![conOC002](https://imgur.com/eOhpp0F.png)

Orchstratorに接続するための情報を設定していきます。
下記の画面にもリンク先などが書いてあるので基本はその通りやればよいのですが、[UiPath Orchestrator APIに必要なアクセストークンを取得する](https://qiita.com/masatomix/items/30c9a3fc53446ec64c1f#uipath-orchestrator-api%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B)  などの記事に説明されているやり方で、

- User Key
- Account Logical Name
- Tenant Logical Name
- Client ID

を取得して設定すればOKです(Orchestrator Community Cloud のAPI 設定をしたことがある方はおなじみですね)。
最後にConnect して終了です。

![conOC003](https://imgur.com/H17Smd2.png)




### Dialogflowとつなぐ前準備 (Google Cloud Platformでサービスアカウントを作成)

つづいてDialogflowですが、**UiPath Chatbot service がDialogflowにアクセスするためのアカウントである「サービスアカウント」を作成**します。
[Google Cloud Platform](https://console.cloud.google.com/) にアクセスします。操作したいプロジェクトを選択して「APIとサービス >> 認証情報」 と遷移し、「認証情報を作成 >> サービスアカウント」を選択。

![serviceAccount000](https://imgur.com/mzh4wEb.png)


サービスアカウント名を、今回はdialogflowを操作できるアカウントということで「dialogflow integrations」にしました。サービスアカウントIDは自動で決定されるので「作成」をクリック。

![serviceAccount001](https://imgur.com/21ByIRa.png)

サービスアカウントにどんな操作を許可するかを設定する、ロールを指定します。テキストボックスでフィルタリングしつつ、ここでは「Dialogflow API 管理者」を選択しました。図は隠れてますが「続行」をクリックして、その下の「完了」をクリックします。

![serviceAccount002](https://imgur.com/7Xmv9Ti.png)
作成できたようですね。

つづいて、このサービスアカウントを利用するための鍵ファイル(JSONファイル)を作成します。
サービスアカウント欄のメールにあるリンクをクリックします。

![serviceAccount004](https://imgur.com/k9fYraP.png)

クリックしたサービスアカウントの詳細画面に遷移するので 「鍵を追加 >> 新しい鍵を作成」 を選択。
![serviceAccount005](https://imgur.com/NPtIQz9.png)

ファイル形式は「JSON」ファイルを選択し「作成」をクリック。
![serviceAccount006](https://imgur.com/cUF1Fog.png)

JSONファイルがダウンロードできたと思います。ちなみに中身はこんな感じです。赤枠で囲ってるところは、このつぎで使う項目です。
![serviceAccount007](https://imgur.com/QedW11P.png)

### Dialogflowとつなぐ

さてUiPath Chatbot service に戻って、Dialogflowと接続するために Connectをクリックします。
![serviceAccount008_0](https://imgur.com/YjLB0vz.png)


サービスアカウントの情報を記述していきますので、さきほどダウンロードしたJSONファイルを見ながら、

- Project ID : JSONファイルのproject_id の値
- Service Account : JSONファイルのclient_email の値
- Private Key: JSONファイルの private_key の値

を設定していってください。
最後にConnectをクリックすればOKです。
![serviceAccount008](https://imgur.com/aPUjgwF.png)


どちらにも接続が完了しました!
![serviceAccount010](https://imgur.com/78piDkR.png)



### Orchestrator上のワークフロー と、DialogflowのIntentをマッピングする

もうすこしです。UiPath Chatbot service 上に、OrchestratorとDialogflowが登録できたので**、Orchestrator上のワークフローとDialogflow上のIntentを紐付け**ていきます。

UiPath Chatbot service の左メニューの Mapを選択。Dialogflow上のIntentが表示されるはずですので、先ほど作成したIntent「show-info」をクリックします。

![mapping000](https://imgur.com/13Z6MZb.png)

Orchestrator上のワークフロー (Orchestrator Processes) が表示されますので、作成済みの「UiPathChatbotServiceSample 」を選択します。
下記のキャプチャの通り、**ワークフローのIn引数 target と Dialogflowのshow-info Intent のParameter が一致していますので、自動でマッピング**されます。
(逆に手動でマッピングする方法が分からない)

またワークフローのOut引数が resultStr となっていますが、これもIntent側のResponses で ``<resultStr>`` と参照していましたね。
最後に「Map」をクリックします。

![mapping001](https://imgur.com/vQxSfhh.png)

以上で、マッピングは完了です。


![mapping002](https://imgur.com/TMebOhY.png)



## WEB のテストチャットでテスト

いまだSlackが出てきませんが、まだです。**というか記事が長くなりすぎたので、あらためて[別記事](https://qiita.com/masatomix/items/6b2c4617e976b3584f8e)にしようと思います。ゴメンナサイ。**


さてさて、Slackにつなぐ前にWEBのテストアプリで接続できているかを確認しましょう！
左メニューより、Launchを選択、Webの「Connect」をクリックします。

![testChat000](https://imgur.com/bK7fQ5m.png)

名前とか何でもよいのですがたとえば「chat bot」とかにして「Save&Close」をクリックします。

![testChat001](https://imgur.com/AuuFAMm.png)


「Test」ボタンが表示されるのでクリックすると、

![testChat002](https://imgur.com/asgaH7X.png)

なにやら画面が表示されました。最初よく分からなくて待っちゃいましたが、右下のチャットのアイコンをクリックします。


![testChat003](https://imgur.com/rD3I9AS.png)

チャットウィンドウが表示されましたね。
「ライセンスを表示して」などと入力して Sendしてみると、、、

![testChat004](https://imgur.com/JC5zVp9.png)


おお、Orchestrator 経由でワークフローがジョブ実行されて動き出して、その実行結果が 表示されましたね！

![testChat005](https://imgur.com/RDsBm6p.png)


# ここまででいったんまとめ。

長かったですね。登場人物多すぎでしょうか。
まだSlackまでできていませんが、あらためて[記事](https://qiita.com/masatomix/items/6b2c4617e976b3584f8e)にしようと思います。


>-- **2020/12/22追記** --
別記事かきました
[UiPathのチャットサービスを使ってワークフローを呼び出してみた(Slack編)](https://qiita.com/masatomix/items/6b2c4617e976b3584f8e)


- Dialogflow を使うと、**ユーザが入力した文章を解析して、やりたいことを抽出することができました**。
- UiPath Chatbot service をつかうと、**DialogflowからUiPath Orchestrator にパラメタを渡したり、結果を受け取ることができました**。つまり日本語の文章をインプットにOrchestrator上のワークフローを制御できるってコトですね。
- Slack連携は今回はやりませんでしたが、以下の流れになります。
  - Slack上 ( https://api.slack.com/apps )で Slack App を作成し、UiPath Chatbot service に登録します。
  - その Slack App には、"direct messageを受けたら"というイベントトリガー (Event Subscriptions)を設定します (DMを受けると、UiPath Chatbot service へリクエストが飛んで、Orchestrator 上のワークフローが呼び出されるという仕組み )。
  - そのアプリを 自分のワークスペースにインストールします。
  - あとは、そのアプリにDMを送れば、応答としてUiPathのワークフローの結果が得られます。



先ほど少し書きましたが、 これを調べ始めたきっかけは UiPathが主催するHackathon [UiPath HyperHack](https://communityevents.uipath.com/events/details/uipath-hackathons-presents-participate-in-the-uipath-hyperhack-2010-product-release/#)  にチャットボットカテゴリってのがあってエントリするつもりだったからですね。当初このチャットボット機構と [UiPath Data Service](https://docs.uipath.com/data-service/docs/the-user-interface)[^2] をつかってモノを作るつもりでした(というか作っていえで使ってます)。

時間の都合で応募は断念しちゃいましたが、**Dialogflowに出会えたので Hackathon があってよかった！**って思ってます。


[^2]: Orchestrator上にホスティングするDB、というかOR-Mappingサービス。

以上です。お疲れさまでした！




# 関連リンク

-  [[RPA] UiPath Friends 公式 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/uipathfriends) 
-  [Google Cloud Platform](https://console.cloud.google.com ) 
-  [Dialogflow](https://dialogflow.cloud.google.com/) 
-  [UiPath Orchestrator Community  Cloud](https://cloud.uipath.com/) 
-  [UiPath HyperHack](https://communityevents.uipath.com/events/details/uipath-hackathons-presents-participate-in-the-uipath-hyperhack-2010-product-release/#)  
-  [FirebaseアプリからSlackへ通知を行う。アクセストークンは手動で設定する編。](https://qiita.com/masatomix/items/56fc2024e383875cca1a) Slack App の作り方の記事です。
-  [UiPathのチャットサービスを使ってワークフローを呼び出してみた(Slack編)](https://qiita.com/masatomix/items/6b2c4617e976b3584f8e) つづきの記事です。