【OpenRPA/OpenFlow】Node-REDを使ってRestAPI経由でシナリオ実行する

OpenRPAの管理サーバーであるOpenFlowには、Node-REDというフローベースの開発ツールが付属しています。
Node-REDを使うと、RestAPI経由でOpenRPAのシナリオ実行をできるということがわかったので、その方法を紹介したいと思います。

# まずはシナリオを作る

動けばなんでも良いですが、簡単なシナリオを作ってみましょう。
前提として、[前回の記事](https://qiita.com/yoshiyuki-iwata/items/0ea7d787441a661d2624)の通り、OpenRPAとOpenFlowのセットアップが完了していることとします。

## プロジェクトとワークフロー作成

リボンから、[New] - [New Project] を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/f77cb08e-23b7-22c8-bb25-28c558cc8d68.png)

プロジェクト名を適当に入力します。
ここでは、「SampleProject」とします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/378ae52a-7585-ca8e-f97a-eca50620bdee.png)

自動的にワークフローも作成されます。
UiPathを触ったことがある人には、なんとなく見覚えのある画面ですね。
ワークフローの名前も変えておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/7603c745-eb3e-73db-8b33-0accf038aa43.png)


## シナリオ作成

実用性のないシナリオですが、名前を引数で受け取り、文字列を返すようなシナリオを作ります。

### 引数の作成

こんな感じで作ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/19b32d68-1bf4-c509-d8ea-503b32ffde12.png)

| 引数の名前 | 方向 | 引数の型 |
|:---------:|:----:|:-------:|
| name      | 入力 | String  |
| result    | 出力 | String  |

``name``は受け取る引数なので「入力」とします。
``result``は結果として返したいものなので「出力」とします。
このあたりはUiPathと変わらないですね。

### アクティビティを追加

``System.Activities.WriteLine`` と ``System.Activities.Assign`` を使って、こんな感じのフローを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/9de62ff6-5d81-444c-1b76-f639158b59a3.png)

それぞれのアクティビティの設定内容は、以下の通りです。

#### 最初のWriteLine

| プロパティ    | 設定内容              |
|--------------|----------------------|
| Text         | ``"name = " + name`` |

#### Assign

| プロパティ    | 設定内容                        |
|--------------|--------------------------------|
| To           | ``result``                     |
| Value        | ``"My name is " + name + "."`` |

#### ２つめのWriteLine

| プロパティ    | 設定内容                 |
|--------------|-------------------------|
| Text         | ``"resut = " + result`` |

### とりあえず動かしてみよう

引数の既定値を設定して、保存しましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/cb283feb-5f80-b63c-f49a-921a408044ec.png)

F5キー もしくは [Play]ボタンを押すと動きます。
Loggingを開くと、``WriteLine``の内容が出力されていることを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/e36cedff-fb49-a66a-a8b5-7e298e65c136.png)

# OpenFlowからのシナリオ実行

OpenRPAでシナリオを保存すると、OpenFlowにも反映されます。
即時実行であれば可能なので、動かしてみましょう。

## OpenFlowを起動

ブラウザから、http://localhost.openrpa.dk を開きます。
OpenFlowセットアップ時に登録したユーザーでログインします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/bf94ceb1-1fe1-0dc4-53a9-37e0c5f72e3d.png)

上部のメニューから [RPA Workflows]を選択すると、OpenRPAで作成したワークフローが表示されるはずです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/e9d45d55-1187-d828-928e-ff6778028113.png)

## 実行してみる

では直接実行してみましょう。
前述の画面で、[Invoke]リンクをクリックすると、実行画面が表示されます。

``Name (System.String)``のテキストボックスに、引数[name]の値を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/d7ca08bb-c7c7-724a-4b78-17eb9699adcf.png)

[Invoke]をクリックすると、``result (System.String)``に結果が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/6ed73e14-e895-3322-3c21-eeced7dc0d03.png)

OpenRPAの画面を見ると、動いていることがわかりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/a3b70240-d889-11db-f7f8-dc6757c89979.png)


# Node-REDの設定

次に、Rest API経由でシナリオを動かすために、Node-REDでフローを作成します。

## Node-REDの起動

