オープンソースで作るRPA - SikuliX-2.0.5の環境構築

## いそがしい人用
1. 64bit版Java 8 以降をインストールしておく。OpenJDK でOK。
1. [SikuliXダウンロードサイト](https://raiman.github.io/SikuliX1/downloads.html) から、
   **sikulixide-2.0.5.jar**ファイルをダウンロードする。
1. **sikulixide-2.0.5.jar**をダブルクリック

-----
## RPA(***R***obotic ***P***rocess ***A***utomation)とは

**RPA**(***R***obotic ***P***rocess ***A***utomation) は、人間が行うマウス・キーボード操作をパソコン自信に実行させる**ソフトウェア技術**です。

作業のRPA化（RPA技術を利用した自動化）は、RPAツールでシナリオ（パソコンの操作手順、ワークフロー）を作成し、RPAツールに実行させることによって実現します。

2019年ごろから官民でのRPA技術の利用が急速に広まり、2020年12月25日に閣議決定された[デジタル・ガバメント実行計画](https://cio.go.jp/digi-gov-actionplan)にも記載されました。
従前のマクロ技術ではカバーしきれなかった運用について、RPA技術による効率化が期待されています。

----
## SikuliXとは
SikuliXは自由度の高い**MITライセンス**で公開されているオープンソースのソフトウェアです。
MITの*User Interface Design Group*で2009年から***sikuli***プロジェクトの開発が始まり、2012年から名称を「SikuliX」としてRaiman氏が開発とサポートを引き継いています。
SikuliXは単に「シクリ」と呼ぶケースが多いようです。(シクリクス、シクリエックスと呼ぶこともあります)

* [sikulix公式HP(http://sikulix.com/)](http://sikulix.com/)
* [ダウンロードサイト(https://raiman.github.io/SikuliX1/downloads.html)](https://raiman.github.io/SikuliX1/downloads.html)
* [QAサイト(https://answers.launchpad.net/sikuli/)](https://answers.launchpad.net/sikuli/)

----
## SikuliXの機能
標準では OpenCV を利用した**画像認識**のRPAツールとして直感的に使うことができます。
Tessaractも備えており、画面内の文字を画像からテキストに変換する OCR 機能も含まれますが、標準では英数字のみです。日本語を扱う場合はTessaractの日本語ファイルを準備する必要があります。
また、別途モジュールを追加することで**オブジェクト認識**による操作も可能です。

本体は JavaVM 上で動作しますが、マウス・キーボード操作の命令(コマンド)はプログラミング言語Pythonで指定します。Jython2.7 が使われており、Python の命令文やモジュールは 3.x ではなく**2.7系**で行うことに理解が必要です。

----
## SikuliX-2.0.5 の環境構築
本記事の執筆時点(2022/8)で、SikuliX の最新安定板は**Ver2.0.5**です。
Ver2.0.4まではインストールが若干大変でしたが、Ver2.0.5からは
1. 64bit版Java8以降のインストール
1. SikuliX本体のJarファイルの入手して実行
の２点で利用可能になります。

----
#### 1. 64bit版Java8以降のインストール
Javaのインストール方法に指定はなく、64bit版Java8以降がインストール済みであればSikuliX用に追加インストールする必要はありません。
ディストリビューションについても、開発者の推奨は AdoptOpenJDK または Azul ですが、Oracle社OpenJDK、Amazon社Correttoなどでも問題なく動作します。

----
#### 2. SikuliX本体のJarファイルの入手して実行
* [ダウンロードサイト(https://raiman.github.io/SikuliX1/downloads.html)](https://raiman.github.io/SikuliX1/downloads.html)

上記から、**Download the ready to use sikulixide-2.0.5.jar (SikuliX IDE for all systems)** のリンクをクリックすると、Windows・Mac・Linux すべての環境で利用可能な SikuliX本体がダウンロードされます。 **Systemspecific versions of the SikuliX IDE** の項には OS ごとのファイルも用意されており、ファイルサイズの小さい実行ファイルを入手できます。
また、ダウロードページ下部にある「Download the ready to use sikulix**api**-2.0.5.jar」は、SikuliX本体の機能で利用する場合はダウンロード不要です。Javaプログラムから利用するときに使用しますが、本稿の説明からは割愛します。


実行手順について、以下、Windowsの場合で記載します。


ダウンロードされた**sikulixide-2.0.5.jar**を ダブルクリックするか、コマンドプロンプトから
```cmd:cmd.exe
java -jar sikulixide-2.0.5.jar
```
とすることで SikuliX がインストールされ、実行可能な状態となります。

SikuliX本体を実行するとツール(IDE)が起動します。ロケール対応されており、メニューバーなど最初から日本語表示されるので直感的に使うことができます。
![sikulix_ide.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425641/78c567e8-bd83-bbb0-c652-d67e2ed6d9c0.png)

:::note info
初回起動時、 `%APPDATA%\Sikulix` フォルダが自動的に作成され、SikuliXが使用するモジュールが配備されます。
バージョンが変わった場合など、動作が不安定になったときは、このフォルダを削除して起動しなおすと改善することがあります。
:::


----
## 動作確認

ここからはプログラム入力位置にマウス・キーボード操作のコマンドを記載することになりますが、コマンドリストなど入力支援機能はなく、[Sikuliスクリプトの完全ガイド(公式ヘルプサイト)](https://sikulix-2014.readthedocs.io/en/latest/index.html)などで調べる必要があります。

| よく使うコマンドコマンド | 動作 |
|:-|:-|
| **マウス操作** |
| click(【画像】) | 画面内から指定した画像を探して、画像の中心をクリックします。 |
| doubleClick(【画像】) | 〃 ダブルクリックします。 |
| rightClick(【画像】) | 〃 右クリックします。 |
| mouceMove(【画像】) | 〃 マウスを移動します。 |
| drugDrop(【画像1】, 【画像2】) | 画像１から画像２までドラッグドロップします。 |
| **キーボード操作** |   |
| type("A") | 「A」キーを押下します。 |
| type(Key.ENTER) | Enterキーを押下します。 |
| type("c", Key.CTRL) | Ctrl+Cのホットキーを押下します。修飾キーは後ろに指定します。 |
| paste(u"日本語") | カーソルの位置に指定した文字列をペーストします。 |
| **実行制御系** |
| wait(10) | 10秒間待機します。 |
| wait(【画像】) | 画面内に指定した画像が見つかるまで最大５秒待機します。 | 
| wait(【画像】, 10) | 画面内に指定した画像が見つかるまで指定した秒数を最大に待機します。 | 


コマンドへは画像を指定することになりますが、メニューバーの機能を利用することで簡単に指定することができます。メニューバーの７つのボタンはそれぞれ次の用途に使用します。
| ボタン名 | 機能 |
|:-|:-|
| スクリーンショットを撮る | 画面内からクリックしたい場所などの画像を切り取ります |
| 画像を挿入する | 取得ずみのスクショをプログラムに反映できます。 |
| Region | 処理を行う範囲を指定します。 |
| Location | 画面左上を(0, 0)とした座標で位置を指定します。 |
| Offset | 相対距離を指定します。 |
| 実行 | プログラムを実行します。 |
| スローモーションで実行 | **マウス操作のみ**ゆっくり操作します。 |


以上を踏まえ、「表示ずみのGoogle検索窓に `Qiita 記事 ランキング` と入力して検索する」シナリオは、下記のように作成します。
__① プログラム入力位置に下記を入力する。__
```python: samle.sikuli
click()
paste(u"Qiita 記事 ランキング")
type(Key.ENTER)
```
__② click() のカッコとカッコの間にカーソルを合わせ、「スクリーンショットを撮る」を押下する。__
__③ 画面が暗転するので、検索窓全体をドラッグする。⇒プログラム入力位置に画像が反映される。__
__④ 「実行」を押下する。__
__⑤ ファイル名入力ダイアログが表示されるので、任意の名前を入力する。__
**↓↓↓ 完成系 ↓↓↓**
![sikulix_ide_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425641/9a1b57f1-6bd4-5a02-47e5-ae85e6b298ca.png)
実行ボタンを押すと SikuliX IDE が非表示になり、検索窓に文字を入力する動作が実行されます。処理が完了すると、IDE が再表示されます。

初めて見たときは、「プログラム内に画像が表示されている！」「画像がclick関数の引数になってるの？！」と驚きましたが、実際は画像部分がサムネイル表示になっていて、表示を切り替えると画像のファイル名が設定されていることがわかります。
![sikulix_ide_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/425641/ae719bfa-70ef-fa61-1e1a-c2cb10816ada.png)

SikuliXに用意されているコマンドの組み合わせて、Google検索の自動化を行いました。
繰り返し処理や条件分岐などは、Python2.7の記法を利用して実現します。


----
## 参考情報
* [公式のSikuliX IDE QuickStart](http://sikulix.com/quickstart/)がバージョン2.0.1向けだったため、情報を整理してみました。
* [開発者Github](https://github.com/RaiMan/SikuliX1)では、2.1.0 の開発が進められているようです。レコーディング機能の搭載を企画されており、今後の機能強化が期待されます。