非エンジニアでも使い回せる、UiPathでつくる簡易bot

このエントリーは、GMOアドマーケティング Advent Calendar 2018
（ https://qiita.com/advent-calendar/2018/gmo-am ） の 【12/17】 の記事です。
GMOアドマーケティングとしては初のAdvent Calendar参戦です。

## RPAでbotをつくってみることにした
この記事では、RPAツールのUiPathを使って、Slack投稿botをつくった話をご紹介します。

社内でSlackにアラートを投稿するbotをつくる機会が多く、
普段はエンジニアの手によってプログラムでbotをつくっているのですが、
今回はRPAによるbot作成を実施してみました。

RPA（Robotics Process Automation）とは、簡単に言うと、
人が行っている作業手順をなぞってそのまま自動化することです。
RPAツールは基本的にGUIで操作できるので、
プログラムを書かない人でも容易に自動化を行うことができます。

今回RPAツールのUiPathを使ってbotをつくることにしたのは2つの理由がありました。

### 非エンジニアでも作れる

1回作成するだけなら「非エンジニアでもできる」必要はそんなにないのですが、
弊社では、今回のようなbot作成が不定期に発生していました。

主な用途は営業担当者などへのアラートですが、
bot作成のためには毎回エンジニアが開発工数を割かなければならないため、
機能開発との兼ね合いでなかなか着手できないことも多いです。

RPAはエンジニアでなくとも実際に自分がやっている業務を自動化できるので、
botを必要としている人が自分でbot作成できるようになり、
必要なタイミングで効率よくbotを導入できるようになります。

### 非エンジニアでも使い回せる

botの中で「Slackに投稿する」部分はSlackのAPIを叩かなければならないので
普段開発に携わっていない人にはややハードルが高いです。

逆に、そこを乗り越えてしまえば送るテキストを作る部分はRPAツールを使って誰でもできます。
今回は「APIを叩く」部分をパーツとして作成して使い回すことを考えてUiPathでの作成を選択しました。

## 仕様概要

- UiPathのHTTP Requestアクティビティを使用
- Slackのchat.postMessage APIを叩いて投稿
- UiPathのxamlファイルとして保存し、投稿部分を使い回せるようにする

## 実装手順
実際に実装した手順はこちらです。

### 準備：Slack側の設定

※この部分を変更すればSlack以外のAPIにも応用できます。

#### botの設定
まず、[Slack Appの「Bots」のページ](https://slack.com/apps/A0F7YS25R-bots)を開きます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/d9141b3d-66f7-1136-e633-da69e7887298.png)

「Add Configuration」からbotを新規作成します。
もちろん既存のものを使ってもかまいません。

作成したら、API Tokenを控えておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/0f9d055a-0b72-8ef4-a915-e5b107af7e74.png)

#### Channelの設定
さらに、投稿先のChannelの準備をします。

まずはbot投稿を行いたいChannelのChannel IDを控えます。
Channel IDを取得するAPIもありますが、
今回はChannelのURLから取得することにしました。

ブラウザでChannelにアクセスしたときのURLが
https://xxxxx.slack.com/messages/*********/details/
だとしたら、*********の部分がChannel IDです。

Slackのデスクトップアプリ版を使用している場合は、
上部のChannel名を右クリック→リンクをコピー
でURLを確認可能です。

最後に忘れず、 **botをChannelに招待** しておきます。

## UiPathワークフローの作成

UiPathを持っていない方はこちらからダウンロードしてください。
[UiPath Community エディション ダウンロード] (https://www.uipath.com/ja/community-edition-download)

まずは任意のプロジェクトを開いた状態で、
新規(New)>シーケンス(Sequense)
を選択して新規のシーケンスファイルを作成します。
今回はslack_chat_postmessageというタイトルにしました。

これにより、slack_chat_postmessage.xamlというxamlファイルが作成されます。

全体の構成はこのようになります。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/1fbd1285-bf93-1b44-b8eb-d044d67a35a4.png)

上から順番に説明していきます。

### 変数(Variables)の設定

アクティビティパネル（通常は画面左部）からAssignアクティビティを選んでドロップします。

左辺は新規の変数`as_user`とします。
（変数の新規作成は入力欄を右クリック→変数の作成）
右辺は`"True"`とします。

これで`as_user`に値が代入されました。
今回は`"True"`の値を2箇所で使用するため変数に代入していますが、
面倒であればこのあとの手順で`"True"`をベタ打ちにしても影響はありません。

### 引数(Arguments)の設定

UiPathでは、変数(Variables)の他に引数(Arguments)というものがあり、
引数はファイルの外から値を渡したり、ファイルの外に値を返したりする際に使用します。

今回はAPIを叩く部分をファイルとして独立させ、別ファイルから制御できるようにするために

- 投稿先Channel
- API Token
- 投稿内容

の3点は引数として設定しました。

画面下部の引数(Arguments)パネルから、このように引数を作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/6b4cb23c-f8fc-eeea-2a69-df2f018d4615.png)

`channel`、`token`、`text`の3つの引数を作成し、
それぞれ方向は入力(In)、型はStringを設定しました。

方向は、

