ElectronのAdvent Calenderの12日目。もう師走でイルミネーションが綺麗な時期になりましたねー(投稿が遅くなって申し訳ありません)。
今回は、ElectronでのアドベントカレンダーということでElectronのデスクトップアプリでコマンドとかも実行できるというメリットを活かしてUiPathを使った業務自動化について取り組んで見ました。
目次
そもそもUiPathとは何か
UiPathは、最近話題になっているRPAという業務自動化ツールです。業務自動化ツールと聞くと、高いのでは?、とか、本当に自動的なことしかできないのではないか?、難しいのでは?などと思われがちですが、本当に普段やっている作業を機械にGUIで覚えさせながらプログラミングしていきます。しかも、コミュニティエディションが大手なのにちゃんと準備されています。
他のRPAツールと違ったUiPathのメリットとしては、
- コミュニティエディションが存在していて無料で使用できる(もっとも重要)
- コマンドラインから起動できる
- 本当にクリック操作だけでプログラミングできて、プログラミングに慣れていない人でも簡単に使用できる
- テストツールより機能が豊富
ありがとう、UiPath。有料版で導入したいですね…。
今回取り組みたいこと
今回は会社内でよくあるVBやCOBOLなどで書かれた数十年前(というと大げさですが)の塩漬けシステムのAPI化に取り組みたいです。
具体的には、
- WEB上でリクエストを投げる
- WEB上でのリクエストをFirebaseのRealtime Databaseを使用してElectronでキャッチ。
- UiPathでコマンドを起動してプログラミングを実施する。
- 完了した結果をAPIで返す
というフローで実現します。
※塩漬けシステムでやると大抵コンプライアンスに引っかかります。あくまでシステム部門内だけで実行するとか、デスクトップアプリの操作の自動化をWEB上からのリクエストで実現したいとか、そういう場合に限定してください。
※私の技術力的な問題もあって、セキュリティ強化であったりフォームバリデーションを実行していません。必要に応じたセキュリティ対策を必ず実行してください。
実際の実装例
では、やっていきます。
WEB上でのリクエストを投げる
WEB上でのリクエストでの投げ方といっても
- そもそもFirebaseをバックエンドで採用している場合
- LaravelやSymfonyなど、Firebaseの外からリクエストを投げる場合
の2つに大別されるのではないでしょうか。
今回はWEBでのリクエストをLaravelから投げたいと思います。
リクエストを投げるのにはktmas/firebase-phpを使用しバックエンドにlaravelを採用します。
public function testRequest(Request $request)
{
//Firebaseの処理を書き込む
$DEFAULT_URL = 'https://.....firebaseio.com/';
$DEFAULT_TOKEN = '..realtime databaseのシークレットトークン使用..';
$DEFAULT_PATH = '/test';
$firebase = new \Firebase\FirebaseLib($DEFAULT_URL, $DEFAULT_TOKEN);
// --- storing an array ---
$test = array(
"val1" => $request->val1,
"keido" => $request->val2,
);
$dateTime = date("Y-m-d_His");
$test1 = $firebase->push($DEFAULT_PATH, $test);
return $test1;
}
}
WEB上でのリクエストをFirebaseでキャッチ
前提として、Firebaseでユーザーアカウントを作成します(今回はEmail-password認証です)
この結果をElectron内のjsで読み込んでおきます(今回は、main.jsとは絡ませないでindex.htmlの中にjsへのリンクを設置しました。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Sample</title>
<link rel="stylesheet" href="./node_modules/milligram/dist/milligram.css"/>
<link rel="stylesheet" href="./css/index.css">
</head>
<body>
<script src="./commandAct.js"></script>
<script src="./firebaseLogin.js"></script>
</body>
</html>
以下がFirebaseの読み込み部分です。ほとんどサンプルままです。
ポイントは、firebase.database().ref()で取得したものに対しonメソッドでchild_addedイベントを読んでいる点です。これで、Firebase上にデータが投稿された時にchild_addedイベント内で定義されていることが実行されます。
firebase.auth().signInWithEmailAndPassword('Your-ID-Here', 'Your-Password-Here')
.then(function(result){
var childsToSee = firebase.database().ref('/test/');
console.log("step1");
childsToSee.on('child_added', function(snapshot){
var data = snapshot.val();
saveLoginInfo(data.val1, data.val2); //ここでコマンドを読み込む
});
},function(error){
var errorCode = error.code;
var errorMessage = error.message;
});
UiPathでコマンドを実行する
上のソースコードでsaveLoginInfoしたところから、別ファイルに移動します。
このファイルの中にUiPathの起動コマンドを入れます。
UiPathの入門サイトではないのでUiPathの設定方法は公式サイトに譲るとして、ここではコマンドの起動方法だけ。コマンドの起動は、
"(UiRobotの場所)" /file:"(UiPath定義ファイル)" /input:"{'arg1':'hello'}"
です。
これをjavascriptで無理やりかくと、下のようになります(prpgramPlaceはUiRobotの場所、configPlaceは定義ファイルの置き場です)。セキュリティの関係で詳細は省いています。コマンドの定義については公式を見てください。
var command = programPlace +' /file ' + configPlace +' /input:"'+"{'val1':'"+val1+"','val2':'"+val2+"'}"+'"';
ステップ2で読み込むsaveLoginInfoは、以下のようになります。なお、コマンドはNode.jsのexecを読み込んで使用しています。
const exec = require('child_process').exec;
const aws = require('./awsupload.js');
function saveLoginInfo(ankenid, ido, keido){
var results = document.getElementById('right_column').innerHTML;
var programPlace = '.(省略)./UiRobot.exe';
var configPlace = '.(省略)./test.xaml';
var filename = 'untitle.png';
var command = programPlace +' /file ' + configPlace +' /input:"'+"{'val1':'"+val1+"','val2':'"+val2+"'}"+'"';
exec(command, (error, stdout, stderr) => {
if(error){ //error処理をかく }
//resultsが戻ってくるので、実行結果を取得して投稿する
});
};
ここまで設定したらelectronのルートディレクトリで「electron .」を実行しましょう。最初は何もおきないですが、1で定義したAPIにデータを投げるとFirebaseにデータが追加され、デスクトップでアプリケーションが自動でぐるぐると動くのがみえるでしょう。
最後に:このアプリには問題がたくさん
今回自動化ということでアプリを作成しましたが、問題点がたくさんあります。
- セキュリティ対策が講じれていない(おそらくIPCを使わないで実装するのは本当はよくない)→特に売上などを操作する基幹システムの操作の自動化の際には、もっと綿密な設計が必要です
- Firebaseを噛ませている→一般のデスクトップでルーターの設定を変更しないでも実現できる方法…と考えてFirebaseを今回使用していますが、企業で使用する場合はNode.jsサーバーを普通に立ててSocket通信すればいいではないでしょうか。
- そもそもコンプライアンスに大きな問題がある(ここ重要)。→情シスの人はこういうチートをされないようにアプリケーションのインストール制限などを実行する必要があるのかもしれません。
ぜひ、仕事を任せられるところはRobotに任せ、関わる人が皆ハッピーになれるシステム開発を行なっていきたいものです。
なお、このホームページのホスティングをしているkvitancoでは、この技術は使用していません。全く別の会社のプロダクトで使用しています。