UiPathのチャットサービスを使ってワークフローを呼び出してみた(Slack編)

## 前回までの復習

[前回](https://qiita.com/masatomix/items/87faedb4fd1645b07d4a)より、**Slack に「ライセンス一覧ください」というと結果を返してくれるサンプル** を作りながら、UiPathのチャットサービスの機構をご紹介しています。UiPathのチャットサービスとは、下記のように「**Slack上の Chatbot に話しかけることで、UiPathのワークフローを呼び出す**」ことが出来るサービスです。

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

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

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

[前回](https://qiita.com/masatomix/items/87faedb4fd1645b07d4a#web-%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88%E3%83%81%E3%83%A3%E3%83%83%E3%83%88%E3%81%A7%E3%83%86%E3%82%B9%E3%83%88)までで Slack以外の部分をつくったので、今回はSlackの部分をやっていきます。

### 処理シーケンス

上記の図で処理の流れのイメージを書きましたが、もうすこし厳密に処理シーケンスを書いてみました。
チャットボットに「ライセンス表示して！」とDMを送信したときの処理シーケンスは以下の通りです。

1. ユーザはSlack App ( Chatbot )に「ライセンス表示して！」とDM送信する
2. Slack Appは DMが送信されたというイベントに反応して、[UiPath Chatbot service](https://chatbot.uipath.com/ ) にリクエストを送信する(Slack の[Event Subscription 機構](https://api.slack.com/events-api)による処理)
3. UiPath Chatbot service はサービスアカウントをつかって [Dialogflow のAPI](https://cloud.google.com/dialogflow/es/docs/reference) を呼び出し、Dialogflowの実行結果を得る
4. UiPath Chatbot service は Intentにマッピングされたワークフローの実行をOrchestrator に依頼する
5. UiPath Chatbot service は Dialogflowの戻り値 の一部をワークフローの実行結果で置換して、Slack にメッセージをPOSTする

この流れを図にするとこんな感じになります。
![ChatBot-リクエスト時](https://imgur.com/pQ0NySV.png)



では、Slack部分を実装していきます。といってもノーコードですのでご安心を。



## 対象読者

- ある程度は、UiPath / UiPath Orchestrator Community Cloud を触ったことがある
- ワークフローをUnattended Robotから呼び出すくらいはできる
- [前回の記事](https://qiita.com/masatomix/items/87faedb4fd1645b07d4a)を参照済み

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



## やってみる

### 新規作成 & Basic Information

[こちらの記事](https://qiita.com/masatomix/items/56fc2024e383875cca1a#%E3%82%84%E3%81%A3%E3%81%A6%E3%81%BF%E3%82%8B%E4%BD%9C%E6%88%90) にSlack Appを新規作成する手順がありますので、リンク先の「Slack App (Hello World App)の作成」をやってみてください。そうすると下記のように ClientID,Client Secret,Signing Secret が得られるはずです。

Slack Appの画面キャプチャ:
![000](https://imgur.com/73AR1vg.png)

**ClientID,Client Secret,Signing Secret はこのつぎで使うのでメモ**っておきましょう。
またアプリの設定は後ほど引き続きおこなうので、**SlackのWEB画面はこのまま閉じない**で置いておきましょう。

**以下はUiPath Chatbot service側で作業します**
https://chatbot.uipath.com/ にアクセスし、左の「Launch」をクリック。SlackアイコンのConnectをクリックします。
![s001](https://imgur.com/eFif9kM.png)


**先のClientID,Client Secret,Signing Secret をセット**して「Next」をクリック。
![s002](https://imgur.com/Qhn69gt.png)

下記のような画面が表示されます。**このURL二つ「OAuth URL」「Request URL」はつぎで使いますのでメモ**っておきましょう。
また**下記画面の右部には「あとこれだけやろうね」って説明が動画とともに説明されている**ので、とりあえずこの画面は閉じないで置いておきましょう。
![s003](https://imgur.com/KmIzFjG.png)

UiPath Chatbot service 側での設定は以上です。
引き続きSlack Appの設定をしていきます。

### Setup Authentication and Bot Permissions

**以下は先ほど置いておいた「Slack側の画面」で作業します**

#### Redirect URL

Redirect URLを設定します。

> 以下 蛇足
> これは Slackのワークスペースに Slack Appを追加(Install) する際に、「ユーザが認可する」ってオペをするのですが、その**認可したという結果をリダイレクトする先**です。リダイレクト先ではその結果(認可コードっていいます) を元にアクセストークンを取得するのが一般的です。
> 今回のRedirect先は、UiPath Chatbot service の指定したURLとなっていて、結果、UiPath Chatbot service がアクセストークンを取得することができ、**UiPath Chatbot service はユーザが許可したSlackのワークスペースにメッセージを送信することができるようになる**わけですね。

左メニューの OAuth & Permissions を選択し Redirect URLs の欄の「Add New Redirect URL」をクリック、**テキストボックスに、先の UiPath Chatbot service のURL2つのうちの「OAuth URL」を入れて**「Add」、最後に 「Save URLs」 をクリックします。
![s004](https://imgur.com/dSPIA7B.png)

#### Permissions

つづいてBot がおこなうオペレーションを設定します。先のUiPath Chatbot service の画面の動画も参考にしつつ作業しましょう。

>以下蛇足
>Slack Appは OAuthの Clientなので、たとえば「チャンネルにボットとしてメッセージを送信する」などの**操作をユーザに許可(認可)をもらう必要があり、**認可してもらいたい操作(Scope) を設定している、ってことですね。
>ココで設定した操作は、ユーザが認可する画面にて「このボットは "ボットとしてメッセージを送信する" などを行うけど、許可しますか？」って説明などに使われます。(下記はサンプルイメージ)
>![auth](https://imgur.com/TuWEWVf.png)

さてやっていきます。OAuth & Permissionsをすこし下にスクロールして、**Scopes の Bot Token Scopes にて「Add an OAuth Scope」**をクリック。
![s005](https://imgur.com/qvlhUZT.png)



その上の「Add permission by Scope or API method...」とあるプルダウンで「chat:write」を選択、再び下のボタンを押して「 im:history」... と続けて結果的に **chat:write, im:history, im:read, im:write を追加**してください。
![s006](https://imgur.com/lmcPaA1.png)



OAuth & Permissions の設定は以上です。


### Setup Messaging

**ひきつづきSlack側の画面で作業します**

Slack サーバから UiPath Chatbot service へのリクエストのトリガーは「チャットボット宛のDMが送信されたら」でしたが、**そのイベントを検知してリクエストを送るのは「Event Subscription」という機構**です。ということでその設定画面で「DM というイベントが発生したら」というイベント発生時の Request先のURLなどを指定していきます。

Event Subscriptions をクリック、下記の画面で Enable Events をONにします。
![s007](https://imgur.com/AhEaxGN.png)


表示される **Request URL のテキストボックスに、先の UiPath Chatbot service のURL2つのうちの「Request URL」を入れてEnter**、上にVerified とでればOKです。
![s008](https://imgur.com/fWs9upo.png)

つづいてちょっと下の Subscribe to bot events をクリックして、「Add Bot User Event」をクリック。テキストボックスで補完を活用しつつ**「message.im」を選択**します。
![s009](https://imgur.com/Gv9nXVq.png)

Descriptionが**「DMのチャンネルにメッセージがポストされたら」というイベントになってます**ね。最後に**「Save Changes」をクリックして設定を保存**します。
![s010](https://imgur.com/kv6dQ6x.png)

以上で Slack Appの作成は完了です。おつかれさまでした。

### Install your Slack Bot

さいごに、**このSlack App を利用したいSlackのワークスペースに、作成したアプリを追加( Install )** します。
ちなみにこのアプリは作成者が属する Slackにしかインストールできませんのでご安心ください。

**ひきつづき、Slack側の画面で作業します**

Manage Distributionへ遷移して、「Add to Slack」ボタンをクリックします。
![s011](https://imgur.com/TjK5bw3.png)

認可画面が表示されます。先ほど **Permissionsで指定した4つのScopeについて、許可してイイ？って聞いてきています**ね。
「Allow」をクリックしましょう。
![s012](https://imgur.com/Y9vMw3S.png)

インストールが成功しました的なメッセージが出ていればOKです。
![s013](https://imgur.com/NyFO52f.png)



## Slackで疎通

ようやく、Slackからの疎通ですね。
インストールしたSlackのワークスペースを表示してみると、アプリが追加されています。
![s014](https://imgur.com/SmbqlFl.png)

「ライセンスを表示して」とDMを送信すると、結果が表示されました。
![s015](https://imgur.com/62mpe5s.png)

「表示して」とだけ表示するとDialogflowが聞き返してくる、なども正しく動いていそうですね。
![s016](https://imgur.com/rblcXLF.png)

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


## まとめ

- Slackに何かを問いかけることで、UiPath のワークフローが動いてその結果を受け取れることが分かりました。
- よってDialogflowにいろいろなインテントを設定してワークフローをマッピングしておけば、Slackから Unattended Robotの実行を制御できるということですね。
  -  自分は実際に、家の日常品の在庫管理に使ってます。
  -  Slackに「シャンプー2つ買ったから在庫に追加して」とか「洗顔ないからAmazonのURL送って」とか。なかなか便利に使えてます。
  -  データはUiPath DataServiceに入れて管理しているので、データの永続化まで含めてサーバレスです[^1]

[^1]: サーバレスのかわりに、クライアントPCが必要ですけどね。。そして、これらをUiPathのワークフローでやる必要ある？については議論しない :-) 


## 関連リンク

-  [Dialogflow](https://dialogflow.cloud.google.com/) 
-  [UiPath Orchestrator Community  Cloud](https://cloud.uipath.com/) 
-  [UiPath Chatbot service](https://chatbot.uipath.com/ ) 
-  [FirebaseアプリからSlackへ通知を行う。アクセストークンは手動で設定する編。](https://qiita.com/masatomix/items/56fc2024e383875cca1a) Slack App の作り方の記事です。