ブラウザから、http://localhost.openrpa.dk:1880 を開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/89bab453-6851-696e-ba3b-d75aa91ca301.png)

OpenFlowでログインしていない場合は、上記のようにログイン画面が表示されます。
[Sign in with SAML] を押すと、OpenFlowのログイン画面に移動するので、ログインしましょう。

## フローの作成

Node-REDを使うと、ノードを繋げていくことで、簡単にRest APIを作ることができます。
今回は、``http in``、``robot``、``http response``の３つのノードを使用します。

### http inの配置

こんな感じでドラッグして配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/21376c67-a366-0be7-aba3-ac009716bcf7.png)

配置したノードをダブルクリックすると設定画面が表示されるので、以下のように設定し、完了ボタンをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/5c7bafed-4948-68ec-d58f-b2b7323ff3ce.png)

| メソッド | URL | 名前 |
|:-:|:-:|:-:|
| POST | /rpa/mynameis | http POST |

### robotの配置

こんな感じでドラッグして配置します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/116a336d-42ee-1984-3352-0b6d527b9495.png)

ダブルクリックして設定画面を表示し、設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/eabbcaba-fd70-39c3-7119-bccfe53475c8.png)

| Robot | Workflow | Local queue name | Name |
|:-:|:-:|:-:|:-:|
| 任意 | SampleProject/SampleWorkflow | 空欄 | SampleWorkflow |

Robotは、自分のユーザーIDのものを選択します。

### http responseの配置

配置して

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/87d069f2-2de4-8998-1783-a18bd1793af3.png)

設定します。
設定は名前だけなので、適当でいいです。
ここでは、http Responseとしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/211c3fff-8911-ae4c-36ba-553aa6807ca7.png)

### つなげる

あとは、http POST → SampleWorkflow → http Response の順番で線を引いていきます。

<font color="red">**注意**
今回は正常系のフローしか作らないので、SampleWorkflowから出る線は、一番上の ``completed``（シナリオの正常終了時）から引いてください。</font>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/3ab2c4e3-5354-b3a1-9edc-739008e039b3.png)

### デプロイ

右上にある「デプロイ」ボタンを押し、以下のように「デプロイが成功しました」というメッセージが表示されれば成功です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/a89b79be-bbbf-ebc9-ef99-b58c918d0e0d.png)

## 動かす！

このAPIはPOSTで作成したので、何かPOSTできるツールを使ってください。
今回は、ChromeプラグインのTalend API Testerを使用しています。

http://localhost.openrpa.dk:1880/[設定したURL] に対して、POSTします。
ヘッダーには、``Content-Type``と、Basic認証の``Authorization``を含めます。認証情報は、ログインの時に使用するユーザー名とパスワードです。
また、シナリオの引数はJSONで記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/315a4eae-50c8-6c9f-c300-1f887494f412.png)

実行すると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/faa77a40-25cd-ca44-7919-9088955b7a4d.png)

動きました！

# おわりに

OpenRPAをスケジュール実行する方法について、[前回の記事](https://qiita.com/yoshiyuki-iwata/items/0ea7d787441a661d2624)のコメントで開発者の方からヒントを頂いていました。

> @skadefro
> You have many options. You can use an external scheduler and call the robot from command line. You can create a time triggered workflow using a statemachie and delay, you can call it from NodeRED using one of the many schedulering modules. You can run that both locally and remote, you can read more about hose options here https://github.com/open-rpa/openrpa/issues/154#issuecomment-654017597


1. 外部のスケジューラー（タスクスケジューラーなど）を使って、コマンドライン実行する
2. Statemachineとdelayを使って、タイムトリガーワークフローを作る
3. Node-REDのスケジュールプラグインを使う

上記について調べている途中で、今回紹介した方法もあることがわかりました。
例えば、JP1等のスケジューラーからRestAPIキックすることもできそうです。

ちなみに2.と3.だと、スケジュールを変えたい時に シナリオの修正 もしくは Node-REDフローの修正＆再デプロイが必要になるので、ちょっと運用が難しそうな気がしています。

OpenFlowの管理画面から簡単に設定できれば良いのですが・・・
今のところそのような機能はなさそうなので、今後のバージョンアップに期待したいところです。