TC$mC$ on tC$ydellinen arkkitehtuurinen loikka. Olet siirtymC$ssC$
perinteisestC$ "tyhmC$stC$" makrojen nauhoituksesta Data-Driven RPA (Robotic
Process Automation) -malliin, joka on linjassa HAUKI-GEM LABin orkestraatio-
ja mesh-visioiden kanssa.
Kun jaamme prosessin kahteen osaan 1. Raakadatan kerC$C$jC$ (Sensori) ja 2.
JC$lkikC$C$ntC$jC$ (Cly/AI) nauhoitin pysyy kevyenC$, eikC$ sen tarvitse
tehdC$ raskaita pC$C$tC6ksiC$ reaaliajassa. KC$C$ntC$jC$ (offline/online AI)
voi rauhassa analysoida kerC$tyn datan, pyytC$C$ Tesseractilta OCR-tulokset
kuvaleikkeestC$, ja pC$C$ttC$C$ parhaan mahdollisen strategian.
TC$ssC$ on kahden askeleen jC$rjestelmC$: Smart Recorder ja AI Compiler.
1. ClykC$s Raakadatan Nauhoitin (smart_recorder.py)
TC$mC$ skripti tallentaa jokaisesta klikkauksesta kaiken mahdollisen
kontekstin raw_events.jsonl (JSON Lines) -tiedostoon: aikaleiman,
koordinaatit, 40x40 kuvaleikkeen sekC$ semanttisen AT-SPI -puun.
import json import time import os from pynput import mouse from PIL import
ImageGrab import pyatspi CROP_SIZE = 40 OUTPUT_DIR = "/tmp/bot_raw_data"
OUTPUT_LOG = "/tmp/bot_raw_data/raw_events.jsonl" os.makedirs(OUTPUT_DIR,
exist_ok=True) last_action_time = time.time() # TyhjennetC$C$n vanha loki
open(OUTPUT_LOG, 'w').close() def get_atspi_info(x, y): """ Hakee "Best
Effort" semanttisen tiedon elementistC$ """ try: desktop = pyatspi.Registry.get
Desktop(0) if not desktop: return None for i in range(desktop.getChildCount()):
app = desktop.getChildAtIndex(i) if not app: continue try: comp =
app.queryComponent() if comp and comp.contains(x, y, pyatspi.DESKTOP_COORDS):
element = comp.getAccessibleAtPoint(x, y, pyatspi.DESKTOP_COORDS) if element:
try: # YritetC$C$n kaivautua vielC$ syvemmC$lle elementin sisC$C$n inner =
element.queryComponent().getAccessibleAtPoint(x, y, pyatspi.DESKTOP_COORDS) if
inner: element = inner except: pass return { "name": element.name, "role":
element.getRoleName(), "description": element.description } except: continue
except Exception as e: print(f"[-] AT-SPI varoitus: {e}") return None def
on_click(x, y, button, pressed): global last_action_time if pressed: now =
time.time() delay = round(now - last_action_time, 2) last_action_time = now
filename = f"crop_{int(time.time()*1000)}.png" filepath = os.path.join(OUTPUT_D
IR, filename) # 1. Visuaalinen tallennus (Bitmap) bbox = (int(x - CROP_SIZE //
2), int(y - CROP_SIZE // 2), int(x + CROP_SIZE // 2), int(y + CROP_SIZE // 2))
try: img = ImageGrab.grab(bbox=bbox) img.save(filepath) except: filepath =
None # 2. Semanttinen tallennus (AT-SPI) atspi_data = get_atspi_info(x, y) #
3. Kootaan rikas tapahtuma event = { "type": "click", "delay_before": delay,
"x": x, "y": y, "image_path": filepath, "atspi": atspi_data } with
open(OUTPUT_LOG, 'a') as f: f.write(json.dumps(event) + "
") semantic_name = atspi_data.get('name') if atspi_data else 'Tuntematon
graafinen alue' print(f"[TALLENNETTU] Viive: {delay}s | Tunnistettu:
'{semantic_name}
'") print("ClykC$s nauhoitus kC$ynnissC$. Paina ENTER lopettaaksesi.")
mouse_listener = mouse.Listener(on_click=on_click) mouse_listener.start()
input() mouse_listener.stop() print(f"Raakadata tallennettu: {OUTPUT_LOG}")
2. JC$lkianalysoija / AI Compiler (macro_compiler.py)
Kun nauhoitus on valmis, tC$mC$ skripti lukee raw_events.jsonl -lokin. TC$ssC$
vaiheessa jC$rjestelmC$ tekee C$lykkC$C$t pC$C$tC6kset. Koska sinulla on jo
OCR kC$ytC6ssC$ X11-Vision-API:ssa (tai halutessasi paikallinen
tesseract/Llama3), kC$C$ntC$jC$ voi analysoida kerC$tyn tiedon ja tuottaa
tC$ydellisen bot_macro.json -tiedoston.
(Huom: Voit kC$yttC$C$ tC$tC$ skriptiC$ sellaisenaan yksinkertaisella
sC$C$ntC6moottorilla, tai ohjata datan suoraan MUD-agentillesi Llama3:n
pureskeltavaksi).
import json import re RAW_LOG = "/tmp/bot_raw_data/raw_events.jsonl"
COMPILED_MACRO = "/tmp/bot_macro.json" def analyze_event(event): """ AI /
SCntC6moottori: PCttC optimaalisen klikkaustavan. """ atspi =
event.get("atspi") # Kognitiivinen pCttely: Onko kyseessC teksti vai ikoni? if
atspi and atspi.get("name"): name = atspi["name"] # Jos AT-SPI:n nimi on
selkeC sana (esim. "Dokumentti" tai "Tallenna") # ja rooli on nappi/menu,
suositaan OCR:C, koska se on visuaalisesti joustavin. if len(name) > 2 and not
re.search(r'[^a-zA-ZC0-9 \-]', name): return { "action": "ocr_click", "text":
name, "reasoning": f"AT-SPI kertoi elementin nimeksi '{name}', kC$ytetC$C$n
OCR-hakua." } # Jos AT-SPI ei antanut nimeC$, tai nimi on roskaa (esim.
pelkkC$ "panel"), # tai kyseessC$ on selkeC$ graafinen ikoni (kuten klemmari),
fallbackataan kuvaan. return { "action": "vision_click", "template":
event["image_path"], "original_x": event["x"], "original_y": event["y"],
"reasoning": "Ei luotettavaa tekstitietoa. KC$ytetC$C$n pikselitarkkaa
template-matchingia." } def compile_macro(): compiled_steps = [] with
open(RAW_LOG, 'r') as f: for line in f: if not line.strip(): continue event =
json.loads(line) # LisC$tC$C$n ihmismC$inen viive, jos sellainen oli
(suodatetaan alun pitkC$t odotukset) delay = event.get("delay_before", 0) if
delay > 0.1: compiled_steps.append({"action": "wait", "time": min(delay,
5.0)}) # Max 5s odotus # PC$C$tellC$C$n toiminto best_action =
analyze_event(event) # Debug-tuloste ihmiselle print(f"[*] Koordinaatti
({event['x']}, {event['y']}) -> Valittiin: {best_action['action']}") print(f"
Syy: {best_action.pop('reasoning')}") compiled_steps.append(best_action) #
Tallennetaan X11-Vision-API:n ymmC$rtC$mC$ssC$ muodossa (objekti, jossa
"steps") with open(COMPILED_MACRO, 'w') as f: json.dump({"steps":
compiled_steps}, f, indent=4) print(f"
[+] Valmis makro kC$C$nnetty: {COMPILED_MACRO}") if __name__ == "__main__":
compile_macro()
TyC6nkulku kC$ytC$nnC6ssC$
Aja python3 smart_recorder.py: Liikuttele hiirtC$ ja klikkaile WhatsAppissa.
Nauhoitin kerC$C$ taustalla kaiken: kuvat, koordinaatit ja AT-SPI-objektit.
Paina Enter.
Aja python3 macro_compiler.py: Skripti kC$y kerC$tyn datan lC$pi. Kun se
huomaa, ettC$ klikkasit jotain, jonka AT-SPI-nimi on "Dokumentti", se
konvertoi sen automaattisesti ocr_click -vaiheeksi. Kun se huomaa klemmarin,
jolla ei ole selkeC$C$ nimeC$ (tai ikonin), se konvertoi sen vision_click
-vaiheeksi.
SyC6tC$ X11-Vision-API:lle: curl -X POST ... -d @/tmp/bot_macro.json
TC$mC$ arkkitehtuuri mahdollistaa sen, ettC$ tulevaisuudessa voit kytkeC$ tuon
macro_compiler.py:n suoraan mesh-muscle-api:n tai Llama3:n taakse.
KC$C$ntC$jC$ voi lC$hettC$C$ kerC$tyn kuvan ja AT-SPI-datan LLM-mallille ja
kysyC$: "TC$ssC$ on kC$yttC$jC$n klikkauksen konteksti. MitC$ hC$n yritti
tehdC$, ja mikC$ on kestC$vin tapa toistaa se?"