Sikuli - 画面周りの操作メソッド一覧

Sikuliの画面周りメソッドを知っておくと便利なことがいろいろあります。

例えば、getLastMatch()は最後に画像マッチしたオブジェクトをそのまま返してくれるので、waitで画像を見つけた後にclickするとき同じ画像ではなくgetLastMatch()を引数に設定すると、再検索する必要がなく処理が速くなるのでもっともよく使う関数の一つです。

また画像検索メソッドではタイムアウト(デフォルトで3秒)する時間を設定することができますが、setAutoWaitTimeoutを使えば一括で設定することができます。

画面周りの操作に関するメソッド

メソッド 概要
getScreen() 領域を構成するScreenオブジェクト返す。
getLastMatch() 最後に画像マッチした最も類似度が高いMatchオブジェクトを返す。
getLastMatches() 最後に画像マッチしたすべてのMatchオブジェクトを返す。
getTime() 最後に検索してから経過した時間(ミリ秒)を返す。
isRegionValid() Regionが有効かどうか。
setAutoWaitTimeout(seconds) 操作の際の自動待ち時間を設定する(秒)。
getAutoWaitTimeout() 操作の際の自動待ち時間を取得する。
setWaitScanRate(rate) 画像マッチングの際のスキャンレートを設定する。
getWaitScanRate() スキャンレートを取得する。

Sikuli - キー入力と特殊キー/修飾キー一覧

Sikuliでキー入力するにはtypeメソッドを使います。

1
type(画像など[省略可], 入力文字, 修飾キー)

入力文字は「a」「b」「c」などのキー1文字や次の表のような特殊キーを指定することができます。
(1文字の指定しかできませんので、複数の文字を設定したい場合はpasteメソッドを使うことになります。)

特殊一覧

特殊キー定数 意味
Key.ENTER Enterキー
Key.TAB Tabキー
Key.ESC ESCキー
Key.BACKSPACE BSキー
Key.DELETE DELETEキー
Key.INSERT INSERTキー
Key.SPACE スペースキー
Key.F1~Key.F15 ファンクションキー
Key.HOME HOMEキー
Key.END ENDキー
Key.LEFT,Key.RIGHT,
Key.DOWN,Key.UP
カーソルキー群
Key.PAGEUP,Key.DOWN PageUp,PageDownキー
Key.PRINTSCREEN PrintScreenキー
Key.PAUSE Pauseキー
Key.CAPS_LOCK CapsLockキー
Key.SCROLL LOCK ScrollLockキー
Key.NUM_LOCK NumLockキー
Key.NUM0~Key.NUM9 テンキーの数字「0」~「9」
Key.SEPARATOR テンキーの「.」
Key.ADD テンキーの「+」
Key.MINUS テンキーの「-」
Key.MULTIPLY テンキーの「*」
Key.DIVIDE テンキーの「/」

修飾キーは次のキーを指定することができます。

修飾一覧

修飾キー定数 意味
Key.CTRL Ctrlキー
Key.SHIFT Shiftキー
Key.ALT ALTキー
Key.META METAキー(WindowsキーまたはMacのCommandキー)
Key.CMD Commandキー
Key.WIN Windowsキー
Key.ALTGR [Ctrl]と[Alt]を両方同時押し

Sikuli - ObserveEventクラスに関するメソッド一覧

Sikuliのイベントコールバック関数では、引数にObserveEventオブジェクトが渡されます。

ObserveEventクラスのインスタンスメソッド一覧は次の通りです。

ObserveEventクラスのインスタンスメソッド一覧

