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関数から変更することで、クリック位置、クリックタイミングに不規則性を持たせることができました。あとは定期的な停止期間を作れば、より人間らしい操作になるのかと思います。
0 件のコメント:
コメントを投稿