【クラウドBOT】+【integromat】で差分検知・自動通知の仕組みを構築

今回は、「導入しているシステムの障害情報をいちはやく知りたい」という営業部からの要望で、**「メーカーのニュースページを定期的に監視し、障害情報が更新されていれば、営業担当にメールで通知する」**という検知の仕組みを構築しました。

毎度おなじみのクラウド型RPA 『**クラウドBOT**』とiPaaS『**Integromat**』を使用して構築しています。

#自動化したフローについて
1.監視対象のWebサイトからニュース一覧を取得
2.スプレッドシートから過去のニュース一覧を取得
3.現在のニュース一覧と過去ニューズ一覧を比較
3.差分があれば、新着としてスプレッドシートに追記し、メールで通知

一見プログラムでサクッと実装してしまえそうな内容ですが、実際に運用しようとすると「比較するための過去のニュース一覧をどこに書き出しておくか」、「どうやって定期実行するか」など色々考えなければいけない事が多く、実際は結構面倒だったりします。

今回は**クラウド型RPA**を用いて**定期的にスクレイピング**を実施し、iPaaSを連携する事で**差分の抽出とスプレッドシート書き込み、メール通知**を行いました。


##今回のポイント
**・完全クラウドで全ての自動化が完結する**
**・サーバなどの環境構築が不要**
**・ノーコード(一部ローコード)で作成できる**
**・integromatで配列処理**

##フローの全体図(integromatから)
![全体図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/f9abd808-5be6-aeaa-8ec5-018e19b7e901.png)


#具体的な構築の手順
##①クラウド型RPAでニュース記事一覧を取得するロボットを作成する
まずは、クラウド型のRPAサービス『クラウドBOT』を使用して、Webサイトからニュース一覧を取得するロボットを作成します。
(※今回はロボットの作成手順についても、詳しく書いていきたいと思います。)

###1.クラウドBOTのサービスサイトにログインし、ロボットを作ります。
URL:https://console.c-bot.pro/login
ダッシュボードの「BOTを作る」ボタンをクリックすると、ロボットを作成するための画面が開きます。
![01.クラウドBOT_ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/cf6a9d69-4c69-b41c-f17d-c9b5d406f1f3.png)

###2.ロボットを作成するための画面が開きます。(以降エディタ画面とします。)
このエディタ画面に操作の対象となるニュースサイトのURLを入力し、虫眼鏡ボタンをクリックします。
![02.エディタ_URL入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/8ebc2156-695e-1d88-ac69-1f30f0c09779.png)

###3.エディタ画面に操作の対象となるWebサイトが表示されます。
画面左のサイドメニューを開き、「ブラウザ操作を記録する」というボタンをクリックします。
![03.エディタ_対象ページへアクセス.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/d6a0250e-1d8c-16e3-4422-dbe11dbffe88.png)

###4.操作の記録が始まります。
このあと、右側に表示されているWebサイト内で行った操作が自動的に記録されていきます。
![04.エディタ_記録開始.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/d9c94bd7-9386-fdab-c7d7-34537d40538b.png)

###5.ニュース一覧を取得します。
クラウドBOTは、HTML内から繰り返しになっている構造を見つけ出し、**グループ**として認識させる事ができるようになっています。今回のように一覧データを取得したい場合、まずはグループとして認識させた後に、取得したい項目をコピーしていく流れになります。
以下で詳しい手順を解説します。

####5-1.ニュース記事の1行目の部分をクリックします。
赤い枠が表示され、クリックした部分が選択されます。
もう一度同じ場所でクリックを行うと、メニューが表示されます。
表示されたメニューの中から「グループ範囲を探す」をクリックします。
![05-1.エディタ_グループ作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/927aabe0-9b11-3cb9-96cd-af96bd921545.png)

####5-2.選択範囲を広げ、グループとなる構造を探します。
「選択範囲を広げる」を何度かクリックし、グループとなる構造を探します。
以下のように、選択した部分と同じ構造になっている部分が青色になって表示されるように選択範囲を広げて行きます。
※もし、広げすぎてしまったり、間違えてしまった場合は一度「キャンセル」をクリックし、5-1からやり直して下さい。
![05-2.エディタ_グループ範囲選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/57754df5-5fb9-3b58-4f76-a66d746f84c7.png)

####5-3.グループを作成します。
繰り返し操作したい部分をうまく見つける事ができたら、「グループを作る」をクリックし、グループを作成します。
![05-3.エディタ_グループを作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/f0d32414-2cbc-bef1-9793-c228d6642085.png)

####5-4.グループが完成しました。
画面左にグループ1という青いタスクが作成されます。この中で記録した操作が、一覧の件数分繰り返されます。
![05-4.エディタ_グループを作成完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/c3c9605a-f8ad-ae3b-b11d-4d70cbfe1920.png)

