OpenRPAとNode-REDを使ってLINEBotに連携してみよう

RPAとLINEBotを組み合わせたら何か面白いことができるんじゃないかなぁと思い、技術的に可能なのか試してみました。
サービスとして提供できるネタが思いついてないので、シナリオは適当なものですが・・・


# 構成

やりたいことを簡単に説明するとこんなかんじ。
OpenRPAでシナリオを実行し、その実行結果をLINEのMessaging APIで、登録ユーザーにブロードキャスト送信します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/922c62d2-5424-b781-ebd8-b5b1aa037cbe.png)

# 必要なもの

### OpenRPAとOpenFlow/Node-RED

以下の私の過去記事を参考にしてください。
一応、以下の記事に書いてあることを前提とさせていただきます。

[【OpenRPAの集中管理サーバー】「OpenFlow」をセットアップしてみる](https://qiita.com/yoshiyuki-iwata/items/0ea7d787441a661d2624)
[【OpenRPA】「OpenFlow」と「NodeRED」をローカルインストールしてみる](https://qiita.com/yoshiyuki-iwata/items/c1b09f4e06ed954515e4)

### LINE公式アカウント

LINE公式アカウントを作成し、LINE Messagin APIを使える状態となっていることを前提とします。
作成方法はQiita内にもたくさんありますし、ググってもたくさんでてくるので省略しますが、後ほど「チャネルアクセストークン」が必要になるので、発行しておいてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/90d32b0b-44f3-d9cf-ef21-9fce3e4467f0.png)



# RPAシナリオの作成

OpenRPAでシナリオを作ります。
こんな感じです。超適当です。ごめんなさい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/0eaa7278-9f7c-fe2a-2718-10d1cbe40fe3.png)

現在の時刻を返すだけのシナリオです。

## OpenFlowから動作確認してみよう

Invokeボタンを押して、`resultMessage`の結果表示が正しいことを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/e5dbc4c3-a4f0-1907-6af6-af6c3cc3ad9c.png)

# Node-REDで定期実行フローを作る

OpenRPAとLINEBotを連携するために、Node-REDでフローを作ります。

前回、前々回の記事でNode-REDを触っている記事を書いていたのに、実はNode-REDで何ができるのかよくわかっていませんでした。
今回の検証で、Node-REDが（ほぼ）ノーコードでいろいろなことができるということがわかりました。

## ざっくり概要説明

+ 時刻トリガー的なものを使って(Inject)
+ RPAシナリオを呼び出し(robot)
+ その結果をJSONにして(function)
+ LINE Messaging APIに投げる(http request)

()の中は、Node-REDで使うノードです。

## できたものがコチラ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/113ba16f-38fd-d2df-96bd-e14eb6bb2c18.png)

以下のコードを読み込むことで、新しいフローを作成できます。

`注意その１`
functionの中で、`{チャネルアクセストークン}`となっているところがあるので、最初に書いたLINE Messaging APIで発行したチャネルアクセストークンに書き換えてください。（中括弧は残してください）

`注意その２`
rpa workflowの、`Robot`と`Workflow`はそれぞれ作成したものに変更してください。


``` json:
[
    {
        "id": "cf3bd9fd.870718",
        "type": "tab",
        "label": "フロー 3",
        "disabled": false,
        "info": ""
    },
    {
        "id": "e15009ca.a97208",
        "type": "inject",
        "z": "cf3bd9fd.870718",
        "name": "",
        "props": [
            {
                "p": "payload"
            },
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "",
        "crontab": "*/15 0-22 * * 1,2,3,4,5",
        "once": false,
        "onceDelay": "",
        "topic": "",
        "payload": "15分毎に実行",
        "payloadType": "str",
        "x": 120,
        "y": 40,
        "wires": [
            [
                "1ef8c306.70f0bd"
            ]
        ]
    },
    {
        "id": "1ef8c306.70f0bd",
        "type": "rpa workflow",
        "z": "cf3bd9fd.870718",
        "queue": "5f5ad43efd5ced538c1b3015",
        "workflow": "5f73edf7ef7e7517ac8fe132",
        "localqueue": "",
        "name": "RPAシナリオ呼び出し",
        "x": 220,
        "y": 180,
        "wires": [
            [
                "f4ecda03.f04498"
            ],
            [],
            []
        ]
    },
    {
        "id": "b1f276da.4a3bb8",
        "type": "debug",
        "z": "cf3bd9fd.870718",
        "name": "",
        "active": true,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "true",
        "targetType": "full",
        "statusVal": "",
        "statusType": "auto",
        "x": 690,
        "y": 280,
        "wires": []
    },
    {
        "id": "f4ecda03.f04498",
        "type": "function",
        "z": "cf3bd9fd.870718",
        "name": "",
        "func": "var post_request = {\n    \"headers\": {\n        \"content-type\": \"application/json; charset=UTF-8\",\n        \"Authorization\": \" Bearer \" + \"{チャネルアクセストークン}\"\n    },\n    \"payload\": {\n        \"messages\": [\n            {\n                \"type\": \"text\",\n                \"text\": msg.payload.resultMessage\n            }\n        ]\n    }\n};\n\nreturn post_request;",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "x": 480,
        "y": 180,
        "wires": [
            [
                "9840e344.a36b7"
            ]
        ]
    },
    {
        "id": "9840e344.a36b7",
        "type": "http request",
        "z": "cf3bd9fd.870718",
        "name": "Broadcast Message",
        "method": "POST",
        "ret": "obj",
        "paytoqs": "ignore",
        "url": "https://api.line.me/v2/bot/message/broadcast",
        "tls": "",
        "persist": false,
        "proxy": "",
        "authType": "",
        "x": 480,
        "y": 280,
        "wires": [
            [
                "b1f276da.4a3bb8"
            ]
        ]
    }
]
```

## 動作確認

作成したLINE公式アカウントをフォローしましょう！
フォローしていなかったら送信されたのかどうかわからないですからね・・・

Injectのこの部分を押すと、このフローが即時で実行されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/c3f60128-a993-a176-b191-31120355ca23.png)

きたー！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/a4827a59-0be9-e4ac-fdfd-645afdcc6e66.png)

## 動作確認２

Injectの繰り返し設定は、以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/6e039883-aebd-d8c3-5ba5-8f9c93b0bb25.png)

次の15分単位まで待ってみると・・・

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517338/554c50fc-4217-7646-4b2f-c12d6cce8cec.png)

きたー！

# おわりに

今回はブロードキャスト（フォローしている全員に送信）なので、RPAでやる意味はあまりないかもしれません。
マルチキャスト（特定のユーザーに送信）であれば、何かできそうな気が・・・

また、チャットBOTとしてユーザーのメッセージに対して、RPAで処理した結果を返信することもできるかも？と思いました。
（デスクトップ操作系だと、複数ユーザーの同時処理がうまくいかないかも）

次回以降、マルチキャストとプッシュも試してみたいと思います。