- ファイルの外から値を受け取る場合は入力(In)
- ファイルの外に値を返す場合は出力(Out)
- 両方行う場合は入力(In/Out)

を選択します。
今回は受け取るだけなので入力(In)を設定しました。

### HTTP Requestアクティビティ

botのメインである、APIを叩く部分を作成します。
HTTP Requestアクティビティをワークフローにドロップした後、
プロパティを確認します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/c1667b78-3e30-74e7-2bf6-d212afe40c87.png)

まず、エンドポイントにはchat.postmessage APIのエンドポイント、
`"https://slack.com/api/chat.postMessage"`を指定します。

このあとのデバッグ用に、状態コードと結果には任意の変数を設定しておきます。
今回は、状態コードを`statusCode`、結果を`result`としました。

最後に、パラメータは「...」をクリックして、次のように入力します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/078eda77-1d7b-708f-e858-0d0b8df5917b.png)

ここではAPIリクエストのパラメータを設定していて、
名前がKeyに、値がValueになります。

### 動作確認用アクティビティ

動作確認・デバッグのために2つのアクティビティを追加しておきます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/c4bf20f9-202e-2c79-9129-69b63ff3aa42.png)

StatusCode checkとなっているのは、Ifアクティビティです。
先ほどのHTTP Requestアクティビティで状態コードが200以外、
つまりエラーの場合はワークフロー自体がエラーを返すようになっています。
（Throwはその場でエラーを返します）

Write text fileでは、結果をテキストファイルに書き出しています。
もし実行してうまくいかない場合は、このテキストファイルを確認すれば原因が特定できる場合があります。

### 他ワークフローから呼び出す

最後に、他のワークフロー（xamlファイル）から
このシーケンス（xamlファイル）を呼び出すように設定します。

任意のワークフロー（Mainなど）で、Invoke workflow fileアクティビティを追加します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/58aa2d0d-1551-2755-b48c-546ebe0f015b.png)

このアクティビティが実行されるタイミングで、
先ほど作成したslack_chat_postmessage.xamlの中身が上から順に実行されることになります。

引数の内容を渡す必要があるので、引数をインポート(Import Arguments)から設定します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/2d9b7f1a-9d8c-d204-c805-3abff71b8f02.png)

正しく引数を設定できていれば、名前は自動で入力されます。
`token`にはSlackのAPI Tokenを、
`channel`にはSlackのChannel IDを、
`text`には投稿したいテキストを、
それぞれ入力します。

今回は簡単に動作テストをするためテキストとしてベタ打ちしていますが、
実際に使用する際はワークフロー内で投稿する文章を作成して変数に入れていたりすると思うので、
そうした変数を値として渡すことになると思います。

一度、slack_chat_postmessage.xamlの部分を作成して保存してしまえば、
そのxamlファイルを他のファイルから呼び出すように設定するだけで、
面倒なAPI設定は編集することなく使い回せるようになります。

## 実行結果

Invoke workflow fileアクティビティを含むワークフローを実行すると、
このようにSlackにメッセージが投稿されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/318217/cc0dab0d-21be-1294-b8c2-5174ddc89cea.png)

（※完全に余談ですが、nanaseは私が好きなアイドルの名前です。テスト用に使ってます）

このファイル実行をUiPath Orchestrator等を使って定期実行するようにすれば、
毎日メッセージを投稿するようにすることも可能ですし、
ExcelレポートをRPAで更新した後、最後にSlackに通知を飛ばすといった使い方もできます。

## RPAを使ってみる意義

今回RPAを使ってbotを作成してみましたが、
エンジニアの方なら、

- プログラムで自動化すればいいじゃん
- RPAって、プログラミングの劣化版？

と思う方もいるかもしれません。

確かにエンジニアだとプログラムの方が慣れていたり、
そちらの方が自由度が高い部分も多々あると思います。

しかし、RPAは何より、非エンジニアでも習得コストが低く、扱いやすいというメリットがあります。

私はディレクターという立場で、非エンジニアでありつつ開発に片足を突っ込んでるような感じですが、
プログラムが書けないから業務が効率化できないのも、
社内の業務効率化のためにエンジニアが多くの工数を割くのも、
どちらももったいないなと感じています。

今回作成したようなパーツをいくつかつくっておくだけで、
開発工数をかけることなく業務の自動化が進められて
エンジニア・非エンジニア両方が嬉しい状態にできるので、
少しでも「あの開発で使えるかも！」と思って試していただけたら嬉しいです。

明日は、@tfactoryさんの『iPhoneで機械学習モデルを使って画像認識』です。
お楽しみに！

クリスマスまで続くGMOアドマーケティング Advent Calendar 2018
ぜひ今後も投稿をウォッチしてください！

■エンジニアによるTechblog公開中！
https://techblog.gmo-ap.jp/
■Wantedlyページ　～ブログや求人を公開中！～
https://www.wantedly.com/projects/199431
■エンジニア採用ページ　～福利厚生や各種制度のご案内はこちら～
https://www.gmo-ap.jp/engineer/
■エンジニア学生インターン募集中！　～有償型インターンで開発現場を体験しよう～
https://hrmos.co/pages/gmo-ap/jobs/0000027