####5-5.一覧から日付をコピーします。
画面右のWebサイト画面から、日付をコピーします。1行目の日付の部分を選択し、メニューから「テキストをコピー」を選択します。
![05-5.エディタ_データをコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/119d3b13-3115-a1a5-3d13-9b8733b68f2a.png)

####5-6.データの名前を入力します。
データ名を指定する必要がありますので、”日付”としておきます。
![05-6.エディタ_コピー名入力.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/b7672fb0-57f9-5c67-4712-7eb39884e909.png)

####5-7.グループ処理を完了させます。
同様の手順で、タイトルもコピーします。
グループ内で操作の記録が終わったら、「グループ処理を完了」をクリックします。
![05-7.エディタ_タイトルもコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/733e9ce4-dd19-ff5c-2f7b-19557eadd597.png)

####5-8.一覧データが取得できます。
一覧の件数分「日付」と「タイトル」がコピーされ、以下のような画面になります。
![05-8.エディタ_グループ完了.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/ff46eb55-3f1f-7521-9c54-2c115ea2f02e.png)

###6.データビューアを確認します。
画面左下の「ビューア」をクリックするとロボット内で扱っているデータの一覧を見る事ができます。
「グループ1」のタブに切り替える事で、ニュース一覧が取得できている事が確認できます。
「OK」を押してビューアを閉じます。
![06.エディタ_ビューア確認.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/c5b133e5-41a1-180a-0502-d53c11e76586.png)

###7.最後にロボットの名前をつけます。
エディタ画面左上の「保存」ボタンをクリックすると、以下のようなBOTの設定を行うウィンドウが開きます。
BOT名を入力し、画面下の「保存」ボタンをクリックします。
これで、ニュース一覧を自動取得してくれるロボットが完成しました。
![07.エディタ_ロボットを保存.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/1c850a7b-11a1-b04f-9442-f31108ec203d.png)

###8.作成したロボットを実行してみます。
作成したロボットがダッシュボードに追加されますので、「実行する」ボタンで実行してみます。
![08.ロボットを実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/e61a28ff-4f86-e519-2273-08fe16265f5b.png)
実行画面が表示されますので、このまま「実行」をクリックします。
![08-2.ロボット実行画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/3239d767-843a-d4e7-6a49-9c86aa6c425d.png)

###9.実行結果を確認します。
ニュース一覧が取得、表示されていればロボットは完成です。
![09.実行結果画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/584e193e-3613-aab1-39fc-584561f51c80.png)

###10.ロボットを定期実行させます。
スケジュール登録を行う事で、作成したロボットを定期的に実行させる事ができます。
画面左のメニューから、「スケジュール」を選択し、「スケジュールを登録する」をクリックします。
![10.スケジュールを登録する.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/ef192274-79e2-5c86-0c08-bf429ac955e7.png)

###11.定期実行の設定をします。
スケジュール設定の画面が開きますので、画面左側で実行したい間隔や条件を設定します。ここでは、**毎時0分**に定期実行するように設定しています。画面右側で実行するロボットを選択します。
先程作成した「障害情報の一覧を取得する」ロボットを選択します。
最後に「登録する」ボタンをクリックして設定完了です。
![11.スケジュール設定画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/a1de993a-f7f3-ae14-939e-a85d58e13ad6.png)
※クラウドBOTのスケジュール機能は有料プラン(3000円/月)への加入が必要です。

##②iPaaSでニュースに新着があった場合に通知するフローを構築する
『クラウドBOT』で作成したロボットの実行完了をトリガーとして、integromatのフローを実行します。
過去の一覧と比較し、差分があった場合は新着情報として担当者にメールで通知します。

###事前準備.スプレッドシートを作成します。
通知済みのニュースを書き出すためのスプレッドシートを用意しておきます。
※同じ通知を何度も送信する事を防ぐために使用します。
![0.スプレッドシート作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/6c28168d-c8c1-e783-6d2a-e24d689e527c.png)

###1.integromatのサービスサイトにログインし、シナリオを作ります。
URL:https://www.integromat.com/en/login
ダッシュボードの「Create a new scenario」ボタンをクリックすると、フローを作成するための画面が開きます。
![01.integromat_ダッシュボード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/632fcd81-a1fd-ffee-5d3c-9ff33b71ceaa.png)

###2.クラウドBOTのモジュールを追加します。
「cloud bot」で検索し、クラウドBOTのモジュールを追加します。
![2.クラウドBOTモジュールを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/7aadd654-5940-b772-4578-8703bd10bba0.png)

####2-1.クラウドBOTをトリガーとして設定します。
「Watch BOT Done」を選択します。
"BOTの実行が終了したら"という条件になります。
つまり、クラウドBOT側でロボットの定期実行が完了した時点で、このフローが実行される事になります。
![03.トリガー設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/2d4a5c0b-4d67-8b8f-5be4-8ecee83eb6d2.png)

####2-2.Webhookの設定を行います。
integromatとクラウドBOTの連携を行い、webhookの設定を行います。
![04.webhook設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/744b6dbf-22ea-dfb5-d080-ff0b317a7917.png)

