Download Game! Currently 85 players. Last logged in:NatwUwinBullwinIberiamssp

Blitzer's Blog >> 72631

Back to blogs index
Posted: 20 Sep 2026 20:29 [ permalink ]
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$.