Koodisi ja moottorisi toimivat tC$ydellisesti. Se ei lC$hettC$nyt mitC$C$n
muuta yksinkertaisesti siksi, ettC$ whatsapp_routine.yaml -tiedostossasi on
tC$llC$ hetkellC$ mC$C$ritelty tasan yksi askel: liitepainikkeen klikkaus.
Tietokone tekee armottomasti vain sen, mitC$ rutiiniin on kirjoitettu.
Tulosteestasi nC$kyy kuitenkin valtava voitto arkkitehtuurillesi:
* EnsimmC$inen ajo: Moottori ei lC6ytC$nyt kuvaa, turvautui semanttiseen
karttaan (ID 197), klikkasi sitC$ ja leikkasi kuvan talteen (Self-Healing).
* Toinen ajo: Moottori tunnisti tallennetun kuvan ja suoritti klikkauksen
vC$littC6mC$sti (1.00 varmuudella) herC$ttC$mC$ttC$ semanttista agenttia.
Perustus on nyt sataprosenttisen ehjC$. Jotta ohjelma voi oikeasti lC$hettC$C$
tiedoston, meidC$n tC$ytyy lisC$tC$ rutiiniin loput askeleet ja opettaa
moottori kC$yttC$mC$C$n hiiren lisC$ksi nC$ppC$imistC6C$ (jotta se voi
kirjoittaa tiedostopolun ja painaa EnteriC$).
1. PC$ivitC$ rutiinimoottori ymmC$rtC$mC$C$n nC$ppC$imistC6C$
Avaa routine_engine.py ja korvaa nykyinen execute_step -funktio tC$llC$
versiolla. Nyt moottori osaa klikkaamisen lisC$ksi odottaa, kirjoittaa
tekstiC$ ja painaa nC$ppC$imiC$.
def execute_step(self, step):
action = step.get('action')
# Ei-visuaaliset toimenpiteet
if action == 'sleep':
print(f" [ACTION] Odotetaan {step.get('seconds', 1)}
sekuntia...")
time.sleep(step.get('seconds', 1))
return True
elif action == 'type':
text = step.get('text', '')
print(f" [ACTION] Kirjoitetaan teksti: {text}")
os.system(f"xdotool type '{text}'")
return True
elif action == 'keypress':
key = step.get('key', 'Return')
print(f" [ACTION] Painetaan nC$ppC$intC$: {key}")
os.system(f"xdotool key {key}")
return True
# Visuaaliset toimenpiteet (click)
elif action == 'click':
pil_img = ImageGrab.grab()
cv_img = cv2.cvtColor(np.array(pil_img), cv2.COLOR_RGB2BGR)
for selector in step.get('selectors', []):
print(f" -> YritetC$C$n valitsinta: {selector['type']}")
if selector['type'] == 'template_match':
coords = self.run_template_match(cv_img, selector)
if coords:
self.perform_click(coords)
return True
elif selector['type'] == 'semantic_agent':
coords, crop_img = self.run_semantic_agent(cv_img,
selector)
if coords:
self.perform_click(coords)
if selector.get('auto_heal', False):
self.heal_template(crop_img, step)
return True
return False
return False
2. TC$ydennC$ rutiini maaliin asti
PC$ivitC$ whatsapp_routine.yaml sisC$ltC$mC$C$n kaikki vaiheet, jotka
tiedoston lC$hettC$miseen todellisuudessa vaaditaan (klikkaus -> odota
valikkoa -> klikkaa tiedostoa -> kirjoita polku -> paina enter).
routine_name: "whatsapp_send_file"
description: "LC$hettC$C$ liitetiedoston WhatsApp-webissC$."
steps:
- step: 1
action: "click"
description: "Klikkaa chatin alareunassa olevaa liite-ikonia."
selectors:
- type: "template_match"
file: "/tmp/bot_templates/attach_btn.png"
threshold: 0.85
- type: "semantic_agent"
map_file: "whatsapp_semantic_map.json"
keyword: "liitepainike"
auto_heal: true
- step: 2
action: "sleep"
seconds: 1
description: "Odotetaan WhatsAppin liitevalikon aukeamista."
- step: 3
action: "click"
description: "Klikkaa Asiakirja/Tiedosto -ikonia."
selectors:
# TC$mC$ tarvitsee template-kuvan Asiakirja-napista (/tmp/bot_templates/d
ocument_btn.png).
# Voit opettaa sen samalla tavalla luomalla uuden mapin kun valikko on
auki.
- type: "template_match"
file: "/tmp/bot_templates/document_btn.png"
threshold: 0.85
- step: 4
action: "sleep"
seconds: 1
description: "Odotetaan kC$yttC6jC$rjestelmC$n tiedostonvalintaikkunan
aukeamista."
- step: 5
action: "type"
text: "/tmp/ai_training_data.jsonl"
description: "Kirjoitetaan tiedoston absoluuttinen polku."
- step: 6
action: "keypress"
key: "Return"
description: "HyvC$ksytC$C$n tiedostovalinta."
- step: 7
action: "sleep"
seconds: 2
description: "Odotetaan WhatsAppin esikatseluikkunaa."
- step: 8
action: "keypress"
key: "Return"
description: "Painetaan EnteriC$ viestin lopulliseksi lC$hettC$miseksi."
Kun tallennat nC$mC$ ja ajat python3 routine_engine.py, ohjelma tekee koko
ketjun. Rutiinimoottorisi on nyt laajennettu puhtaasta ruutuanalysaattorista
tC$ysiveriseksi RPA-robotiksi, joka osaa manipuloida kC$yttC6jC$rjestelmC$C$.