###3.Google Sheetのモジュールを追加します。
「google sheet」で検索し、クラウドBOTのモジュールを追加します。
![05.GoogleSheetモジュールを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/603d43ca-db7c-8d83-90dc-2664963f5d7c.png)

####3-1.事前準備で作成したスプレッドシートからニュース一覧を取得します。
今回は「Search Rows」を使用し、事前に作成しておいた、スプレッドシート「障害情報一覧」から一覧を取得します。
![06.SpreadSheetのアクションを設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/10b5b83b-97b5-ab20-d7f1-e86f59a3de7c.png)
####3-2.モジュールの設定を行います。
スプレッドシート内から、日付が入っている行だけを取得しています。
![06-2.一覧取得モジュール設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/2d46d2fa-5123-3678-263a-ab6d8203690e.png)
一度ここまでを実行してみます。
・クラウドBOTから、現在Webサイトに掲載されているニュース一覧が取得できています。(以後、<font color="Blue">"**現在のニュース一覧**"</font>とします。)
・スプレッドシートから過去に通知済みのニュース一覧が取得できています。(以後、<font color="Green">"**過去のニュース一覧**"</font>とします。)
![03-3.テスト実行.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/07dec08b-5f76-7117-209a-9cb6ac0e2d9a.png)

####3-3.スプレッドシートから取得した内容を配列に変換します。
「Array aggregator」を使用し、スプレッドシートから取得した<font color="Green">"**過去のニュース一覧**"</font>を配列に変換しておきます。
![03-3.配列に変換.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/bd114609-59c8-14df-8658-a18ae206d485.png)

###4.差分を検出します。
あとは、クラウドBOTから取得した<font color="Blue">"**現在のニュース一覧**"</font>の中で、<font color="Green">"**過去のニュース一覧**"</font>に存在しない物を検出する流れになります。
<font color="Blue">"**現在のニュース一覧**"</font>を「Iterator」を使用してループ処理する中で、全く同じタイトルが<font color="Green">"**過去のニュース一覧**"</font>に存在しないかを1件ずつチェックします。

####4-1.Iteratorを追加します。
クラウドBOTから取得した、<font color="Blue">"**現在のニュース一覧**"</font>のタイトルをIteratorでループ処理します。
![04.Iteratorを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/fda04558-03d0-914d-2b15-5293c0adc95d.png)
設定はこんな感じです。
![04-1.Iteratorの設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/b2478c15-2332-d4b3-67a7-fef36fc518bc.png)

####4-2.スプレッドシートへの書き込みモジュールを追加します。
「Add a Row」を用いて、クラウドBOTから取得した<font color="Blue">"**現在のニュース一覧**"</font>を追記しています。
![04-2.スプレッドシートモジュールを追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/bbd4d643-8a56-cce3-c31a-5079157e2c91.png)

####4-3.書き込みを新着のみに制限します。
このままでは、クラウドBOTから取得した<font color="Blue">"**現在のニュース一覧**"</font>が全てスプレッドシートに追記されてしまいますので、integromatのフィルタ機能を使用して、事前に取得していた**<font color="Green">"過去のニュース一覧"</font>に存在しない場合のみスプレッドシートへの書き込みを行う**ようにしています。
![04-3.フィルタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/4b902dde-dd87-5b95-0ac7-27781b632c39.png)
この部分が少々複雑であり、<font color="DarkRed">**今回の記事の最大のポイント**</font>です。

まず、integromatのmap関数を使用してArray Agregatorで作成した<font color="Green">"**過去のニュース一覧**"</font>の配列を、配列内検索が可能な状態に整形しています。
次に比較条件で「Does not contain」を選択し、”配列内に存在しなければ”という条件を指定しています。
最後に、上で指定した<font color="Green">"**過去のニュース一覧**"</font>の配列に対して検索する文字列を指定しています。ここは、クラウドBOTから取得した<font color="Blue">"**現在のニュース一覧**"</font>の配列をIteratorでループする中で、タイトルを1件ずつ参照しているイメージになります。

###5.メール送信モジュールを追加する。
ここまで来ればあとは簡単です。先程設定したフィルタ以降のフローは条件を満たしている場合のみ実行されますので、最後にメール送信を行うモジュールを追加して、担当者に通知するように設定します。
Gmailの場合はこんな感じです。
![05.メール通知設定.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/459104/45cab9fb-59be-e01e-5273-5eb9c17b65d7.png)
メール以外にもチャットアプリなどに通知しても便利そうですね。

#さいごに
差分を検知して何かアクションを行いたいという自動化の要望は案外多いのではないでしょうか。integromatを使用すると手軽に実装できるのでおすすめです。
integromat内での配列操作に関するドキュメントがあまり見当たらないので、どこかのタイミングで配列操作の部分だけをまとめて記事にしておきたいと思います。
最後まで目を通して頂き、ありがとうございました！