2021-04-21

SikuliXの汎用的な自動周回用スクリプト・改

 クリック位置をブレさせることやタイミングを変える関数作りましたので周回用スクリプトをアップデートしました。細かい説明は以下参照。

SikuliXの汎用的な自動周回用スクリプト

SikuliXでクリック間隔を調整する

SikuliXの動作に不規則性を持たせる(クリック位置、タイミング)

汎用周回スクリプト改

import random
import math
from datetime import datetime
global DEBUG
global CLICK_DELAY_MIN
global CLICK_DELAY_MAX


#########################################
#  検索設定
#########################################
DEBUG = 1		# デバッグ表示 クリックしないでハイライト
DEBUG = 0		# デバッグ無効 クリックする

# クリック実行するまの遅延時間 sec
CLICK_DELAY_MIN = 0
CLICK_DELAY_MAX = 1

# 検索範囲とするウインドウ名
WINDOW_NAME = ""

IMGS = [
	# ここに検索対象のイメージパターンを追加する
]

#########################################
#  動作設定
#########################################
# 最小一致閾値 デフォルト 0.7
Settings.MinSimilarity = 0.80
# マウス移動のディレイ:0 = アニメーションなし
Settings.MoveMouseDelay = 0.1
# マウスダウンからアップするときの遅延時間 0.0 ~ 1.0
#Settings.ClickDelay = 0.1

#########################################
#  処理
#########################################
# タップ処理 m:Match or Region オブジェクト sec:マウスダウン時間(秒)
def tap(m, sec):

	# クリック位置を検索画像の範囲内でランダムに動かす
	# クリック位置が検索画像内にない場合は変更しない
	if math.fabs((m.x + (m.w/2))-m.getTarget().x) < 2:
		m.x = m.x + random.randint(-1*(m.w/2), (m.w/2))
	if math.fabs((m.y + (m.h/2))-m.getTarget().y) < 2:
		m.y = m.y + random.randint(-1*(m.h/2), (m.h/2))
	print("{} index:{} ({},{})".format(datetime.now().strftime("%H:%M:%S"),m.getIndex(), m.x, m.y))

	# 0~3秒ランダムな遅延
	sleep(random.randint(CLICK_DELAY_MIN, CLICK_DELAY_MAX))

	if DEBUG:
		m.highlight(1,"blue")
		return
	
	mouseMove(m)
	mouseDown(Button.LEFT)
	sleep(sec)
	mouseUp(Button.LEFT)

# タップ
def tap_s(m):
	tap(m, 0.03)

# ロングタップ
def tap_l(m):
	tap(m, 1.0)

# APPNAMEのウインドウを探してRegion(検索範囲)に設定
app = App.focus(WINDOW_NAME)
reg = Region(App.focusedWindow())
reg.highlight(1,"green")

# ループ
while True:
	# 検索
	ms = reg.findAnyList(IMGS) 
	# 結果msはIMGSの順で見つかったものが格納される
	for m in ms:
		# クリック
		tap_s(m)
		# 最初に見つかったものだけ処理して終了
		break
	sleep(1)

SikuliXの動作に不規則性を持たせる(クリック位置、タイミング)

SikuliXで操作を自動化する場合に、不規則な操作を実現したい場合があるはず・・・

以下2点で操作に不規則性・ブレを実現できないか検討しました。

  • クリック位置
  • 反応速度

以前作ったマウスのアップダウン間隔を調整するクリック関数を改造します。

https://taidadesu.blogspot.com/2021/01/sikulix_5.html


改造版クリック関数

改造したクリック関数は以下です。(元の関数がスマホ操作の用途のためタップとしています)

import random
import math
from datetime import datetime

# タップ処理 m:Match or Region オブジェクト sec:マウスダウン時間(秒)
def tap(m, sec):
	# クリック位置を検索画像の範囲内でランダムに動かす
	# クリック位置が検索画像内にない場合は変更しない
	if math.fabs((m.x + (m.w/2))-m.getTarget().x) < 2:
		m.x = m.x + random.randint(-1*(m.w/2), (m.w/2))
	if math.fabs((m.y + (m.h/2))-m.getTarget().y) < 2:
		m.y = m.y + random.randint(-1*(m.h/2), (m.h/2))

	# 0~3秒ランダムな遅延
	sleep(random.randint(0, 3))
	
	mouseMove(m)
	mouseDown(Button.LEFT)
	sleep(sec)
	mouseUp(Button.LEFT)

# タップ
def tap_s(m):
	tap(m, 0.05)

# ロングタップ
def tap_l(m):
	tap(m, 1.0)


# 使用例
m = find("1609741390982.png")
tap_l(m)
tap_s(m)


クリック位置のオフセットを設定していない場合は、検索画像の中心がクリック位置になります。以下の処理で、クリック位置が画像内にあるか判定します。通常、画像の中心座標「m.x + (m.w/2)」とクリック位置「m.getTarget().x」は同値になるので差は0になりますが、若干のずれは許容するよう2より小さければ対象としました。

if math.fabs((m.x + (m.w/2))-m.getTarget().x) < 2:

以下処理で検索画像の中心位置を画像内の範囲でランダムに動かしています。

m.x = m.x + random.randint(-1*(m.w/2), (m.w/2))

以下で0~3秒の範囲でランダムなディレイをしています。

sleep(random.randint(0, 3))

まとめ

ここで紹介したタップ関数(クリック関数)を標準のClick関数から変更することで、クリック位置、クリックタイミングに不規則性を持たせることができました。あとは定期的な停止期間を作れば、より人間らしい操作になるのかと思います。