クリック位置をブレさせることやタイミングを変える関数作りましたので周回用スクリプトをアップデートしました。細かい説明は以下参照。
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)
お世話になっております。
返信削除noxとかで複数のウインドウを出しているとreg.findAnyList(IMGS) でエラーが出るのでr=で範囲指定したのですがそれもエラーになりました。何か悪かったでしょうか?
あと質問したいことが・・・
返信削除img[]に入れた画像毎にタブルクリックとか遅延とかの設定は出来ないでしょうか?
reg.findAnyList(IMGS) を
返信削除findAnyList(IMGS) とすることで動く可能性があります。regをつけないと画面全体が検索対象になります。その分パワーを使いますが。
見つかった画像で処理を変えたい場合は以下が参考になるかと。
SikuliX findAnyListで見つかった画像を判別する
https://taidadesu.blogspot.com/2020/09/sikurix-findanylist.html
こんな感じで、indexが0、IMGで最初の画像の場合は、ダブルクリックするように変更できます。
1番目はクリック、それ以外はtap_s関数実行になります。
for m in ms:
if m.getIndex() == 0:
m.doubleClick()
elif m.getIndex() == 1:
m.click()
else:
# クリック
tap_s(m)
# 最初に見つかったものだけ処理して終了
break
ありがとうございます。
返信削除imgの横にコードを直接入れるのは出来ないんですね。
何番目かを数えて下記に入れる感じなんですね。
findAnyList(IMGS)にして、r=範囲指定のキャプチャ
を入れることで同じくらいの処理速度になりそうでしょうか?
[error] RobotDesktop: checkMousePosition: should be L[2116,709]@S(1) - but is not!
返信削除Possible cause in case you did not touch the mouse while script was running:
Mouse actions are blocked generally or by the frontmost application.
You might try to run the SikuliX stuff as admin
このエラーが出るようになりクリックしなくなりましたどうすればいいですか?