Toteutetaan makrotallennin, joka sitoo pynput-kirjaston kuuntelijat
nC$ytC6nkaappaukseen. Joka kerta kun hiirtC$ klikataan, skripti tallentaa
ympC$rC6ivC$n alueen (esim. 60x60 pikseliC$) kuvatiedostoksi ja kirjaa
tapahtuman JSON-taulukkoon. TC$mC$ JSON-taulukko on suoraan yhteensopiva
olemassa olevan X11-Vision-APIn meta_run-moottorisi kanssa.
Tarvitset pynput- ja mss-kirjastot (toimii erittC$in nopeasti
X11-ympC$ristC6ssC$):
pip install pynput mss
Makrotallennin: bot_recorder.py
import json
import time
import os
from pynput import mouse, keyboard
from mss import mss
# Asetukset
CROP_SIZE = 60 # Kaapattavan alueen leveys ja korkeus pikseleinC$
OUTPUT_DIR = "/tmp/bot_templates"
OUTPUT_JSON = "/tmp/bot_macro.json"
os.makedirs(OUTPUT_DIR, exist_ok=True)
sct = mss()
actions = []
last_action_time = time.time()
def add_wait_action():
"""Laskee viiveen edellisestC$ tapahtumasta ja lisC$C$ wait-askeleen."""
global last_action_time
now = time.time()
delay = round(now - last_action_time, 2)
if delay > 0.1:
actions.append({"action": "wait", "time": delay})
last_action_time = now
def on_click(x, y, button, pressed):
if pressed:
add_wait_action()
# MC$C$ritetC$C$n bounding box hiiren ympC$rille
monitor = {
"top": int(y - CROP_SIZE // 2),
"left": int(x - CROP_SIZE // 2),
"width": CROP_SIZE,
"height": CROP_SIZE
}
filename = f"template_{int(time.time()*100)}.png"
filepath = os.path.join(OUTPUT_DIR, filename)
# Ota kuva ja tallenna
sct_img = sct.grab(monitor)
mss.tools.to_png(sct_img.rgb, sct_img.size, output=filepath)
print(f"[KLIKKAUS] Tallennettu: {filepath} koordinaateissa ({x},
{y})")
actions.append({
"action": "vision_click",
"template": filepath,
"original_x": x,
"original_y": y
})
def on_press(key):
add_wait_action()
try:
char = key.char
if char:
print(f"[KIRJAIMET] Tyyppi: {char}")
actions.append({"action": "type", "text": char})
except AttributeError:
# ErikoisnC$ppC$imet (esim. enter, tab)
key_name = str(key).replace("Key.", "")
# PysC$ytysmekanismi: ESC lopettaa nauhoituksen
if key == keyboard.Key.esc:
print("
[Lopetetaan nauhoitus...]")
with open(OUTPUT_JSON, 'w') as f:
json.dump(actions, f, indent=4)
print(f"Botin ohjelma tallennettu: {OUTPUT_JSON}")
# PysC$ytetC$C$n kuuntelijat
mouse_listener.stop()
return False
print(f"[NCPPCIN] Painettu: {key_name}")
actions.append({"action": "key", "key": key_name})
print("Aloitetaan nauhoitus. Tee haluamasi toiminnot.")
print("PAINA ESC LOPETTAAKSESI JA TALLENTAAKSESI BOTIN OHJELMAN.")
# KC$ynnistetC$C$n kuuntelijat
mouse_listener = mouse.Listener(on_click=on_click)
mouse_listener.start()
with keyboard.Listener(on_press=on_press) as keyboard_listener:
keyboard_listener.join()
Miten tC$mC$ integroituu arkkitehtuuriisi
* Visuaalinen ankkurointi: Skripti ei tallenna pelkkiC$ hard_click
-koordinaatteja, vaan luo suoraan vision_click -tapahtumia. Kun ajat JSONin
meta_run -moottorissa, botti etsii ruudulta /tmp/bot_templates/ -kansiossa
olevan kuvaleikkeen (OpenCV-templatella) ja klikkaa sitC$, vaikka ikkuna olisi
siirtynyt.
* Dynaamiset viiveet: Koodi laskee todellisen ajan (wait), joka kuluu
klikkausten ja nC$ppC$inpainallusten vC$lillC$, jotta botin toisto vastaa
ihmisen nopeutta.
* Ketjuttaminen tekstinsyC6ttC6C6n: Tavalliset merkit menevC$t type-komentona
(jolloin API voi syC6ttC$C$ ne xdotool type -komennolla) ja erikoismerkit
(kuten Enter tai Tab) tallentuvat key-komentona.
TC$mC$ tuottaa suoraan valmiin JSON-rakenteen, jonka voit syC6ttC$C$ portissa
7711 pyC6rivC$lle X11-Vision-API:lle. Voidaanko tC$hC$n lisC$tC$ OCR-tunnistus
(jolloin kuvaleikkeen ottamisen lisC$ksi alueelta luetaan teksti Tesseractilla
fallbackia varten), vai riittC$C$kC6 pelkkC$ pikselikohtainen
templatetunnistus?