メソッド 説明
getType() イベントの種類。APPEAR、VANISH、CHANGE、GENERIC、FINDFAILED、MISSINGのいずれかが返る。
isAppear() getType()のイベント種類を確認するメソッド。
isVanish() getType()のイベント種類を確認するメソッド。
isGeneric() getType()のイベント種類を確認するメソッド。
isFindFailed() getType()のイベント種類を確認するメソッド。
isMissing() getType()のイベント種類を確認するメソッド。
getRegion() イベント対象となったRegionオブジェクト。
getPattern イベント対象となったPatternオブジェクト。
getImage() イベント対象の画像。
getMatch() イベント対象のMatchオブジェクト。
getChanges() 変化した場所を示すMatchオブジェクトのリスト。
getCount() コールバック関数が呼び出された回数。
getTime() イベントの発生時間。(エポック秒)
repeat(waitTime) 指定した時間だけ、イベントが発生してもコールバック関数が呼び出されないようにする。
getResponse() FINDFAILEDやMISSINGであるとき、その後どうするかを示した値。PROMPT、RETRY、SKIP、ABORTのいずれか。
setResponse() コールバック関数からの戻り値をPROMPT、RETRY、SKIP、ABORTのいずれかに設定する。
getName() イベントの名前。
stopObserver() イベントオブサーバを停止する。

【関連記事】
Sikuli - 為替レートの変化を常時監視
Sikuli - イベント処理
Sikuli - 監視・イベントに関するメソッド一覧

Sikuli - 監視・イベントに関するメソッド一覧

Sikuliでは監視を行うことで、画像が見つかったときや消えたとき、変化したときにイベントを発生させコールバック関数を呼び出すことができます。

監視・イベントに関数するメソッドは下記の通りです。
(PSはPatternオブジェクト、Stringオブジェクトを表します。)

監視・イベントのメソッド一覧

メソッド 説明
onAppear(PS, handler) PSが見つかったときに呼び出すhandlerを設定する。
onVanish(PS, handler) PSが消えたときに呼び出すhandlerを設定する。
onChange(minChangedSize, handler) 領域内の画像がminChangedSize以上変わったときに呼び出すhandlerを設定する。
observe(seconds) 領域内の画像監視をseconds秒行う。監視中、処理は停止する。
observeInBackground(seconds) 上記と同じだが、バックグラウンドで処理を行うため処理は停止しない。
stopObserver() 監視を停止する。
hasObserver() 監視を設定しているかどうか。
isObserver() 監視中かどうか。
hasEvents() 監視のイベントが発生したかどうか。
getEvents() イベントに関するObserveEventオブジェクトを取得する。
getEvent(name) イベントに関する引数に渡された情報を取得する。
setInactive(name) 監視を指定した名称で一時停止する。
setActive(name) 監視を再開する。

【関連記事】
Sikuli - 為替レートの変化を常時監視
Sikuli - イベント処理

Sikuli - 画像マッチングメソッド一覧

Sikuliでは画像マッチングで処理を行うのが基本となります。
そのため画像マッチングに関するメソッドを一通り把握しておくのはとても重要です。

画像マッチングのメソッド一覧は下記の通りです。
(PSはPatternオブジェクト、Stringオブジェクトを表します。)

画像マッチングのメソッド一覧

メソッド 説明
find(PS) 領域内から、最も類似度が高い部分をMatchオブジェクトとして返す。
findAll(PS) 領域内から、合致する全ての部分をMatchオブジェクトのリストとして返す。
wait(PS, seconds) PSが登場するまでseconds秒待つ。
watiVanish(PS, seconds) PSが消えるまでseconds秒待つ。
exists(PS, seconds) 画像が存在するかどうかを調べる。seconds秒待ち、見つからない場合は例外を発生する。
has(PS, seconds) existsと同じだが、見つからないときに例外を発生しない。
findBest(PS, PS, …) 複数の画像マッチ条件を引数に設定し、もっとも類似度が高いものを返す。
findBestList(ListPS) 上記と同じ動作をするが、引数をリストとして渡す。
findAny(PS, PS, …) 複数の画像マッチ条件を引数に設定し、条件を満たすものを全て返す。
findAny(ListPS) 上記と同じ動作をするが、引数をリストとして渡す。
setImageMissingHandler
(function_name)
画像が存在しなかった時に実行するコールバック関数を設定する。
setFindFailedResponse
(ABOART|SKIP|PROMPT|RETRY)
画像が見つからなかった時にどうするかを設定する。
 ABORT:処理を終了する。
 SKIP:処理をスキップする。
 RETRY:リトライする。
 PROMPT:ダイアログボックスを表示しユーザに選択させる。
setFindFailedHandler(function_name) 画像が見つからなかったときに実行するコールバック関数を設定する。
getFindFailedResponse setFindFailedResponseの現在の値を返す。
setThrowException(False|True) 画像が見つからなかった時に例外を発生するかどうかを設定する。

Sikuli - Appクラスのメソッド

SikuliのAppクラスを使うと、アプリケーションの起動やフォーカスの設定、ウィンドウを閉じるなどの操作を行うことができます。

Appクラスの静的メソッド(インスタンスを生成しないで使用できるメソッド)とインスタンスメソッド(インスタンスを作ってから使用できるメソッド)は下記の通りです。

(1) Appクラスの静的メソッド

メソッド 説明
open(appName)
open(appName, waitTime)
appNameで指定されたアプリを起動し、waitTime秒(デフォルトは1秒)待つ。
appNameがすでに起動中のときは、2重起動しないで前面に表示する。
返値として、そのアプリのAppインスタンスを返す。
close(appName) appNameのアプリを閉じる。
正常に閉じられた場合はTrue、失敗したときはFalseを返す。
focus(title)
focus(title, index)
指定したtitleを持つindex番目のアプリを前面に表示し、フォーカスを設定する。
返値として、そのアプリのAppインスタンスを返す。
focusedWindow() フォーカスされているウィンドウのRegionオブジェクトを返す。
openLink(url) urlを開く。
run(cmd) cmdで指定された実行形式ファイルを実行する。
getClipboard() クリップボードに設定されている文字列を取得する。
setClipboard(text) クリップボードにtextを設定する。

(2) Appクラスのインスタンスメソッド

メソッド 説明
open()
open(waitTime)
アプリを開く。
すでに開かれているときは、それを前面に表示しフォーカスを設定する。
close()
close(waitTime)
アプリを閉じる。閉じるまで最大waitTime秒(デフォルト10秒)待つ。
異常終了とされることがあるのでcloseByKeyメソッドを使う方がおすすめ。
closeByKey()
closeByKey(waitTime)
ウィンドウを閉じるためのキーを送信することで、アプリを閉じる。
閉じるまで最大waitTime秒(デフォルト10秒)待つ。
focus() 前面に表示し、フォーカスを設定する。
hasFocus() フォーカスが設定されているかどうかを返す。
window()
window(winNum)
winNum番目(省略したときは先頭)のウィンドウを示すRegionオブジェクトを返す。
isValid() アプリケーションが有効かどうかを返す。
isRunning() 実行中かどうかを返す。
hasWindow() ウィンドウを持っているかどうかを返す。
getWindow() ウィンドウタイトルを得る。
getPID() プロセスIDを得る。
getName() アプリ名を得る。

Sikuli - APPクラスを使って各ブラウザを起動して閉じる

SikuliのAppクラスからインスタンスを作るとフォーカスをあてたり、ウィンドウタイトルを取得できたり、プロセスIDを取得できたり意外と便利です。
ただインスタンスを作るときの引数[アプリケーション名]に何を指定すべきか迷ったのでまとめてみました。

まず起動するときに指定すべきアプリケーション名は「ファイル名を指定して実行」で起動できるものであればいいみたいでした。
各ブラウザーで例えると下記のようになります。

  • Microsoft Edgeの場合 ⇒ microsoft-edge:
  • インターネットエクスプローラの場合 ⇒ iexplore
  • Chromeブラウザの場合 ⇒ chrome
  • Firefoxブラウザの場合 ⇒ Firefox
  • Operaブラウザの場合 ⇒ opera

Appコンストラクタの返値としては、Appインスタンスが返ってきます。
そのインスタンスを使っていろいろ操作できるはずなんですが、Microsoft Edgeだけは操作することができず一旦’Edge’という引数でAppクラスのインスタンスを作り直せば操作できるようになります。

上記5つのブラウザをそれぞれ起動して閉じる操作を行っているソースと動画がありますのでご参照ください。

ソース



今回の検証でAppインスタンスの作り方として分かったことをまとめます。

  • 「ファイル名を指定して実行」で起動できるアプリケーションであればコンストラクタの引数としてOK。
    ただMicosoft Edgeのように起動はできるが、その後Appインスタンスとして操作ができないことがある。
  • 起動しているアプリケーションであれば「タイトルバー」に表示されている一部文字列をコンストラクタの引数として指定すると有効なAppインスタンスすることができる。
    (Microsoft Edgeはこのやり方で、起動後の操作をすることが可能。)
  • exeまでのフルパスを指定してAppインスタンスを作りアプリ起動することも可能だが、返ってきたAppインスタンスを使って操作することはできない。
    (タイトルバーにexeまでのフルパスが表示されていないことが原因のような気もする。)

明確に検証できたわけではありませんが、上記3点を踏まえるとSikuliのAppインスタンスを使った操作をすることがほとんど可能になるので、今回はこれでよしとしたいと思います。

Sikuli - データを変更して複数PDFを出力する

表形式のデータを変更してPDFを出力する処理を行います。

1つや2つのPDFを出力するのであれば、手動でも問題ありませんが出力するPDFがたくさんになるほど、とても退屈なルーチンワークとなります。

この作業をSikuliを使って自動化してみます。
(Excelがインストールされていないので表形式ソフトとしてLibreo Officeを使います。)

今回のSikuliの処理フローは下記の通りです。

 (1) Libreo上のデータを書き換えます。
 (2) メニューからPDF出力を選択します。
 (3) ファイル名を指定してPDF保存を行います。

 (1)から(3)の処理をデータ数分繰り返します。繰り返すデータはSikuliソース上にリスト型(の中に辞書データ)として定義しています。

ソース


下記の動画では、Sikuliで自動的にPDFファイルを3つ出力し、後半は手動で出力したPDFファイルを開いてデータが変わっていることを確認しています。


Sikuli - wordpressに自動投稿

Sikuliを使ってwordpressに自動投稿してみます。

処理はとても簡単で、まずブラウザを起動してwordpressの新規投稿ページに移動します。
(wordpressにはログイン状態になっている状態です。)

新規投稿ページではタイトルと記事を入力して、カテゴリーを選択し投稿(Publish)ボタンを押して投稿完了です。

ちゃんと投稿できているかどうか確認するために最後に投稿を表示しています。

ソース



ログイン処理をせずに単純に記事を投稿するだけだと、とても簡単に実装できました。

これまでにSikuliを使っていくつか実装しましたが、これらを組み合わせれば「FXで自動的に売買を行い、その内容をtwitterやwordpressに自動的に投稿する」といった作業がRPAだけで行えるようになります。

Sikuli - twitterに自動つぶやき

Sikuliを使ってtwitterに自動的でつぶやいてみます。

基本的なメソッドだけを使っていて、次のようなフローで処理しています。

 (1)ブラウザ起動
 (2)ログイン
 (3)つぶやく
 (4)ログアウト
 (5)ブラウザ落とす

下記ソースと動画を参考にして頂ければと思います。

ソース1


ソース2



twitterのAPIを使えば、GUI操作なしでも自動でつぶやくことはできると思いますが、APIキーを取得したりAPIの仕様を確認したりする必要がありますので、全体的な労力を考えるとGUIで操作を自動化する方が楽に実装できるかなと感じます。
APIを用意していないサービスでも自動化可能なので、汎用性も高いかと。。